{"version":3,"file":"chunk.6337.75b177fb4110c65a2e58.js","names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","__spreadArray","to","from","pack","ar","l","slice","concat","memoize","fn","options","cache","cacheDefault","serializer","serializerDefault","strategy","strategyDefault","monadic","arg","value","cacheKey","computedValue","get","set","variadic","args","assemble","context","serialize","bind","SuppressedError","JSON","stringify","ObjectWithoutPrototypeCache","key","ErrorKind","TYPE","SKELETON_TYPE","strategies","isLiteralElement","el","type","literal","isArgumentElement","argument","isNumberElement","number","isDateElement","date","isTimeElement","time","isSelectElement","select","isPluralElement","plural","isPoundElement","pound","isTagElement","tag","isNumberSkeleton","isDateTimeSkeleton","dateTime","EXPECT_ARGUMENT_CLOSING_BRACE","EMPTY_ARGUMENT","MALFORMED_ARGUMENT","EXPECT_ARGUMENT_TYPE","INVALID_ARGUMENT_TYPE","EXPECT_ARGUMENT_STYLE","INVALID_NUMBER_SKELETON","INVALID_DATE_TIME_SKELETON","EXPECT_NUMBER_SKELETON","EXPECT_DATE_TIME_SKELETON","UNCLOSED_QUOTE_IN_ARGUMENT_STYLE","EXPECT_SELECT_ARGUMENT_OPTIONS","EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE","INVALID_PLURAL_ARGUMENT_OFFSET_VALUE","EXPECT_SELECT_ARGUMENT_SELECTOR","EXPECT_PLURAL_ARGUMENT_SELECTOR","EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT","EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT","INVALID_PLURAL_ARGUMENT_SELECTOR","DUPLICATE_PLURAL_ARGUMENT_SELECTOR","DUPLICATE_SELECT_ARGUMENT_SELECTOR","MISSING_OTHER_CLAUSE","INVALID_TAG","INVALID_TAG_NAME","UNMATCHED_CLOSING_TAG","UNCLOSED_TAG","SPACE_SEPARATOR_REGEX","DATE_TIME_REGEX","parseDateTimeSkeleton","skeleton","result","replace","match","len","era","year","RangeError","month","day","weekday","hour12","hourCycle","hour","minute","second","timeZoneName","WHITE_SPACE_REGEX","icuUnitToEcma","unit","FRACTION_PRECISION_REGEX","SIGNIFICANT_PRECISION_REGEX","INTEGER_WIDTH_REGEX","CONCISE_INTEGER_WIDTH_REGEX","parseSignificantPrecision","str","roundingPriority","_","g1","g2","minimumSignificantDigits","maximumSignificantDigits","parseSign","signDisplay","currencySign","parseConciseScientificAndEngineeringStem","stem","notation","test","Error","minimumIntegerDigits","parseNotationOptions","opt","parseNumberSkeleton","tokens","_i","tokens_1","token","style","scale","currency","useGrouping","maximumFractionDigits","compactDisplay","reduce","all","currencyDisplay","unitDisplay","parseFloat","roundingMode","g3","g4","g5","minimumFractionDigits","trailingZeroDisplay","signOpts","conciseScientificAndEngineeringOpts","_a","timeData","AC","AD","AE","AF","AG","AI","AL","AM","AO","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CP","CR","CU","CV","CW","CX","CY","CZ","DE","DG","DJ","DK","DM","DO","DZ","EA","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GT","GU","GW","GY","HK","HN","HR","HU","IC","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TA","TC","TD","TF","TG","TH","TJ","TL","TM","TN","TO","TR","TT","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","YE","YT","ZA","ZM","ZW","getDefaultHourSymbolFromLocale","locale","undefined","hourCycles","regionTag","languageTag","language","maximize","region","SPACE_SEPARATOR_START_REGEX","RegExp","source","SPACE_SEPARATOR_END_REGEX","createLocation","start","end","hasNativeStartsWith","startsWith","hasNativeFromCodePoint","fromCodePoint","hasNativeFromEntries","fromEntries","hasNativeCodePointAt","codePointAt","hasTrimStart","trimStart","hasTrimEnd","trimEnd","isSafeInteger","Number","isFinite","Math","floor","abs","REGEX_SUPPORTS_U_AND_Y","exec","matchIdentifierAtIndex","search","position","codePoints","code","elements","fromCharCode","entries","obj","entries_1","k","v","index","size","first","charCodeAt","flag","IDENTIFIER_PREFIX_RE_1","lastIndex","c","_isWhiteSpace","_isPatternSyntax","push","ErrorCode","Parser","message","offset","line","column","ignoreTag","requiresOtherClause","shouldParseSkeletons","parse","parseMessage","nestingLevel","parentArgType","expectingCloseTag","isEOF","char","parseArgument","err","val","peek","error","clonePosition","_isAlpha","parseTag","parseLiteral","bump","location","startPosition","tagName","parseTagName","bumpSpace","bumpIf","childrenResult","children","endTagStartPosition","closingTagNameStartPosition","startOffset","_isPotentialElementNameChar","parseQuoteResult","tryParseQuote","parseUnquotedResult","tryParseUnquoted","parseLeftAngleResult","tryParseLeftAngleBracket","codepoint","ch","openingBracePosition","parseIdentifierIfPossible","parseArgumentOptions","startingPosition","endOffset","bumpTo","typeStartPosition","argType","typeEndPosition","styleAndLocation","styleStartPosition","parseSimpleArgStyleIfPossible","styleLocation","argCloseResult","tryParseArgumentClose","location_1","parseNumberSkeletonFromString","dateTimePattern","skeletonCopy","patternPos","patternChar","charAt","extraLength","hourLen","dayPeriodLen","hourChar","pattern","parsedOptions","typeEndPosition_1","identifierAndLocation","pluralOffset","tryParseDecimalInteger","optionsResult","tryParsePluralOrSelectOptions","location_2","pluralType","nestedBraces","apostrophePosition","bumpUntil","stringTokens_1","split","filter","x","stemAndOptions","options_1","e","expectCloseTag","parsedFirstIdentifier","hasOtherClause","parsedSelectors","Set","selector","selectorLocation","has","fragmentResult","add","expectNumberError","invalidNumberError","sign","hasDigits","decimal","kind","prefix","currentOffset","indexOf","targetOffset","min","nextCode","pruneLocation","els","forEach","opts","SyntaxError","originalMessage","captureLocation","MISSING_VALUE","INVALID_VALUE","MISSING_INTL_API","PART_TYPE","FormatError","_super","msg","_this","toString","InvalidValueError","variableId","keys","join","InvalidValueTypeError","MissingValueError","isFormatXMLElementFn","formatToParts","locales","formatters","formats","values","currentPluralValue","els_1","getNumberFormat","format","varName","object","getDateTimeFormat","medium","value_1","formatFn","chunks","map","isArray","other","Intl","PluralRules","rule","getPluralRules","parts","part","lastPart","createFastMemoizeCache","store","IntlErrorCode","IntlMessageFormat","overrideFormats","defaultLocale","defaultConfig","configs","formatterCache","pluralRules","ast","resolvedOptions","resolvedLocale","NumberFormat","supportedLocalesOf","getAst","resolveLocale","__parse","parseOpts","getOwnPropertySymbols","propertyIsEnumerable","c1","c2","DateTimeFormat","defineProperty","memoizedDefaultLocale","enumerable","configurable","Locale","supportedLocales","integer","percent","short","long","full","FORMAT_ERROR","UNSUPPORTED_FORMATTER","INVALID_CONFIG","MISSING_DATA","MISSING_TRANSLATION","IntlError","exception","stack","captureStackTrace","UnsupportedFormatterError","InvalidConfigError","MissingDataError","IntlFormatError","MessageFormatError","descriptor","id","defaultMessage","description","MissingTranslationError","filterProps","props","allowlist","defaults","filtered","name","DEFAULT_INTL_CONFIG","messages","timeZone","defaultFormats","fallbackOnEmptyString","onError","onWarn","warning","createIntlCache","relativeTime","list","displayNames","createFormatters","RelativeTimeFormat","ListFormat","DisplayNames","getMessageFormat","getRelativeTimeFormat","getListFormat","getDisplayNames","getNamedFormat","formatType","setTimeZoneInOptions","deepMergeOptions","opts1","opts2","deepMergeFormatsAndSetTimeZone","f1","mfFormats","formatMessage","state","messageDescriptor","defaultRichTextElements","msgId","condition","Err","toLowerCase","DATE_TIME_FORMAT_OPTIONS","getFormatter","filteredOptions","timeStyle","dateStyle","formatDate","config","_b","Date","formatTime","formatDateTimeRange","formatRange","formatDateToParts","formatTimeToParts","DISPLAY_NAMES_OPTONS","formatDisplayName","of","LIST_FORMAT_OPTIONS","now","formatList","results","formatListToParts","richValues_1","serializedValues","PLURAL_FORMAT_OPTIONS","formatPlural","RELATIVE_TIME_FORMAT_OPTIONS","formatRelativeTime","NUMBER_FORMAT_OPTIONS","formatNumber","formatNumberToParts","createIntl","resolvedConfig","$t","defineMessages","msgs","defineMessage","EventStreamContentType","LastEventId","fetchEventSource","input","signal","inputSignal","headers","inputHeaders","onopen","inputOnOpen","onmessage","onclose","onerror","openWhenHidden","fetch","inputFetch","rest","Promise","resolve","reject","curRequestController","onVisibilityChange","abort","document","hidden","accept","addEventListener","retryInterval","retryTimer","dispose","removeEventListener","window","clearTimeout","defaultOnOpen","async","AbortController","response","stream","onChunk","reader","getReader","read","done","body","onLine","buffer","fieldLength","discardTrailingNewline","arr","a","res","Uint8Array","bufLength","lineStart","lineEnd","subarray","onId","onRetry","onMessage","data","event","retry","decoder","TextDecoder","field","decode","valueOffset","parseInt","isNaN","aborted","interval","setTimeout","innerErr","contentType","definition","output","reference","base","letters","refLength","j","letLength","clean","letter","string","module","exports","define","DOM_DELTA_PIXEL","scrollLineHeight","getScrollDeltas","_ref","deltaX","deltaY","deltaMode","iframe","createElement","src","visibility","width","height","border","appendChild","iframeDocument","contentWindow","open","write","close","firstElementChild","offsetHeight","removeChild","getScrollLineHeight","calculateScrollDistribution","element","container","accumulator","scrollInformation","scrollLeft","scrollTop","scrollLeftMax","scrollWidth","clientWidth","scrollTopMax","scrollHeight","clientHeight","availableScroll","elementStyle","getComputedStyle","overflowX","overflowY","parentNode","distributeScroll","scrollInfos","info","BasicDropdownContent","Component","_this$args$dropdown","super","T","transitioningInClass","transitionedInClass","transitioningOutClass","isTouchDevice","Boolean","dropdown","uniqueId","_classPrivateFieldInitSpec","_contentWormhole","_animationClass","_defineProperty","modifier","dropdownContentWormhole","dropdownElement","_this$args$dropdown2","_this$args$dropdown3","_this$args$dropdown4","actions","registerDropdownElement","triggerElement","_this$args$dropdown5","getTriggerElement","querySelector","handleRootMouseDown","_e$composedPath","_this$args$dropdown6","target","composedPath","hasMoved","touchMoveEvent","contains","dropdownIsValidParent","dropdownId","rootEventType","getRootNode","ShadowRoot","rootElement","repositionBound","touchStartHandlerBound","scrollableAncestors","parent","nextScrollable","getScrollParent","toUpperCase","nextParent","addScrollHandling","removeGlobalEvents","removeScrollHandling","eager","then","_this$args$dropdown7","reposition","animationEnabled","waitForAnimations","animationClass","_dropdownElement$pare","parentElement","destinationElement","renderInPlace","clone","cloneNode","classList","remove","mutationObserver","MutationObserver","mutations","shouldReposition","some","record","containsRelevantMutation","addedNodes","removedNodes","observe","childList","subtree","disconnect","touchMoveHandler","touchStartHandler","destination","getElementById","_this$_contentWormhol","animationEnabledArg","positionStyles","top","left","right","noop","touchMoveHandlerBound","preventScroll","wheelHandler","_event$composedPath","deltaXNegative","deltaXPositive","deltaYNegative","deltaYPositive","preventDefault","defaultPrevented","capture","passive","addScrollEvents","removeScrollEvents","nodeList","node","nodeName","nodeValue","closestContent","callback","requestAnimationFrame","computedStyle","animationName","animationPlayState","eventCallback","closestDropdown","_closestDropdown$getA","_document$querySelect","_triggerElement$getRo","_parentDropdown$getAt","getAttribute","trigger","parentDropdown","parentAttrId","_BasicDropdownContent","g","tracked","action","setComponentTemplate","createTemplateFactory","block","moduleName","scope","or","on","hash","isStrictMode","BasicDropdownTrigger","disableDocumentTextSelect","disable","_BasicDropdownTrigger","DropdownTriggerModifier","BasicDropdownWormholeComponent","getDestinationId","utilConfig","_configSet","configEnvironment","getOwner","resolveRegistration","legacyConfigString","deprecate","for","since","enabled","available","until","_BasicDropdownWormholeComponent","UNINITIALIZED","IGNORED_STYLES","_hPosition","WeakMap","_vPosition","_top","_left","_right","_width","_height","_otherStyles","_isOpen","_renderInPlace","BasicDropdown","horizontalPosition","verticalPosition","_getDestinationId","_this$triggerElement$","disabled","newVal","_previousDisabled","schedule","publicAPI","isOpen","registerAPI","_uid","_actions","owner","M","guidFor","toggle","registerTriggerElement","onInit","willDestroy","isDestroyed","onOpen","_getTriggerElement","setAttribute","_dropdownId","skipFocus","onClose","hPosition","vPosition","previousVerticalPosition","previousHorizontalPosition","removeAttribute","tabIndex","focus","_getDropdownElement","matchTriggerWidth","positionData","calculatePosition","applyReposition","_trigger","positions","changes","otherStyles","prop","setProperty","includes","_configEnvironment$AP","_configEnvironment$AP2","APP","triggerComponent","ensureSafeComponent","contentComponent","_BasicDropdown","initiallyOpened","_config","Modifier","handleMouseEvent","handleKeyDown","handleTouchStart","handleTouchEnd","_touchMoveHandler","registerDestructor","cleanup","modify","positional","named","_named$eventType","assert","desiredEventType","eventType","stopPropagation","didSetup","setup","update","_this$dropdown","handleMouseEventBound","handleKeyDownBound","handleTouchStartBound","handleTouchEndBound","_positional","notLeftClick","button","toggleIsBeingHandledByTouchEvents","_this$dropdown2","_this$dropdown3","keyCode","_this$triggerElement","_this$triggerElement2","_this$dropdown4","_this$dropdown5","createEvent","initMouseEvent","dispatchEvent","Event","_this$triggerElement3","_this$triggerElement4","instance","_DropdownTriggerModifier","calculateWormholedPosition","content","scroll","pageXOffset","pageYOffset","triggerLeft","triggerTop","getBoundingClientRect","triggerWidth","triggerHeight","dropdownHeight","dropdownWidth","viewportWidth","innerWidth","anchorElement","host","anchorPosition","rect","offsetParent","isBodyPositionRelative","getPropertyValue","triggerLeftWithScroll","leftVisible","max","rightVisible","triggerTopWithScroll","enoughRoomBelow","innerHeight","enoughRoomAbove","calculateInPlacePosition","_destination","_ref2","dropdownRect","triggerRect","viewportRight","excludeStaticParent","overflowRegex","overflow","endEvent","moveEvent","_endEvent$changedTouc","_moveEvent$changedTou","_moveEvent$changedTou2","_moveEvent$changedTou3","_moveEvent$changedTou4","changedTouches","touchType","horizontalDistance","pageX","verticalDistance","pageY","proto","Element","vendor","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","nodeType","nodes","querySelectorAll","ios","navigator","userAgent","MSStream","ClickOutsideModifier","_destroy","cursor","exceptSelector","_init","_ref3","eventHandler","_createHandler","cancelOutsideListenerSetup","next","_addClickOutsideListener","cancel","_removeClickOutsideListener","path","isRemoved","isInside","taskHelperClosure","helperName","taskMethod","_args","task","outerArgs","_len","innerArgs","_key","pop","cancelHelper","cancelable","cancelAll","reason","helper","maybeReportError","performHelper","perform","catch","_curry","Environment","reportUncaughtRejection","defer","deferable","promise","globalDebuggingEnabled","DEFAULT_ENVIRONMENT","EMBER_ENVIRONMENT","Ember","DEBUG_TASKS","cancelableSymbol","yieldableSymbol","YIELDABLE_CONTINUE","YIELDABLE_THROW","YIELDABLE_RETURN","YIELDABLE_CANCEL","YieldableState","taskInstance","resumeIndex","_taskInstance","_resumeIndex","getTaskInstance","proceed","return","throw","Yieldable","onYield","_deferable","def","_toPromise","thinInstance","_index","resumeType","maybeDisposer","finally","AnimationFrameYieldable","timerId","cancelAnimationFrame","RawTimeoutYieldable","ms","animationFrame","forever","rawTimeout","EmberYieldable","TimeoutYieldable","later","timeout","BoundedPolicy","maxConcurrency","TYPE_CANCELLED","TYPE_STARTED","TYPE_QUEUED","STARTED","QUEUED","makeCancelState","CANCELLED","DropReducer","remainingSlots","step","DropPolicy","makeReducer","EnqueuedReducer","EnqueuedPolicy","KeepLatestReducer","numToCancel","KeepLatestPolicy","numRunning","numQueued","totalRunning","RestartableReducer","RestartablePolicy","taskFactorySymbol","propertyModifiers","restartable","setBufferPolicy","RestartableSchedulerPolicy","enqueue","EnqueueSchedulerPolicy","drop","DropSchedulerPolicy","keepLatest","KeepLatestSchedulerPolicy","setMaxConcurrency","group","taskGroupPath","setGroup","evented","setEvented","debug","setDebug","onState","setOnState","TaskProperty","TaskGroupProperty","callSuperSetup","setName","_setupEmberKVO","addPerformEvents","cancelOn","addCancelEvents","observes","addObserverKeys","setDecorator","taskComputed","cp","computed","LAST_APPLIED_TAGS","Map","Refresh","schedulerPolicy","stateTracker","taskInstances","initialTaskInstances","startingInstances","process","filterFinishedTaskInstances","reducer","finalTaskInstances","setTaskInstanceExecutionState","computeFinalStates","applyState","taskState","stateFor","executorState","executor","isFinished","onCompletion","hasStarted","desiredState","counted","onPerformed","onStart","onRunning","onQueued","taskable","guid","numPerformedInc","attrs","RefreshState","completionState","lastRunning","lastComplete","lastSuccessful","lastErrored","lastCanceled","lastIncomplete","lastPerformed","last","recurseTaskGroups","applyStateFrom","CURRENT_REFRESH_TAGS","StateTracker","states","currentTag","computeRecursiveState","forEachState","lastState","taskGroup","NULL_STATE","NullStateTracker","Scheduler","stateTrackingEnabled","cancelRequest","cancelations","guids","cancelation","onFinalize","scheduleRefresh","refresh","SchedulerRefresh","SINGLETON_REDUCER","UnboundedPolicy","DEFAULT_STATE","performCount","freeze","TASK_CANCELATION_NAME","didCancel","CANCEL_KIND_EXPLICIT","CANCEL_KIND_LIFESPAN_END","CancelRequest","finalize","guidId","Taskable","enabledModifiers","env","hasEnabledEvents","modifierOptions","onStateCallback","scheduler","cancelRequestKind","resetState","_resetState","_isAlive","setState","isRunning","isQueued","isIdle","GeneratorStepResult","errored","GeneratorState","generatorFactory","iterator","resolvedValue","iteratorMethod","getIterator","INITIAL_STATE","isSuccessful","isError","isCanceled","PERFORM_TYPE_DEFAULT","PERFORM_TYPE_UNLINKED","PERFORM_TYPE_LINKED","CANCEL_RETURN_VALUE_SENTINEL","TASK_INSTANCE_STACK","TaskInstanceExecutor","generatorState","disposers","finalizeCallbacks","proceedSync","onStarted","requestCancel","proceedWithCancelAsync","finalizeWithCancel","proceedChecked","yieldResumeType","advanceIndex","proceedAsync","handleResolvedReturnedValue","handleResolvedContinueValue","resumeValue","beforeIndex","stepResult","generatorStep","handleYieldedValue","handleYieldedUnknownThenable","thenable","yieldedValue","addDisposer","invokeYieldable","proceedWithSimpleValue","disposer","nextValue","_expectsLinkedYield","performType","console","warn","maybeResolveDefer","runFinalizeCallbacks","cb","maybeThrowUnhandledTaskErrorLater","asyncErrorsHandled","request","finalizeShared","cancelReason","formatCancelReason","debugEnabled","log","dispatchFinalizeEvents","onSuccess","onCancel","onYielded","getPerformType","detectSelfCancelLoop","parentCancelRequest","selfCancelLoopWarning","TaskLinkProxy","linkedObject","_performShared","Task","_perform","linked","unlinked","_clone","_len2","_key2","_curryArgs","_len3","_key3","fullArgs","_taskInstanceFactory","_taskInstanceOptions","_linkedObject","MODIFIER_REGISTRY","factory","groupName","registerModifier","getModifier","hasModifier","taskDefinition","Ae","UnboundedSchedulerPolicy","_processModifierOptions","createTask","getTaskOptions","createTaskGroup","TaskGroup","getOptions","getScheduler","_onStateCallback","_taskGroupPath","_schedulerPolicyClass","_maxConcurrency","_debug","_hasEnabledEvents","_enabledModifiers","policy","_hasSetBufferPolicy","_hasSetConcurrencyConstraint","setTaskDefinition","taskFromPropertyDescriptor","taskFn","params","factoryClass","TaskFactory$1","initializer","displayName","tasks","taskGroupPropertyDescriptor","_target","_descriptor","taskGroups","decoratorWithParams","descriptorFn","possibleDesc","desc","createDecorator","baseOptions","TaskFactory","userOptions","mergedOptions","createTaskDecorator","createTaskGroupDecorator","lastValue","taskName","lastInstance","EmberScheduler","once","BaseTaskInstance","parentTaskInstance","isDropped","applyTracked","initial","acc","propDesc","getOwnPropertyDescriptor","TRACKED_INITIAL_TASK_STATE","TRACKED_INITIAL_INSTANCE_STATE","INITIAL_TASK_STATE","INITIAL_INSTANCE_STATE","TaskInstance","_recomputeState","triggerEvent","getName","parentName","childName","eventNamespace","allArgs","defineProperties","TASKABLE_MIXIN","_performCount","derivedState","Task$1","isDestroying","currentTaskInstanceSymbol","EncapsulatedTask","taskObj","_encapsulatedTaskStates","_encapsulatedTaskInstanceProxies","_getEncapsulatedTaskClass","encapsulatedTaskImplClass","_encapsulatedTaskImplClass","EmberObject","unknownProperty","currentInstance","taskInstanceProxy","encapsulatedTaskImpl","setOwner","_wrappedEncapsulatedTaskInstance","proxy","Proxy","ownKeys","Reflect","TaskGroup$1","handlerCounter","registerOnPrototype","addListenerOrObserver","names","handlerName","makeTaskCallback","method","scheduleOnce","ensureArray","possibleArr","eventNames","propertyPaths","_cancelEventNames","_observes","_eventNames","addListener","addObserver","lastValue$1","dropTask","enqueueTask","keepLatestTask","restartableTask","dropTaskGroup","enqueueTaskGroup","keepLatestTaskGroup","restartableTaskGroup","taskFnOrProtoOrDecoratorOptions","isDecoratorOptions","taskDecorator","taskProperty","possibleDecoratorOptions","taskGroupDecorator","tp","possibleOptions","getPrototypeOf","taskAwareVariantOf","RSVP","identity","allSettled","race","Promise$1","getValues","hashSettled","castForPromiseHelper","castable","getItems","awaitable","awaitables","arrOrHash","items","hasCancelled","it","WaitForQueueYieldable","queueName","WaitForEventYieldable","eventName","usesDOMEvents","off","WaitForPropertyYieldable","predicateCallback","observerBound","observerFn","removeObserver","waitForQueue","waitForEvent","one","waitForProperty","ElementHelper","Helper","compute","componentClass","EmberComponent","runInDebug","writable","_initializerDefineProperty","property","_applyDecoratedDescriptor","decorators","reverse","decorator","SHIFT_KEY_MAP","A","B","C","D","E","F","G","H","I","J","K","L","N","O","P","Q","R","S","U","V","W","X","Y","Z","$","MAC_ALT_KEY_MAP","å","ç","ƒ","µ","ø","π","œ","ß","Ω","ª","º","æ","MAC_SHIFT_ALT_KEY_MAP","Å","ı","Î","Ï","Ó","ˆ","Ô","Ò","Â","Ø","Œ","Í","ˇ","Á","ﬁ","ﬂ","Ú","Æ","validModifiers","ifKey","keyCombo","KeyboardEvent","isKey","listenerName","_class2","_class","activated","priority","keyboardActivated","keyboardPriority","keyboardHandlers","keyboard","register","unregister","inject","getMouseName","buttonCode","isNone","keyResponder","createClass","DecoratedClass","responder","keyboardHandlerNames","propertyName","propertyValue","_emberKeyboardOnKeyDecoratorData","listenerNames","methodName","DEFAULT_EVENT_NAME","onKey","onKeyClassic","parentKeyboardHandlerNames","handler","validKeys","formattedListener","keysString","click","mouseDown","mouseUp","touchEnd","touchStart","triggerKeyEvent","KeyboardListener","createMatchingKeyboardEvent","triggerKeyDown","triggerKeyPress","triggerKeyUp","getCode","getKeyCode","keyDown","keyPress","keyUp","ONLY_WHEN_FOCUSED_TAG_NAMES","onlyWhenFocused","onFocus","onFocusOut","removeEventListeners","setupProperties","addEventListeners","activatedParamValue","isFocused","keyboardFirstResponder","canHandleKeyboardEvent","handleKeyboardEvent","ekEvent","modifier$1","triggerResponderListener","responderListenerName","KeyboardService","Service","activeResponders","registeredResponders","r","sortedResponders","sort","propName","convertValue","diff","firstResponders","normalResponders","FastBoot","emberKeyboardConfig","emberKeyboard","disableOnInputFields","_disableOnInput","_listeners","listeners","listener","_respond","_event$composedPath$","run","isImmediatePropagationStopped","isPropagationStopped","stopImmediatePropagation","previousPriorityLevel","POSITIVE_INFINITY","currentPriorityLevel","delete","ALL_SYMBOL","listenerOrListenerName","platform","getPlatform","keyOrCode","altKey","ctrlKey","metaKey","shiftKey","keyboardEvent","mouseEvent","MouseEvent","keyboardListener","onlyModifiers","ALL_MODIFIERS_EXCEPT_CMD","m","ALT_REGEX","SHIFT_REGEX","CTRL_REGEX","META_REGEX","CMD_REGEX","keyArrayOrString","keyArray","osName","getTask","taskOrName","registeredTimers","_setRegisteredTimers","mapForTesting","getTimers","destroyable","timers","cancelId","cancelTask","clear","runTask","scheduleTask","taskArgs","throttleTask","throttleArgs","lastArgument","spacing","throttle","registeredPollers","_setRegisteredPollers","_shouldPollOverride","setShouldPoll","getQueuedPollTasks","symbol","Symbol","globalObj","globalThis","self","global","queuedPollTasks","pollTask","tick","pollers","cancelPoll","pollToken","registeredDebounces","debounceTask","debounceArgs","pendingDebounces","debounces","debouncedTask","debounce","cancelDebounce","getTimeoutOrTestFallback","testTimeout","scaling","ClassBasedModifierManager","capabilities","createModifier","modifierClass","installModifier","createdState","installedState","updateModifier","destroyModifier","destroy","ClassBasedModifier","setModifierManager","MANAGER","teardown","getDebugName","getDebugInstance","moment","findMoment","_heardValue","PikadayInputComponent","useUTC","utc","toDate","yearRange","yearArray","getFullYear","i18n","previousMonth","nextMonth","months","weekdays","weekdaysShort","firstDay","_this$args$onClose","_this$args","onSelect","onDraw","_this$args$onDraw","_this$args2","didChange","_this$args$onSelectio","_this$args3","getMonth","getDate","onSelection","_PikadayInputComponent","TEMPLATE","PikadayInputlessComponent","_container","setContainer","_PikadayInputlessComponent","maybeFindMoment","importSync","__esModule","default","Pikaday","hasMoment","hasEventListeners","sto","addEvent","attachEvent","removeEvent","detachEvent","hasClass","cn","className","addClass","removeClass","trim","isDate","getTime","isWeekend","getDay","isLeapYear","getDaysInMonth","setToStartOfDay","setHours","compareDates","extend","overwrite","hasProp","fireEvent","ev","initEvent","createEventObject","adjustCalendar","calendar","ceil","bound","ariaLabel","defaultDate","setDefaultDate","firstWeekOfYearMinDays","formatStrict","minDate","maxDate","showWeekNumber","pickWholeWeek","minYear","maxYear","minMonth","maxMonth","startRange","endRange","isRTL","yearSuffix","showMonthAfterYear","showDaysInNextAndPreviousMonths","enableSelectionDaysInNextAndPreviousMonths","numberOfMonths","mainCalendar","blurFieldOnSelect","theme","events","keyboardInput","renderDayName","abbr","renderDay","ariaSelected","isEmpty","isDisabled","isToday","isSelected","hasEvent","isInRange","isStartRange","isEndRange","renderWeek","y","week","isoWeek","yearDay","weekDay","dayInFirstWeek","dayShift","prevWeekDay","setDate","jan4th","daysBetween","round","renderRow","days","isRowSelected","renderTitle","refYear","randId","monthHtml","yearHtml","_o","isMinYear","isMaxYear","html","prev","_onMouseDown","_v","srcElement","prevMonth","hide","blur","_c","returnValue","_onChange","gotoMonth","gotoYear","_onKeyChange","isVisible","adjustDate","_parseFieldValue","isValid","_onInputChange","firedBy","show","_onInputFocus","_onInputClick","_onInputBlur","pEl","activeElement","_onClick","onchange","insertBefore","nextSibling","defDate","gotoDate","disableWeekends","disableDayFn","nom","setMinDate","setMaxDate","fallback","_d","toDateString","getMoment","setMoment","preventOnSelect","isMoment","draw","newCalendar","calendars","firstVisibleDate","lastVisibleDate","visibleDate","setMonth","adjustCalendars","newDay","difference","valueOf","gotoToday","setStartRange","setEndRange","force","_y","_m","random","substr","render","innerHTML","adjustPosition","viewportHeight","clientRect","leftAligned","bottomAligned","offsetWidth","documentElement","bottom","offsetLeft","offsetTop","before","row","yearOfPreviousMonth","yearOfNextMonth","daysInPreviousMonth","cells","after","isWeekSelected","dayNumber","monthNumber","yearNumber","dayConfig","unshift","makePikaday","_pikaday","_observer","PikadayModifier","_classPrivateFieldGet","getPikadayOptions","pikadayOptions","_classPrivateFieldSet","syncDisabled","attributes","hasAttribute","isObject","o","DASHERIZE_REGEX","StyleModifier","setStyles","newStyles","existingStyles","rulesToRemove","typeOf","removeProperty","flat","AndHelper","truthConvert","eq","gt","forceNumber","gte","every","isEmberArray","lt","lte","notEq","not","param","OrHelper","xor","isTruthy","Events","emitter","evt","_events","_eventsCount","clearEvent","EventEmitter","handlers","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","removeAllListeners","prefixed","XMLHttpRequest","responseType","onload","send","status","f","saveAs","HTMLAnchorElement","h","URL","webkitURL","download","rel","href","origin","createObjectURL","revokeObjectURL","msSaveOrOpenBlob","autoBom","Blob","title","innerText","HTMLElement","safari","FileReader","onloadend","readAsDataURL","w","noGlobal","getProto","array","class2type","hasOwn","fnToString","ObjectFunctionString","support","isFunction","item","isWindow","preservedScriptAttributes","nonce","noModule","DOMEval","doc","script","text","head","toType","version","rhtmlSuffix","jQuery","init","isArrayLike","elem","jquery","toArray","num","pushStack","elems","ret","merge","prevObject","each","even","grep","_elem","odd","splice","copy","copyIsArray","deep","isPlainObject","expando","isReady","Ctor","isEmptyObject","globalEval","textContent","makeArray","inArray","isXMLDoc","namespace","namespaceURI","docElem","ownerDocument","invert","callbackExpect","whitespace","rtrimCSS","bup","compareDocumentPosition","rcssescape","fcssescape","asCodePoint","escapeSelector","sel","preferredDoc","pushNative","Expr","outermostContext","sortInput","hasDuplicate","documentIsHTML","rbuggyQSA","dirruns","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","booleans","identifier","pseudos","rwhitespace","rcomma","rleadingCombinator","rdescend","rpseudo","ridentifier","matchExpr","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","unloadHandler","setDocument","inDisabledFieldset","addCombinator","dir","childNodes","find","seed","nid","groups","newSelector","newContext","getElementsByTagName","getElementsByClassName","testContext","tokenize","toSelector","qsaError","cacheLength","shift","markFunction","createInputPseudo","createButtonPseudo","createDisabledPseudo","createPositionalPseudo","matchIndexes","subWindow","defaultView","getById","getElementsByName","disconnectedMatch","cssHas","attrId","getAttributeNode","compare","sortDetached","expr","attr","attrHandle","uniqueSort","duplicates","sortStable","createPseudo","relative","preFilter","excess","unquoted","nodeNameSelector","expectedNodeName","operator","check","what","_argument","simple","forward","ofType","_context","xml","outerCache","nodeIndex","useCache","firstChild","lastChild","pseudo","setFilters","idx","matched","matcher","compile","unmatched","lang","elemLang","root","hasFocus","checked","selected","selectedIndex","empty","header","_matchIndexes","nth","radio","checkbox","file","password","image","submit","reset","parseOnly","soFar","preFilters","cached","combinator","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","matcherOut","preMap","postMap","preexisting","contexts","matcherIn","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","setMatchers","elementMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","compiled","filters","unique","getText","isXML","selectors","truncate","is","siblings","rneedsContext","rsingleTag","winnow","qualifier","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","contents","sibling","cur","targets","closest","prevAll","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","rnothtmlwhite","Identity","Thrower","ex","adoptValue","noValue","fail","Callbacks","firing","memory","fired","locked","queue","firingIndex","fire","stopOnFalse","lock","fireWith","Deferred","func","tuples","always","deferred","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","notifyWith","resolveWith","exceptionHook","rejectWith","getErrorHook","getStackHook","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","asyncError","readyException","readyList","completed","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","rmsPrefix","rdashAlpha","fcamelCase","_all","camelCase","acceptData","Data","uid","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","tmp","count","pnum","rcssNum","cssExpand","isAttached","composed","isHiddenWithinTree","display","css","adjustCSS","valueParts","tween","adjusted","maxIterations","currentValue","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","showHide","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","noCloneChecked","defaultValue","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","rhtml","buildFragment","scripts","selection","ignored","wrap","attached","fragment","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","types","origFn","leverageNative","isSetup","saved","isTrigger","delegateType","handleObjIn","eventHandle","handleObj","namespaces","origType","elemData","handle","triggered","dispatch","bindType","delegateCount","mappedTypes","origCount","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","currentTarget","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","originalEvent","load","noBubble","beforeunload","isDefaultPrevented","relatedTarget","timeStamp","isSimulated","bubbles","detail","eventPhase","view","charCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","focusMappedHandler","documentMode","simulate","attaches","dataHolder","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","valueIsFunction","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","rcustomProp","getStyles","opener","swap","old","rboxStyle","curCSS","minWidth","maxWidth","isCustomProp","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","pixelBoxStylesVal","boxSizingReliableVal","scrollboxSizeVal","measure","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","borderTopWidth","borderBottomWidth","cssPrefixes","emptyStyle","vendorProps","finalPropName","cssProps","capName","rdisplayswap","cssShow","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","marginDelta","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","aspectRatio","borderImageSlice","columnCount","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeMiterlimit","strokeOpacity","origName","scrollboxSizeBuggy","margin","padding","suffix","expand","expanded","propHooks","eased","duration","pos","fx","linear","swing","cos","PI","fxNow","inProgress","rfxtypes","rrun","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","specialEasing","originalProperties","originalOptions","gotoEnd","complete","timer","anim","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","prefilter","speed","speeds","fadeTo","animate","optall","doAnimation","finish","stopQueue","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","class","classNames","curValue","finalValue","toggleClass","stateVal","isValidValue","rreturn","valHooks","optionSet","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","triggerHandler","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","valueOrFunction","encodeURIComponent","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","accepts","json","responseFields","converters","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","statusText","finalText","crossDomain","hasContent","ifModified","beforeSend","success","nativeStatusText","responses","isSuccess","modified","ct","finalDataType","firstDataType","conv2","current","conv","dataFilter","throws","getJSON","getScript","wrapAll","wrapInner","htmlIsFunction","unwrap","visible","xhr","xhrSuccessStatus","xhrSupported","cors","errorCallback","username","xhrFields","onabort","ontimeout","onreadystatechange","responseText","binary","scriptAttrs","charset","scriptCharset","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","animated","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","win","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","rtrim","holdReady","hold","parseJSON","isNumeric","_jQuery","_$","noConflict","tab","VERSION","_hasBuffer","Buffer","_TD","_TE","TextEncoder","b64chs","b64tab","b64re","_fromCC","_U8Afrom","_mkUriSafe","m0","_tidyB64","btoaPolyfill","bin","u32","c0","asc","pad","substring","_btoa","btoa","_fromUint8Array","u8a","strs","fromUint8Array","urlsafe","cb_utob","cc","re_utob","utob","u","_encode","encode","encodeURI","re_btou","cb_btou","cccc","btou","atobPolyfill","u24","r1","r2","binArray","_atob","atob","_toUint8Array","toUint8Array","_unURI","_decode","_noEnum","extendString","_add","extendUint8Array","gBase64","fromBase64","toBase64","encodeURL","extendBuiltins","Base64","LuxonError","InvalidDateTimeError","toMessage","InvalidIntervalError","InvalidDurationError","ConflictingSpecificationError","InvalidUnitError","InvalidArgumentError","ZoneIsAbstractError","DATE_SHORT","DATE_MED","DATE_MED_WITH_WEEKDAY","DATE_FULL","DATE_HUGE","TIME_SIMPLE","TIME_WITH_SECONDS","TIME_WITH_SHORT_OFFSET","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","ianaName","isUniversal","offsetName","ts","formatOffset","equals","otherZone","singleton","SystemZone","parseZoneInfo","getTimezoneOffset","dtfCache","typeToPos","ianaZoneCache","IANAZone","zone","resetCache","isValidSpecifier","isValidZone","zoneName","valid","NaN","dtf","adOrBc","formatted","filled","isUndefined","fMonth","fDay","fYear","fadOrBc","fHour","fMinute","fSecond","asTS","over","objToLocalTS","millisecond","intlLFCache","intlDTCache","getCachedDTF","locString","intlNumCache","intlRelCache","sysLocaleCache","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","listStuff","loc","englishFn","intlFn","mode","listingMode","PolyNumberFormatter","intl","forceSimple","padTo","otherOpts","intlOpts","inf","fixed","padStart","roundTo","PolyDateFormatter","dt","z","originalZone","gmtOffset","offsetZ","setZone","plus","minutes","toJSDate","PolyRelFormatter","isEnglish","hasRelative","rtf","cacheKeyOpts","numeric","narrow","units","years","quarters","weeks","hours","seconds","lastable","isDay","isInPast","fmtValue","singular","lilUnits","fmtUnit","fallbackWeekSettings","minimalDays","weekend","fromOpts","numberingSystem","outputCalendar","weekSettings","defaultToEN","specifiedLocale","Settings","localeR","numberingSystemR","defaultNumberingSystem","outputCalendarR","defaultOutputCalendar","weekSettingsR","validateWeekSettings","defaultWeekSettings","fromObject","numbering","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","localeStr","xIndex","uIndex","selectedStr","smaller","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","fastNumbers","isActuallyEn","hasNoWeirdness","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","English","monthSpecialCase","formatStr","mapper","dtFormatter","extract","DateTime","meridiems","eras","matching","numberFormatter","relFormatter","listFormatter","getWeekSettings","hasLocaleWeekInfo","getWeekInfo","weekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","FixedOffsetZone","utcInstance","parseSpecifier","signedOffset","InvalidZone","normalizeZone","defaultZone","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","digitRegexCache","digitRegex","_ref4","ns","appendCache","regex","throwOnInvalid","twoDigitCutoffYear","cutoffYear","resetCaches","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","uncomputeOrdinal","ordinal","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekYear","weekNumber","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","usesLocalWeekValues","localWeekday","localWeekNumber","localWeekYear","hasInvalidGregorianData","validYear","isInteger","validMonth","integerBetween","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","bestBy","by","best","pair","thing","padded","parseInteger","parseFloating","parseMillis","fraction","digits","rounding","factor","trunc","modMonth","firstWeekOffset","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","offHourStr","offMinuteStr","offHour","offMin","asNumber","numericValue","normalizeObject","normalizer","normalized","monthsLong","monthsShort","monthsNarrow","weekdaysLong","weekdaysNarrow","erasLong","erasShort","erasNarrow","stringifyTokens","splits","tokenToString","macroTokenToFormatOpts","Formats","DD","DDD","DDDD","tt","ttt","tttt","TTT","TTTT","ff","fff","ffff","FF","FFF","FFFF","Formatter","parseFormat","fmt","currentFull","bracketed","formatOpts","systemLoc","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","maybeMacro","quarter","formatDurationFromString","dur","invertLargest","signMode","tokenToField","realTokens","found","_ref5","collapsed","shiftTo","lildur","inversionFactor","isNegativeDuration","largestUnit","ianaRegex","combineRegexes","regexes","combineExtractors","extractors","_ref6","mergedVals","mergedZone","patterns","extractor","simpleParse","_len4","_key4","offsetRegex","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","extractISOWeekData","extractISOOrdinalData","sqlTimeRegex","sqlTimeExtensionRegex","int","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","hasNegativePrefix","negativeSeconds","maybeNegate","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","rfc2822","extractRFC2822","obsOffset","milOffset","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","extractISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","INVALID","lowOrderMatrix","casualMatrix","accurateMatrix","daysInYearAccurate","daysInMonthAccurate","orderedUnits","reverseUnits","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","previousVal","rollUp","removeZeroes","newVals","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","fromISOTime","toFormat","fmtOpts","INVALID$2","toHuman","showZeros","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","toJSON","invalidReason","minus","negate","mapUnits","reconfigure","as","normalize","rescale","shiftToAll","_len5","_key5","built","accumulated","lastUnit","own","ak","negated","removeZeros","invalidExplanation","v1","v2","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","startIsValid","endIsValid","isInterval","lastDateTime","toDuration","startOf","useLocaleWeeks","hasSame","isAfter","isBefore","splitAt","_len6","dateTimes","_key6","sorted","added","splitBy","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","intervals","final","_ref7","sofar","currentCount","ends","_len7","_key7","toLocaleString","INVALID$1","toISODate","dateFormat","separator","mapEndpoints","mapFn","Info","hasDST","isValidIANAZone","locObj","getMinimumDaysInFirstWeek","getWeekendWeekdays","monthsFormat","weekdaysFormat","features","localeWeek","dayDiff","earlier","utcDayStart","toUTC","keepLocalTime","intUnit","post","deser","_ref8","spaceOrNBSP","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","_ref9","_ref0","_ref1","partTypeStyleToTokenVal","dayperiod","dayPeriod","hour24","dummyDateTimeCache","expandMacroTokens","formatOptsToTokens","TokenParser","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","_ref10","disqualifyingUnit","regexString","explainFromTokens","rawMatches","matchIndex","specificOffset","q","df","resolvedOpts","isSpace","actualType","MAX_DATE","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","parseDataToDateTime","parsedZone","interpretationZone","toTechFormat","extended","precision","longFormat","extendedZone","showSeconds","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","quickDT","offsetProvis","zoneOffsetTs","offsetGuess","zoneOffsetGuessCache","diffRelative","calendary","differ","lastOpts","argList","ot","_zone","isLuxonDateTime","fromJSDate","zoneToUse","fromSeconds","tsNow","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","useWeekData","defaultValues","objNow","foundFirst","higherOrderInvalid","validWeek","validWeekday","validOrdinal","gregorian","tsFinal","offsetFinal","fromRFC2822","fromHTTP","fromFormat","localeToUse","fromString","fromSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","monthShort","monthLong","weekdayShort","weekdayLong","offsetNameShort","offsetNameLong","isInDST","getPossibleOffsets","dayMs","minuteMs","oEarlier","oLater","o1","ts1","ts2","isInLeapYear","weeksInLocalWeekYear","resolvedLocaleOptions","toLocal","keepCalendarTime","newTS","asObj","setLocale","settingWeekStuff","mixed","normalizedUnit","endOf","toLocaleParts","ext","toISOWeekDate","toRFC2822","toHTTP","toSQLDate","toSQLTime","includeZone","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","durOpts","otherIsLater","diffed","highWater","lowestOrder","differs","remainingMillis","lowerOrderUnits","diffNow","inputMs","adjustedToZone","toRelative","toRelativeCalendar","_len8","_key8","_len9","_key9","fromFormatExplain","fromStringExplain","buildFormatParser","fromFormatParser","formatParser","dateTimeish","defineLocale","weekdaysMin","meridiemParse","isPM","meridiem","isLower","longDateFormat","LTS","LL","LLL","LLLL","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","future","past","ss","mm","hh","dd","yy","dayOfMonthOrdinalParse","dow","doy","require","pluralForm","plurals","pluralize","withoutSuffix","isFuture","weekdaysParseExact","postformat","symbolMap","preparse","numberMap","suffixes","relativeTimeWithPlural","forms","isFormat","period","ww","lastDigit","last2Digits","meridiemHour","monthsShortRegex","monthsParseExact","relativeTimeWithMutation","mutationTable","lastNumber","monthsParse","monthsRegex","minWeekdaysParse","weekdaysParse","fullWeekdaysParse","shortWeekdaysParse","monthsStrictRegex","monthsShortStrictRegex","longMonthsParse","shortMonthsParse","translate","ll","lll","llll","processRelativeTime","monthsNominativeEl","monthsGenitiveEl","momentToFormat","_monthsGenitiveEl","_monthsNominativeEl","calendarEl","mom","_calendarEl","Function","monthsShortDot","invalidDate","numbersPast","numbersFuture","monthsShortWithDots","monthsShortWithoutDots","weekEndings","eraYearOrdinalRegex","eraYearOrdinalParse","$0","$1","$2","isUpper","eifelerRegelAppliesToNumber","translateSingular","relativeTimeWithSingular","translator","words","correctGrammaticalCase","wordKey","relativeTimeMr","monthsNominative","monthsSubjective","word","numbersNouns","numberNoun","hundred","ten","hm","processHoursFunction","nominative","accusative","genitive","hookCallback","hasOwnProp","isObjectEmpty","arrLen","createUTC","strict","createLocalOrUTC","getParsingFlags","_pf","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidEra","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","weekdayMismatch","flags","parsedParts","isNowValid","invalidWeekday","_strict","bigHour","isFrozen","_isValid","createInvalid","fun","momentProperties","updateInProgress","copyConfig","momentPropertiesLen","_isAMomentObject","_f","_l","_tzm","_isUTC","_offset","_locale","Moment","updateOffset","suppressDeprecationWarnings","firstTime","deprecationHandler","argLen","deprecations","deprecateSimple","mergeConfigs","parentConfig","childConfig","zeroFill","targetLength","forceSign","absNumber","zerosToFill","pow","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","localeData","removeFormattingTokens","formatMoment","replaceLongDateFormatTokens","aliases","dates","isoweekdays","isoweekday","dayofyears","dayofyear","gg","isoweekyears","isoweekyear","isoweeks","isoweek","normalizeUnits","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","priorities","dayOfYear","isoWeekYear","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchWord","match1to2NoLeadingZero","match1to2HasZero","addRegexToken","strictRegex","isStrict","getParseRegexForToken","regexEscape","p1","p2","p3","p4","absFloor","toInt","argumentForCoercion","coercedNumber","addParseToken","tokenLen","addWeekParseToken","_w","addTimeToArrayFromToken","YEAR","MONTH","DATE","HOUR","MINUTE","SECOND","MILLISECOND","WEEK","WEEKDAY","parseTwoDigitYear","getSetYear","makeGetSet","keepTime","set$1","isUTC","getMilliseconds","getSeconds","getMinutes","getHours","setUTCMilliseconds","setMilliseconds","setUTCSeconds","setSeconds","setUTCMinutes","setMinutes","setUTCHours","setUTCDate","setFullYear","defaultLocaleMonths","defaultLocaleMonthsShort","MONTHS_IN_FORMAT","defaultMonthsShortRegex","defaultMonthsRegex","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","setUTCMonth","getSetMonth","computeMonthsParse","cmpLenRev","shortP","longP","shortPieces","longPieces","mixedPieces","_monthsRegex","_monthsShortRegex","_monthsStrictRegex","_monthsShortStrictRegex","createDate","createUTCDate","fwd","dayOfYearFromWeeks","resYear","resDayOfYear","weekOfYear","resWeek","weeksInYear","shiftWeekdays","ws","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","computeWeekdaysParse","minp","shortp","longp","minPieces","_weekdaysRegex","_weekdaysShortRegex","_weekdaysMinRegex","_weekdaysStrictRegex","_weekdaysShortStrictRegex","_weekdaysMinStrictRegex","hFormat","lowercase","matchMeridiem","_meridiemParse","kInput","_isPm","_meridiem","pos1","pos2","globalLocale","getSetHour","baseConfig","localeFamilies","commonPrefix","arr1","arr2","minl","normalizeLocale","loadLocale","oldLocale","_abbr","aliasedRequire","getSetGlobalLocale","getLocale","parentLocale","checkOverflow","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","UT","configFromISO","allowTime","timeFormat","tzFormat","isoDatesLen","isoTimesLen","configFromStringAndFormat","configFromRFC2822","parsedArray","parsedInput","militaryOffset","numOffset","configFromArray","currentDate","expectedWeekday","yearToUse","nowValue","_useUTC","weekdayOverflow","curWeek","createLocal","_week","_dayOfYear","_nextDay","ISO_8601","RFC_2822","skipped","stringLength","totalParsedInputLength","isPm","erasConvertYear","prepareConfig","tempConfig","bestMoment","scoreToBeat","currentScore","validFormatFound","bestFormatIsValid","configfLen","score","createFromInputFallback","dayOrDate","prototypeMin","prototypeMax","pickBy","moments","ordering","unitHasDecimal","orderLen","_milliseconds","_days","_months","_bubble","absRound","utcOffset","offsetFromString","chunkOffset","cloneWithOffset","model","setTime","getDateOffset","isUtc","aspNetRegex","isoRegex","createDuration","diffRes","parseIso","positiveMomentsDifference","inp","createAdder","direction","addSubtract","isAdding","isString","isMomentInput","arrayTest","dataTypeTest","objectTest","propertyTest","propertyLen","monthDiff","wholeMonthDiff","anchor","newLocaleData","defaultFormat","defaultFormatUtc","MS_PER_SECOND","MS_PER_MINUTE","MS_PER_HOUR","MS_PER_400_YEARS","mod$1","dividend","divisor","localStartOfDate","utcStartOfDate","matchEraAbbr","erasAbbrRegex","computeErasParse","erasName","erasAbbr","abbrPieces","namePieces","narrowPieces","_erasRegex","_erasNameRegex","_erasAbbrRegex","_erasNarrowRegex","addWeekYearFormatToken","getSetWeekYearHelper","weeksTarget","setWeekAll","dayOfYearData","erasNameRegex","erasNarrowRegex","erasParse","_eraYearOrdinalRegex","_dayOfMonthOrdinalParse","_ordinalParse","_dayOfMonthOrdinalParseLenient","getSetDayOfMonth","getSetMinute","getSetMillisecond","getSetSecond","parseMs","preParsePostFormat","sod","calendarFormat","asFloat","zoneDelta","startOfDate","inputString","humanize","fromNow","toNow","invalidAt","localInput","isBetween","inclusivity","localFrom","localTo","isSame","isSameOrAfter","isSameOrBefore","parsingFlags","prioritized","unitsObj","prioritizedLen","toISOString","keepOffset","unix","creationData","eraName","eraNarrow","eraAbbr","eraYear","isoWeeks","isoWeeksInYear","isoWeeksInISOWeekYear","keepMinutes","localAdjust","_changeInProgress","parseZone","tZone","hasAlignedHourOffset","isDST","isUtcOffset","zoneAbbr","isDSTShifted","_isDSTShifted","array1","array2","lengthDiff","diffs","proto$1","get$1","listMonthsImpl","out","listWeekdaysImpl","localeSorted","_calendar","_longDateFormat","formatUpper","tok","_invalidDate","_ordinal","_relativeTime","pastFuture","_eras","_monthsShort","_monthsParseExact","firstDayOfYear","firstDayOfWeek","_weekdays","_weekdaysMin","_weekdaysShort","_weekdaysParseExact","_fullWeekdaysParse","langData","mathAbs","addSubtract$1","absCeil","daysToMonths","monthsToDays","makeAs","alias","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asQuarters","asYears","valueOf$1","makeGetter","thresholds","substituteTimeAgo","abs$1","toISOString$1","totalSign","ymSign","daysSign","hmsSign","total","toFixed","proto$2","monthsFromDays","argWithSuffix","argThresholds","withSuffix","posNegDuration","toIsoString","updateLocale","tmpLocale","relativeTimeRounding","roundingFunction","relativeTimeThreshold","threshold","limit","myMoment","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","TIME","TIME_SECONDS","TIME_MS","isBrowser","timeoutDuration","longerTimeoutBrowsers","called","scheduled","functionToCheck","getStyleComputedProperty","getParentNode","_getStyleComputedProp","getReferenceNode","referenceNode","isIE11","MSInputMethodContext","isIE10","isIE","getOffsetParent","noOffsetParent","nextElementSibling","getRoot","findCommonOffsetParent","element1","element2","Node","DOCUMENT_POSITION_FOLLOWING","range","createRange","setStart","setEnd","commonAncestorContainer","element1root","getScroll","upperSide","scrollingElement","getBordersSize","axis","sideA","sideB","getSize","getWindowSizes","getClientRect","offsets","sizes","horizScrollbar","vertScrollbar","getOffsetRectRelativeToArbitraryNode","fixedPosition","isHTML","childrenRect","parentRect","scrollParent","borderLeftWidth","marginTop","isFixed","getFixedPositionOffsetParent","getBoundaries","popper","boundariesElement","boundaries","excludeScroll","relativeOffset","boundariesNode","_getWindowSizes","isPaddingNumber","computeAutoPlacement","placement","refRect","rects","sortedAreas","area","filteredAreas","computedPlacement","variation","getReferenceOffsets","getOuterSizes","marginBottom","marginRight","getOppositePlacement","getPopperOffsets","referenceOffsets","popperRect","popperOffsets","isHoriz","mainSide","secondarySide","measurement","secondaryMeasurement","runModifiers","modifiers","function","positionFixed","flip","originalPlacement","isCreated","onUpdate","onCreate","isModifierEnabled","modifierName","getSupportedPropertyName","prefixes","upperProp","toCheck","willChange","disableEventListeners","removeOnDestroy","getWindow","attachToScrollParents","scrollParents","isBody","setupEventListeners","updateBound","scrollElement","eventsEnabled","enableEventListeners","scheduleUpdate","isFirefox","isModifierRequired","requestingName","requestedName","requesting","isRequired","_requesting","requested","placements","validPlacements","clockwise","counter","basePlacement","shiftvariation","_data$offsets","isVertical","side","shiftOffsets","_extends","useHeight","fragments","frag","divider","splitRegex","ops","op","mergeWithPrevious","index2","transformProp","popperStyles","transform","escapeWithReference","opSide","arrowElement","sideCapitalized","altSide","arrowElementSize","center","popperMarginSide","popperBorderSide","sideValue","arrow","_data$offsets$arrow","flipped","placementOpposite","flipOrder","behavior","refOffsets","overlapsRef","overflowsLeft","overflowsRight","overflowsTop","overflowsBottom","overflowsBoundaries","flippedVariationByRef","flipVariations","flippedVariationByContent","flipVariationsByContent","flippedVariation","subtractLength","legacyGpuAccelerationOption","gpuAcceleration","offsetParentRect","shouldRound","noRound","referenceWidth","popperWidth","isVariation","horizontalToInteger","verticalToInteger","devicePixelRatio","prefixedProperty","invertTop","invertLeft","arrowStyles","Defaults","Popper","onLoad","Utils","PopperUtils","DEFAULT_OPTIONS","Tooltip","_popperOptions","_setEventListeners","template","allowHtml","tooltipGenerator","tooltipNode","titleNode","innerSelector","_addTitleContent","_isOpening","_tooltipNode","popperInstance","_create","_findContainer","_append","popperOptions","arrowSelector","preventOverflow","_hide","directEvents","oppositeEvents","_this2","usedByTooltip","_scheduleShow","_scheduleHide","closeOnClickOutside","computedDelay","_showTimeout","_this3","_show","_this4","_setTooltipNodeEvent","_clearTitleContent","lastTitle","_this5","_dispose","updateTitleContent","_updateTitleContent","relatedreference","evt2","relatedreference2","_defineProperties","_toPropertyKey","_objectSpread2","getOwnPropertyDescriptors","toPrimitive","_typeof","DEFAULTS","backdrop","navbar","toolbar","fullscreen","inheritedAttributes","initialCoverage","initialViewIndex","inline","loading","loop","minHeight","movable","rotatable","scalable","zoomable","zoomOnTouch","zoomOnWheel","slideOnTouch","toggleOnDblclick","tooltip","transition","zIndexInline","zoomRatio","minZoomRatio","maxZoomRatio","shown","viewed","move","moved","rotate","rotated","scaled","zoomed","play","IS_BROWSER","WINDOW","IS_TOUCH_DEVICE","HAS_POINTER_EVENT","NAMESPACE","ACTION_MOVE","ACTION_SWITCH","ACTION_ZOOM","CLASS_ACTIVE","CLASS_CLOSE","CLASS_FADE","CLASS_FIXED","CLASS_FULLSCREEN","CLASS_FULLSCREEN_EXIT","CLASS_HIDE","CLASS_HIDE_MD_DOWN","CLASS_HIDE_SM_DOWN","CLASS_HIDE_XS_DOWN","CLASS_IN","CLASS_INVISIBLE","CLASS_LOADING","CLASS_MOVE","CLASS_OPEN","CLASS_SHOW","CLASS_TRANSITION","EVENT_CLICK","EVENT_DBLCLICK","EVENT_DRAG_START","EVENT_FOCUSIN","EVENT_KEY_DOWN","EVENT_LOAD","EVENT_ERROR","EVENT_POINTER_DOWN","EVENT_POINTER_MOVE","EVENT_POINTER_UP","EVENT_RESIZE","EVENT_TRANSITION_END","EVENT_WHEEL","EVENT_READY","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","EVENT_VIEW","EVENT_VIEWED","EVENT_MOVE","EVENT_MOVED","EVENT_ROTATE","EVENT_ROTATED","EVENT_SCALE","EVENT_SCALED","EVENT_ZOOM","EVENT_ZOOMED","EVENT_PLAY","EVENT_STOP","DATA_ACTION","REGEXP_SPACES","BUTTONS","_constructor","REGEXP_SUFFIX","setStyle","REGEXP_HYPHENATE","hyphenate","getData","dataset","setData","onceSupported","supported","_handler","_element$listeners","CustomEvent","initCustomEvent","getTransforms","scaleX","scaleY","translateX","translateY","WebkitTransform","msTransform","IS_SAFARI","getImageNaturalSizes","newImage","naturalWidth","naturalHeight","getResponsiveClass","getPointer","endOnly","endX","endY","startX","startY","initContainer","initViewer","initList","renderViewer","initBody","scrollbarWidth","initialBodyPaddingRight","paddingRight","initialBodyComputedPaddingRight","containerData","viewerData","parentData","fulled","viewer","images","alt","decodeURIComponent","getImageURL","img","loadImage","renderList","gutter","outerWidth","resetList","initImage","sizingImage","footerHeight","footer","viewerWidth","viewerHeight","oldImageData","imageData","imageInitializing","oldRatio","ratio","initialImageData","renderImage","viewing","moving","rotating","zooming","onTransitionEnd","imageRendering","resetImage","canvas","onClick","onDragStart","dragstart","onPointerDown","pointerdown","onPointerMove","pointermove","onPointerUp","pointerup","onKeyDown","keydown","onResize","resize","onWheel","wheel","onDblclick","dblclick","localName","isTrusted","clickCanvasTimeout","played","exit","pointerMoved","doubleClickImageTimeout","originalImage","parentWidth","parentHeight","playing","pointers","showing","hiding","touch","isSwitchable","change","pointer","imageClicked","isShown","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","player","wheeling","wheelDelta","methods","immediate","build","transitioning","initialOffsetWidth","hideImmediately","_onViewerTransitionEnd","onImageTransitionEnd","zoomTo","activeItem","onViewed","maxIndex","moveTo","_originalEvent","oldX","oldY","changed","degree","rotateTo","oldDegree","_scaleX","_scaleY","oldScaleX","oldScaleY","showTooltip","pivot","_this6","_zoomable","newWidth","newHeight","clientLeft","clientTop","_this7","onLoadWhenPlay","requestFullscreen","referrerPolicy","_prev","_next","_this8","exitFullscreen","_this9","enforceFocus","_this10","clearEnforceFocus","_this11","tooltipBox","tooltipping","fading","_this12","isImg","changedIndexes","changedIndex","destroyed","delaying","initializing","others","onFocusin","fucus","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","mozRequestFullScreen","msRequestFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","pointers2","ratios","pointer2","x1","y1","x2","y2","z1","sqrt","absoluteOffsetX","AnotherViewer","Viewer","getUniqueID","custom","zoomButtons","rotateButtons","scaleButtons","rotates","_Channel_onmessage","_Channel_nextMessageIndex","_Channel_pendingMessages","_Channel_messageEndIndex","_Resource_rid","tslib_es6","SERIALIZE_TO_IPC_FN","transformCallback","__TAURI_INTERNALS__","Channel","__classPrivateFieldSet","rawMessage","__classPrivateFieldGet","cleanupCallback","deleteProperty","PluginListener","plugin","channelId","invoke","cmd","Resource","rid","addPluginListener","checkPermissions","convertFileSrc","filePath","isTauri","requestPermissions","TauriEvent","core","_unlisten","eventId","listen","label","WINDOW_RESIZED","WINDOW_MOVED","WINDOW_CLOSE_REQUESTED","WINDOW_DESTROYED","WINDOW_FOCUS","WINDOW_BLUR","WINDOW_SCALE_FACTOR_CHANGED","WINDOW_THEME_CHANGED","WINDOW_CREATED","WEBVIEW_CREATED","DRAG_ENTER","DRAG_OVER","DRAG_DROP","DRAG_LEAVE","payload","emitTo","eventTarget","eventData","receiver","ask","yesButtonLabel","okLabel","noButtonLabel","cancelLabel","confirm","okButtonLabel","cancelButtonLabel","save","unregisterCallback","openPath","openWith","with","openUrl","revealItemInDir","validate","v7","v6ToV1","v6","v5","v4","v3","v1ToV6","NIL","MAX","max_js_1","nil_js_1","parse_js_1","stringify_js_1","v1_js_1","v1ToV6_js_1","v3_js_1","v4_js_1","v5_js_1","v6_js_1","v6ToV1_js_1","v7_js_1","validate_js_1","version_js_1","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","cnt","md5ff","md5gg","md5hh","md5ii","bytes","xpad","Uint32Array","fill","olda","oldb","oldc","oldd","randomUUID","crypto","uuid","getRandomValues","rnds8","ROTL","newBytes","unsafeStringify","byteToHex","updateV1State","rng_js_1","_state","rnds","_state$msecs","_state$nsecs","msecs","nsecs","clockseq","v1Bytes","buf","tl","tmh","_options$_v","_options","isV6","_v6","optionsKeys","_options$random","_options$rng","_options2","rng","v6Bytes","DNS","md5_js_1","v35_js_1","v35_js_2","stringToBytes","unescape","_namespace","valueBytes","namespaceBytes","native_js_1","sha1_js_1","updateV7State","_state$seq","seq","v7Bytes","regex_js_1","decorateFieldV2","decorateMethodV2","initializeDeferredDecorator","_Mime_extensionToType","_Mime_typeToExtension","_Mime_typeToExtensions","typeMap","extensions","allExtensions","extension","starred","currentType","getType","_classPrivateFieldGe","hasPath","getExtension","_type","_type$split","getAllExtensions","_classPrivateFieldGe2","_freeze","_getTestState","Mime","standardTypes","otherTypes","urlAlphabet","customRandom","alphabet","defaultSize","getRandom","safeByteCutoff","mask","customAlphabet","nanoid","scopedUrlAlphabet","__webpack_require__","isNodeJS","versions","nw","electron","IDENTITY_MATRIX","FONT_IDENTITY_MATRIX","LINE_FACTOR","AnnotationMode","DISABLE","ENABLE","ENABLE_FORMS","ENABLE_STORAGE","AnnotationEditorType","NONE","FREETEXT","HIGHLIGHT","STAMP","INK","AnnotationEditorParamsType","RESIZE","CREATE","FREETEXT_SIZE","FREETEXT_COLOR","FREETEXT_OPACITY","INK_COLOR","INK_THICKNESS","INK_OPACITY","HIGHLIGHT_COLOR","HIGHLIGHT_DEFAULT_COLOR","HIGHLIGHT_THICKNESS","HIGHLIGHT_FREE","HIGHLIGHT_SHOW_ALL","DRAW_STEP","PermissionFlag","PRINT","MODIFY_CONTENTS","COPY","MODIFY_ANNOTATIONS","FILL_INTERACTIVE_FORMS","COPY_FOR_ACCESSIBILITY","ASSEMBLE","PRINT_HIGH_QUALITY","ImageKind","GRAYSCALE_1BPP","RGB_24BPP","RGBA_32BPP","VerbosityLevel","ERRORS","WARNINGS","INFOS","OPS","dependency","setLineWidth","setLineCap","setLineJoin","setMiterLimit","setDash","setRenderingIntent","setFlatness","setGState","restore","lineTo","curveTo","curveTo2","curveTo3","closePath","rectangle","stroke","closeStroke","eoFill","fillStroke","eoFillStroke","closeFillStroke","closeEOFillStroke","endPath","clip","eoClip","beginText","endText","setCharSpacing","setWordSpacing","setHScale","setLeading","setFont","setTextRenderingMode","setTextRise","moveText","setLeadingMoveText","setTextMatrix","nextLine","showText","showSpacedText","nextLineShowText","nextLineSetSpacingShowText","setCharWidth","setCharWidthAndBounds","setStrokeColorSpace","setFillColorSpace","setStrokeColor","setStrokeColorN","setFillColor","setFillColorN","setStrokeGray","setFillGray","setStrokeRGBColor","setFillRGBColor","setStrokeCMYKColor","setFillCMYKColor","shadingFill","beginInlineImage","beginImageData","endInlineImage","paintXObject","markPoint","markPointProps","beginMarkedContent","beginMarkedContentProps","endMarkedContent","beginCompat","endCompat","paintFormXObjectBegin","paintFormXObjectEnd","beginGroup","endGroup","beginAnnotation","endAnnotation","paintImageMaskXObject","paintImageMaskXObjectGroup","paintImageXObject","paintInlineImageXObject","paintInlineImageXObjectGroup","paintImageXObjectRepeat","paintImageMaskXObjectRepeat","paintSolidColorImageMask","constructPath","setStrokeTransparent","setFillTransparent","PasswordResponses","NEED_PASSWORD","INCORRECT_PASSWORD","verbosity","setVerbosityLevel","level","getVerbosityLevel","unreachable","cond","createValidAbsoluteUrl","baseUrl","addDefaultProtocol","dots","tryConvertEncoding","absoluteUrl","shadow","nonSerializable","BaseException","PasswordException","UnknownErrorException","details","InvalidPDFException","MissingPDFException","UnexpectedResponseException","AbortException","bytesToString","MAX_ARGUMENT_COUNT","strBuf","chunkEnd","chunk","objectFromMap","FeatureTest","isLittleEndian","buffer8","isEvalSupported","isOffscreenCanvasSupported","OffscreenCanvas","isImageDecoderSupported","ImageDecoder","_navigator","_navigator2","isMac","isWindows","isCSSRoundSupported","_globalThis$CSS","_globalThis$CSS$suppo","CSS","supports","hexNumbers","Util","makeHexColor","scaleMinMax","minMax","m1","m2","applyTransform","applyInverseTransform","getAxialAlignedBoundingBox","inverseTransform","singularValueDecompose2dScale","transpose","sx","sy","normalizeRect","intersect","rect1","rect2","xLow","xHigh","yLow","yHigh","bezierBoundingBox","x0","y0","x3","y3","_assertClassBrand","_getExtremum","_getExtremumOnCurve","mt","sqrtDelta","_Util","NormalizeRegex","NormalizationMap","normalizeUnicode","AnnotationPrefix","try","SVG_NS","PixelsPerInch","fetchData","isValidFetchUrl","baseURI","ok","arrayBuffer","blob","DONE","_PixelsPerInch","PDF","PageViewport","viewBox","userUnit","rotation","dontFlip","centerX","centerY","rotateA","rotateB","rotateC","rotateD","offsetCanvasX","offsetCanvasY","rawDims","dims","pageWidth","pageHeight","convertToViewportPoint","convertToViewportRectangle","topLeft","bottomRight","convertToPdfPoint","RenderingCancelledException","extraDelay","isDataScheme","isPdfFile","filename","getFilenameFromUrl","lastIndexOf","getPdfFilenameFromUrl","defaultFilename","reFilename","splitURI","suggestedFilename","StatTimer","started","timeEnd","times","outBuf","longest","padEnd","noContextMenu","stopEvent","PDFDateString","toDateObject","_regex","universalTimeRelation","offsetHour","offsetMinute","getXfaPageViewport","xfaPage","getRGB","color","colorRGB","getCurrentTransform","ctx","getTransform","getCurrentTransformInverse","invertSelf","setLayerDimensions","viewport","mustFlip","mustRotate","useRound","widthStr","heightStr","OutputScale","pixelRatio","symmetric","EditorToolbar","editor","_classPrivateMethodInitSpec","_EditorToolbar_brand","_toolbar","_colorPicker","_editor","_buttons","_altText","_l10nRemove","freetext","highlight","ink","stamp","editToolbar","_uiManager","_signal","toolbarPosition","insetInlineEnd","_addDeleteButton","_classPrivateFieldGet2","hideDropdown","_classPrivateFieldGet3","addAltText","altText","_addListenersToElement","_classPrivateGetter","_get_divider","addColorPicker","colorPicker","renderButton","_classPrivateFieldGet4","_pointerDown","_focusIn","_focusEventsAllowed","_focusOut","editorType","_buttons2","_toolbar2","_uiManager2","_HighlightToolbar_brand","WeakSet","HighlightToolbar","uiManager","boxes","isLTR","_getLastPoint","_render","_addHighlightButton","lastY","lastX","span","highlightSelection","bindEvents","_id","IdManager","_this$id","_this$id2","_baseId","_id2","_cache","_ImageManager_brand","ImageManager","_isSVGFittingCanvas","getContext","willReadFrequently","Image","drawImage","getImageData","getFromFile","_get","getFromUrl","getFromBlob","blobPromise","getFromId","bitmap","refCounter","getFromCanvas","_this$id5","_this$id6","_data2","offscreen","transferToImageBitmap","isSvg","getSvgUrl","svgUrl","deleteId","_bitmap$close","transferFromImageBitmap","convertToBlob","isValidId","rawData","_data4","_this$id3","_this$id4","File","mustRemoveAspectRatioPromise","fileReader","imageElement","imagePromise","createImageBitmap","_ImageManager","_commands","_locked","_maxSize","_position","CommandManager","maxSize","undo","mustExec","overwriteIfSameType","keepUndo","redo","hasSomethingToUndo","hasSomethingToRedo","cleanType","_KeyboardManager_brand","KeyboardManager","callbacks","allKeys","util_FeatureTest","isMacKey","at","_serialize","checker","ColorManager","_colors","colors","computedColor","convert","rgb","matchMedia","RGB","_colorsMapping","getHexCode","_abortController","_activeEditor","_allEditors","_allLayers","_altTextManager","_annotationStorage","_changedExistingAnnotations","_commandManager","_copyPasteAC","_currentDrawingSession","_currentPageIndex","_deletedAnnotationsElementIds","_draggingEditors","_editorTypes","_editorsToRescale","_enableHighlightFloatingButton","_enableUpdatedAddImage","_enableNewAltTextWhenAddingImage","_filterFactory","_focusMainContainerTimeoutId","_focusManagerAC","_highlightColors","_highlightWhenShiftUp","_highlightToolbar","_idManager","_isEnabled","_isWaiting","_keyboardManagerAC","_lastActiveElement","_mainHighlightColorPicker","_mlManager","_mode","_selectedEditors","_selectedTextNode","_pageColors","_showAllStates","_previousStates","_translation","_translationTimeoutId","_viewer","_updateModeCapability","_AnnotationEditorUIManager_brand","AnnotationEditorUIManager","_keyboardManager","arrowChecker","hasSomethingToControl","textInputChecker","_self","HTMLInputElement","small","TRANSLATE_SMALL","big","TRANSLATE_BIG","selectAll","addNewEditorFromKeyboard","HTMLButtonElement","isEnterHandled","unselectAll","translateSelectedEditors","altTextManager","eventBus","pdfDocument","pageColors","highlightColors","enableHighlightFloatingButton","enableUpdatedAddImage","enableNewAltTextWhenAddingImage","mlManager","editorUndoBar","supportsPinchToZoom","isEditing","hasSelectedEditor","hasSelectedText","_eventBus","_on","onEditingAction","onPageChanging","onScaleChanging","onRotationChanging","onSetPreference","updateParams","_addSelectionListener","_addDragAndDropListeners","_addKeyboardManager","annotationStorage","filterFactory","viewParameters","realScale","PDF_TO_CSS_UNITS","isShiftKeyDown","_editorUndoBar","_supportsPinchToZoom","_classPrivateFieldGet5","_classPrivateFieldGet6","_classPrivateFieldGet7","_classPrivateFieldGet8","_this$_editorUndoBar","layer","combinedSignal","ac","AbortSignal","any","useNewAltTextFlow","useNewAltTextWhenAddingImage","hcmFilter","addHCMFilter","foreground","background","highlightColorNames","setCurrentDrawingSession","disableUserSelect","setMainHighlightColorPicker","editAltText","_classPrivateFieldGet9","switchToMode","setPreference","pageNumber","focusMainContainer","findParent","layerX","layerY","addShouldRescale","removeShouldRescale","_classPrivateFieldGet0","commitOrRemove","pagesRotation","methodOfCreation","getSelection","isCollapsed","anchorNode","anchorOffset","focusNode","focusOffset","textLayer","_getAnchorElementForSelection","getSelectionBoxes","_getLayerForTextLayer","isNoneMode","createAndAddNewEditor","showAllEditors","addToAnnotationStorage","setValue","_onSelectEnd","hasSelection","lastEditor","lastActiveElement","addEditListeners","_addCopyPasteListeners","removeEditListeners","_removeKeyboardManager","_removeCopyPasteListeners","dragOver","dataTransfer","isHandlingMimeForPasting","dropEffect","paste","currentLayer","_classPrivateFieldGet1","editors","serialized","clipboardData","cut","newEditors","deserializedEditor","deserialize","_addEditorToLayer","_selectEditors","addCommands","isEditorHandlingKeyboard","keyup","setEditingState","_addFocusManager","_dispatchUpdateStates","_isEmpty","_removeFocusManager","registerEditorTypes","_dispatchUpdateUI","defaultPropertiesToUpdate","getId","getLayer","pageIndex","currentPageIndex","addLayer","enable","removeLayer","updateMode","editId","isFromKeyboard","_this$_editorUndoBar2","withResolvers","_disableAll","_enableAll","annotationElementId","setSelected","enterInEditMode","unselect","canCreateNewEmptyEditor","addNewEditor","updateToolbar","_classPrivateFieldGet10","updateColor","updateDefaultParams","_classPrivateFieldGet11","_classPrivateFieldGet12","enableWaiting","mustWait","disableClick","enableClick","getEditors","getEditor","addEditor","removeEditor","_classPrivateFieldGet13","addDeletedAnnotationElement","addChangedExistingAnnotation","deleted","isDeletedAnnotationElement","removeDeletedAnnotationElement","removeChangedExistingAnnotation","setActiveEditor","propertiesToUpdate","updateUI","_get_lastSelectedEditor","updateUIForDefaultProperties","toggleSelected","_classPrivateFieldGet14","ed","firstSelectedEditor","_this$_editorUndoBar3","cleanUndoStack","_this$currentLayer","drawingEditor","endDrawingSession","_this$_editorUndoBar4","_classPrivateFieldGet15","commit","_classPrivateFieldGet16","totalX","totalY","translateInPage","setUpDragSession","savedX","savedY","savedPageIndex","newX","newY","newPageIndex","endDragSession","mustBeAddedInUndoStack","_setParentAndPosition","dragSelectedEditors","tx","ty","drag","rebuild","changeParent","addOrRebuild","_this$getActive","getActive","shouldGetKeyboardEvents","isActive","getMode","imageManager","rangeCount","getRangeAt","rotator","_classPrivateFieldGet17","_ref11","renderAnnotationElement","annotation","_classPrivateFieldGet18","editorId","getRawValue","hasBeenModified","_ref85","TEXT_NODE","hasTextLayer","_displayHighlightToolbar","_selectionChange","_classPrivateFieldGet79","_classPrivateFieldGet77","_classPrivateFieldGet78","activeLayer","toggleDrawing","_classPrivateFieldGet80","_classPrivateFieldGet81","_classPrivateFieldGet82","_ref86","promises","AltText","_AltText_brand","_altText2","_altTextDecorative","_altTextButton","_altTextButtonLabel","_altTextTooltip","_altTextTooltipTimeout","_altTextWasFromKeyBoard","_badge","_editor2","_guessedText","_textWithDisclaimer","_useNewAltTextFlow","_l10nNewButton","missing","review","initialize","l10n","_AltText$_l10n","_l10n","_reportTelemetry","_get_label","_setState","focusVisible","guessedText","setGuessedText","generatedAltText","toggleAltTextBadge","_classPrivateFieldGet19","badge","isForCopying","decorative","textWithDisclaimer","_ref12","_classPrivateFieldGet20","_classPrivateFieldGet21","_classPrivateFieldGet83","_classPrivateFieldGet84","_classPrivateFieldGet85","DELAY_TO_SHOW_TOOLTIP","_classPrivateFieldGet86","getImageForAltText","TouchManager","isPinchingDisabled","isPinchingStopped","onPinchStart","onPinching","onPinchEnd","_ref13","_TouchManager_brand","_container2","_isPinching","_isPinchingStopped","_isPinchingDisabled","_onPinchStart","_onPinching","_onPinchEnd","_signal2","_touchInfo","_touchManagerAC","_touchMoveAC","_onTouchStart","MIN_TOUCH_DISTANCE_TO_PINCH","_classPrivateFieldGet22","_classPrivateFieldGet87","_classPrivateFieldGet89","_classPrivateFieldGet88","_onTouchMove","_onTouchEnd","touch0","touch1","touch0X","touch0Y","touch1X","touch1Y","_classPrivateFieldGet90","screen0X","screen0Y","screen1X","screen1Y","touchInfo","pTouch0X","pTouch0Y","pTouch1X","pTouch1Y","prevGapX","prevGapY","currGapX","currGapY","distance","hypot","pDistance","_classPrivateFieldGet91","_TouchManager","AnnotationEditor","_resizerKeyboardManager","_resizeWithKeyboard","_stopResizingWithKeyboard","parameters","_AnnotationEditor_brand","_accessibilityData","_allResizerDivs","_altText3","_disabled","_dragPointerId","_dragPointerType","_keepAspectRatio","_resizersDiv","_lastPointerCoords","_savedDimensions","_focusAC","_focusedResizerName","_hasBeenClicked","_initialRect","_isEditing","_isInEditMode","_isResizerEnabledForKeyboard","_moveInDOMTimeout","_prevDragX","_prevDragY","_telemetryTimeouts","_touchManager","_isDraggable","_zIndex","_willKeepAspectRatio","_initialOptions","isCentered","_structTreeParentId","pageRotation","pageDimensions","pageTranslation","parentDimensions","isAttachedToDOM","isDrawer","_defaultLineColor","_colorManager","deleteAnnotationElement","fakeEditor","FakeEditor","getNextId","_AnnotationEditor$_l","_l10nResizer","topMiddle","topRight","middleRight","bottomMiddle","bottomLeft","middleLeft","_borderLineWidth","_value","mime","_this$div","parentRotation","fixAndSetPosition","setInBackground","setInForeground","setParent","_stopResizing","focusin","focusout","_this$parent","isMultipleSelection","setAt","screenToPageTranslation","_translate","scrollIntoView","findNewParent","bx","getBaseTranslation","_onTranslating","_onTranslated","_hasBeenMoved","_hasBeenResized","_mustFixPosition","moveInDOM","pageTranslationToScreen","parentScale","setDims","fixDims","widthPercent","endsWith","heightPercent","getInitialTranslation","_onResized","_round","_onResizing","altTextFinish","_classPrivateFieldGet23","addEditToolbar","_editToolbar","removeEditToolbar","_classPrivateFieldGet24","addContainer","_this$_editToolbar","editToolbarDiv","getClientDimensions","addAltTextButton","altTextData","_classPrivateFieldGet25","guessedAltText","_classPrivateFieldGet26","setGuessedAltText","_classPrivateFieldGet27","serializeAltText","_classPrivateFieldGet28","hasAltText","hasAltTextData","_classPrivateFieldGet29","_classPrivateFieldGet30","_this$_uiManager$_edi","_isVisible","_addFocusListeners","maxHeight","isResizable","_touchPinchStartCallback","_touchPinchCallback","_touchPinchEndCallback","_setUpDragSession","_selectOnPointerEvent","_onStartDragging","_onStopDragging","_this$parent2","moveEditorInDOM","getRect","shiftX","shiftY","getRectInCurrentCoords","onceAdded","enableEditMode","disableEditMode","isInEditMode","needsToBeRebuilt","isOnScreen","_angle","serializeDeleted","_this$_initialData","popupRef","_initialData","accessibilityData","_classPrivateFieldGet31","_classPrivateFieldGet32","makeResizable","_createResizers","savedWidth","savedHeight","boundResizerKeydown","_resizerKeydown","boundResizerBlur","_resizerBlur","_resizerFocus","firstPosition","nextFirstPosition","child","_setResizerTabIndex","_resizerPointermove","fromKeyboard","_this$div2","_this$_editToolbar3","_classPrivateFieldGet33","_this$div3","_this$_editToolbar2","_classPrivateFieldGet34","_this$div4","_this$div5","_this$_editToolbar4","_classPrivateFieldGet35","disableEditing","enableEditing","contentDiv","setAspectRatio","MIN_SIZE","telemetryInitialData","telemetryFinalData","_telemetryTimeout","resetAnnotationElement","_ref87","_rotatePoint","angle","_getRotationMatrix","classes","_resizerPointerdown","_classPrivateFieldGet92","savedDraggable","togglePointerEvents","savedParentCursor","savedCursor","pointerUpCallback","_classPrivateFieldGet93","_addResizeToUndoStack","_resize","rotationMatrix","transf","invRotationMatrix","getPoint","getOpposite","isDiagonal","isHorizontal","point","oppositePoint","transfOppositePoint","oppositeX","oppositeY","ratioX","ratioY","lastScreenX","lastScreenY","invTransf","oldDiag","_classPrivateFieldGet94","_origin","prevDistance","transfCenterPoint","newTransfCenterPoint","_classPrivateFieldGet95","hasDraggingStarted","cancelDrag","isPrimary","_event$relatedTarget","_AnnotationEditor","SEED","MASK_HIGH","MASK_LOW","MurmurHash3_64","h1","h2","ArrayBuffer","isView","byteLength","blockCounts","tailLength","dataUint32","k1","k2","C1","C2","C1_LOW","C2_LOW","hexdigest","SerializableEmpty","transfer","_modified","_modifiedIds","_storage","_AnnotationStorage_brand","AnnotationStorage","onSetModified","onResetModified","onAnnotationEditor","getValue","resetModified","entry","_setModified","setAll","print","PrintAnnotationStorage","serializable","hasBitmap","editorStats","stats","typeToEditor","_stats","_counters$get","counters","computeTelemetryFinalData","resetModifiedIds","modifiedIds","ids","_serializable","structuredClone","FontLoader","styleElement","_ref14","_systemFonts","_document","nativeFontFaces","loadingRequests","loadTestFontId","addNativeFontFace","nativeFontFace","fonts","removeNativeFontFace","insertRule","styleSheet","sheet","cssRules","loadSystemFont","systemFontInfo","_inspectFont","_ref15","loadedName","disableFontFace","isFontLoadingAPISupported","fontFace","FontFace","baseFontName","font","missingFile","createNativeFontFace","loaded","family","createFontFaceRule","isSyncFontLoadingSupported","_queueLoadingCallback","_prepareFontLoadEvent","_this$_document","_navigator3","otherRequest","_loadTestFont","int32","spliceString","XXXX_VALUE","checksum","fontFamily","isFontReady","fillText","FontFaceObject","translatedData","_ref16","fontExtraProperties","inspectFont","compiledGlyphs","_this$_inspectFont","cssFontInfo","weight","italicAngle","_this$_inspectFont2","mimetype","getPathGenerator","objs","character","objId","cmds","Path2D","onFn","wrapReason","_messageAC","_MessageHandler_brand","MessageHandler","sourceName","targetName","comObj","callbackId","streamId","streamSinks","streamControllers","callbackCapabilities","actionHandler","_onMessage","actionName","ah","transfers","postMessage","sendWithPromise","capability","sendWithStream","queueingStrategy","ReadableStream","controller","startCapability","startCall","pullCall","cancelCall","isClosed","desiredSize","pull","pullCapability","cancelCapability","_classPrivateFieldGet36","_ref88","_processStreamMessage","_createStreamSink","streamSink","isCancelled","lastDesiredSize","sinkCapability","onPull","streamController","_deleteStreamController","dataReason","_streamController$sta","_streamController$pul","_streamController$can","BaseCanvasFactory","enableHWA","_ref17","_enableHWA","_createCanvas","canvasAndContext","BaseCMapReaderFactory","isCompressed","_ref19","_ref20","_fetch","cMapData","DOMCMapReaderFactory","BaseFilterFactory","addFilter","maps","fgColor","bgColor","addAlphaFilter","addLuminosityFilter","addHighlightHCMFilter","filterName","newFgColor","newBgColor","_baseUrl","_cache2","_defs","_docId","_hcmCache","_id3","_DOMFilterFactory_brand","_get_cache","_get_hcmCache","_get_defs","contain","svg","createElementNS","_createTables","mapR","mapG","mapB","bufferR","bufferG","bufferB","_createUrl","_addLuminosityConversion","feColorMatrix","_addGrayConversion","_createFilter","_appendFeFunc","feComponentTransfer","feFunc","_addTransferMapConversion","rTable","gTable","bTable","_addTransferMapAlphaConversion","aTable","_getRGB","BaseStandardFontDataFactory","_ref22","_ref23","DOMStandardFontDataFactory","fs","getBuiltinModule","readFile","PathType","applyBoundingBox","bbox","BaseShadingPattern","getPattern","RadialAxialShadingPattern","_bbox","_colorStops","_p0","_p1","_r0","_r1","_createGradient","grad","createLinearGradient","createRadialGradient","colorStop","addColorStop","inverse","pathType","ownerBBox","getClippedPathBoundingBox","tmpCanvas","cachedCanvases","getCanvas","tmpCtx","clearRect","beginPath","baseTransform","fillStyle","createPattern","domMatrix","DOMMatrix","setTransform","drawTriangle","c3","coords","rowSize","c1r","c1g","c1b","c2r","c2g","c2b","c3r","c3g","c3b","minY","maxY","xa","car","cag","cab","xb","cbr","cbg","cbb","x1_","x2_","drawFigure","figure","ps","cs","verticesPerRow","rows","cols","MeshShadingPattern","_coords","_figures","_bounds","_background","_createMeshCanvas","combinedScale","backgroundColor","boundsWidth","boundsHeight","paddedWidth","BORDER_SIZE","paddedHeight","createImageData","putImageData","matrixScale","temporaryPatternCanvas","DummyShadingPattern","TilingPattern","canvasGraphicsFactory","operatorList","xstep","ystep","paintType","tilingType","createPatternCanvas","curMatrixScale","combinedScaleX","combinedScaleY","canvasWidth","canvasHeight","redrawHorizontally","redrawVertically","xScaledStep","yScaledStep","dimx","getSizeAndScale","dimy","graphics","createCanvasGraphics","groupLevel","setFillAndStrokeStyleToContext","clipBbox","executeOperatorList","endDrawing","dimx2","dimy2","xSize","ySize","tmpCanvas2","tmpCtx2","jj","realOutputSize","MAX_PATTERN_SIZE","bboxWidth","bboxHeight","updateRectMinMax","strokeStyle","fillColor","strokeColor","cssColor","convertBlackAndWhiteToRGBA","srcPos","nonBlackColor","inverseDecode","_ref24","black","zeroMapping","oneMapping","widthInSource","widthRemainder","srcLength","destPos","FULL_CHUNK_HEIGHT","CachedCanvases","canvasFactory","canvasEntry","drawImageAtIntegerCoords","srcImg","srcX","srcY","srcW","srcH","destX","destY","destW","destH","tlX","rTlX","tlY","rTlY","brX","rWidth","brY","rHeight","CanvasExtraState","alphaIsShape","fontSize","fontSizeScale","textMatrix","textMatrixScale","fontMatrix","leading","lineX","lineY","charSpacing","wordSpacing","textHScale","textRenderingMode","textRise","patternFill","patternStroke","fillAlpha","strokeAlpha","lineWidth","activeSMask","transferMaps","startNewPathAndClipBox","clipBox","setCurrentPoint","updatePathMinMax","minX","maxX","updateScalingPathMinMax","updateCurvePathMinMax","getPathBoundingBox","xStrokePad","yStrokePad","updateClipFromPath","isEmptyClip","Infinity","putBinaryImageData","imgData","ImageData","partialChunkHeight","fullChunks","totalChunks","chunkImgData","thisChunkHeight","elemsInThisChunk","dest32","dest32DataLength","fullSrcDiff","white","srcDiff","kEnd","kEndUnrolled","srcByte","putBinaryImageMask","copyCtxState","sourceCtx","destCtx","setLineDash","getLineDash","lineDashOffset","resetCtxToDefault","fillRule","globalAlpha","lineCap","lineJoin","miterLimit","globalCompositeOperation","getImageSmoothingEnabled","interpolate","fround","actualScale","LINE_CAP_STYLES","LINE_JOIN_STYLES","NORMAL_CLIP","EO_CLIP","_CanvasGraphics_brand","CanvasGraphics","canvasCtx","commonObjs","_ref26","annotationCanvasMap","optionalContentConfig","markedContentStack","stateStack","pendingClip","pendingEOFill","xobjs","groupStack","processingType3","baseTransformStack","smaskStack","smaskCounter","tempSMask","suspendedCtx","contentVisible","cachedPatterns","viewportScale","outputScaleX","outputScaleY","_cachedScaleForStroking","_cachedGetSinglePixelWidth","_cachedBitmapsMap","getObject","beginDrawing","transparency","_ref27","savedFillStyle","fillRect","transparentCanvas","compositeCtx","executionStartIdx","continueCallback","stepper","argsArray","fnArray","argsArrayLen","chunkOperations","endTime","steps","fnId","nextBreakPoint","breakIt","depObjId","objsPool","_restoreInitialState","HTMLCanvasElement","_drawFilter","_scaleImage","_img$width","_img$height","displayWidth","displayHeight","widthScale","heightScale","paintWidth","paintHeight","tmpCanvasId","_createMaskCanvas","isPatternFill","currentTransform","maskCanvas","mainKey","cachedImage","maskToCanvas","drawnWidth","drawnHeight","fillCanvas","fillCtx","imageSmoothingEnabled","dashArray","dashPhase","intent","flatness","checkSMaskState","inSMaskMode","beginSMaskMode","endSMaskMode","cacheId","scratchCanvas","_removeMirroring","__originalSave","__originalRestore","__originalRotate","__originalScale","__originalTranslate","__originalTransform","__originalSetTransform","__originalResetTransform","resetTransform","__originalClip","__originalMoveTo","__originalLineTo","__originalBezierCurveTo","bezierCurveTo","__originalRect","__originalClosePath","__originalBeginPath","cp1x","cp1y","cp2x","cp2y","compose","dirtyBox","smask","composeSMask","layerCtx","layerBox","layerOffsetX","layerOffsetY","layerWidth","layerHeight","genericComposeSMask","subtype","transferMap","maskCtx","maskOffsetX","maskOffsetY","maskX","maskY","backdropRGB","isScalingMatrix","minMaxForBezier","xw","yh","consumePath","rescaleAndStroke","needRestore","paths","pendingTextPaths","newPath","addPath","preMultiplySelf","fontRefName","_fontObj$systemFontIn","fontObj","fontDirection","isType3Font","typeface","fallbackName","bold","italic","browserFontSize","rise","paintChar","patternFillTransform","patternStrokeTransform","fillStrokeMode","isAddToPathSet","_getScaledPath","strokeText","isFontSubpixelAAEnabled","glyphs","showType3Text","glyphsLength","vertical","spacingDir","defaultVMetrics","widthAdvanceScale","simpleFillText","getSinglePixelWidth","isInvalidPDFjsFont","chars","glyph","unicode","restoreNeeded","fontChar","accent","scaledX","scaledY","vmetric","vx","vy","remeasure","measuredWidth","measureText","characterScaleX","isInFont","scaledAccentX","scaledAccentY","spacingLength","charProcOperatorList","operatorListId","xWidth","yWidth","llx","lly","urx","ury","getColorN_Pattern","_getPattern","inv","currentCtx","isolated","knockout","bounds","canvasBounds","groupCtx","startTransformInverse","currentMtx","hasOwnCanvas","annotationCanvas","savedCtx","POINT_TYPES","width1","j0","points","lineSize","Int32Array","p0","pp","skewX","skewY","trans","applyTransferMapsToCanvas","applyTransferMapsToBitmap","imgToPaint","isContentVisible","absDet","normX","normY","getScaleForStroking","scaledLineWidth","scaledXLineWidth","scaledYLineWidth","baseArea","saveRestore","dashes","hcmFilterId","savedFilter","multiplySelf","GlobalWorkerOptions","workerPort","_port","Worker","workerSrc","_src","Metadata","parsedData","_ref28","_metadataMap","_data3","getRaw","_classPrivateFieldGet41","INTERNAL","_isDisplay","_isPrint","_userSet","_visible","OptionalContentGroup","renderingIntent","_ref29","usage","rbGroups","viewState","printState","_setVisible","internal","userSet","_cachedGetHash","_groups","_initialHash","_order","_OptionalContentConfig_brand","OptionalContentConfig","creator","baseState","getHash","expression","_evaluateVisibilityExpression","setVisibility","preserveRB","rbGroup","otherId","_classPrivateFieldGet42","setOCGState","_ref30","hasInitialVisibility","getOrder","getGroups","getGroup","PDFDataTransportStream","pdfDataRangeTransport","_ref31","disableRange","disableStream","initialData","progressiveDone","contentDispositionFilename","_queuedChunks","_progressiveDone","_contentDispositionFilename","_pdfDataRangeTransport","_isStreamingSupported","_isRangeSupported","_contentLength","_fullRequestReader","_rangeReaders","addRangeListener","begin","_onReceiveData","addProgressListener","_onProgress","addProgressiveReadListener","addProgressiveDoneListener","_onProgressiveDone","transportReady","_ref32","_enqueue","rangeReader","_begin","_progressiveDataLength","_this$_fullRequestRea","_this$_fullRequestRea2","_loaded","_this$_rangeReaders$","_this$_rangeReaders$$","_this$_fullRequestRea3","_this$_fullRequestRea4","_this$_fullRequestRea5","_removeRangeReader","getFullReader","queuedChunks","PDFDataTransportStreamReader","getRangeReader","PDFDataTransportStreamRangeReader","requestDataRange","cancelAllRequests","_this$_fullRequestRea6","_stream","_done","_filename","_requests","_headersReady","headersReady","isRangeSupported","isStreamingSupported","contentLength","requestCapability","_end","_queuedChunk","createHeaders","isHttp","httpHeaders","Headers","getResponseOrigin","validateRangeRequestCapabilities","rangeChunkSize","_ref33","returnValues","allowRangeRequests","suggestedLength","extractFilenameFromHeader","contentDisposition","needsEncodingFixup","toParamRegExp","rfc2616unquote","rfc5987decode","rfc2047decode","fixupEncoding","contentDispositionStr","iter","quot","attributePattern","textdecode","encoding","fatal","quotindex","extvalue","encodingend","hex","createResponseStatusError","validateResponseStatus","createFetchOptions","withCredentials","abortController","credentials","redirect","getArrayBuffer","PDFFetchStream","_rangeRequestReaders","_this$_fullRequestRea7","_this$_fullRequestRea8","PDFFetchStreamReader","PDFFetchStreamRangeReader","_this$_fullRequestRea9","_reader","_withCredentials","_headersCapability","_disableRange","_rangeChunkSize","_responseOrigin","_this$onProgress","_this$_reader","_readCapability","responseOrigin","_this$onProgress2","_this$_reader2","NetworkManager","_ref34","currXhrId","pendingRequests","xhrId","pendingRequest","expectedStatus","onStateChange","onprogress","onHeadersReceived","onDone","_pendingRequest$onPro","xhrStatus","rangeHeader","getRequestXhr","isPendingRequest","abortRequest","PDFNetworkStream","_source","_manager","_onRangeRequestReaderClosed","PDFNetworkStreamFullRequestReader","PDFNetworkStreamRangeRequestReader","onClosed","_this$_fullRequestRea0","manager","_url","_fullRequestId","_onHeadersReceived","_onDone","_onError","_cachedChunks","_storedError","fullRequestXhrId","fullRequestXhr","responseURL","rawResponseHeaders","_this$onProgress3","lengthComputable","_requestId","_this$_manager$getReq","_close","_this$onClosed","_this$_storedError","_this$onProgress4","urlRegex","PDFNodeStream","sourceUrl","pathToFileURL","_this$_fullRequestRea1","_this$_fullRequestRea10","PDFNodeStreamFsFullReader","PDFNodeStreamFsRangeReader","_this$_fullRequestRea11","_readableStream","lstat","stat","_setReadableStream","createReadStream","_this$onProgress5","_error","readableStream","_this$onProgress6","DEFAULT_FONT_SIZE","_capability","_container4","_disableProcessItems","_fontInspectorEnabled","_lang","_layoutTextParams","_pageHeight3","_pageWidth3","_rootContainer","_rotation3","_scale","_styleCache","_textContentItemsStr","_textContentSource","_textDivs","_textDivProperties","_transform","_TextLayer_brand","TextLayer","_globalThis$FontInspe","textContentSource","_ref35","FontInspector","_pendingTextLayers","fontFamilyMap","pump","_ref36","_classPrivateFieldGet43","_processItems","onBefore","_ref37","_layout","_classPrivateFieldGet44","abortEx","textDivs","textContentItemsStr","_ascentCache","_canvasContexts","_classPrivateFieldGet96","_classPrivateFieldGet97","_appendText","geom","textDiv","textDivProperties","hasText","hasEOL","atan2","fontName","fontSubstitution","fontHeight","fontAscent","_getAscent","sin","scaleFactorStr","_minFontSize","fontSubstitutionLoadedName","shouldScaleText","absScaleX","absScaleY","br","_getCtx","alpha","_canvasCtxFonts","_ensureCtxFont","_ensureMinFontSizeComputed","cachedAscent","metrics","ascent","fontBoundingBoxAscent","descent","fontBoundingBoxDescent","pixels","_TextLayer","XfaText","xfa","walk","_node$attributes","shouldBuildText","DefaultCanvasFactory","createRequire","import","createCanvas","_ref18","DefaultCMapReaderFactory","DefaultFilterFactory","docId","_ref21","_this$id7","_this$id8","tableR","tableG","tableB","_info","_info$filter","fgRGB","bgRGB","getSteps","_this$id9","_this$id0","tableA","_this$id1","_this$id10","_info2","_info$filter2","fgGray","bgGray","newFgRGB","newBgRGB","fg","bg","newStart","newStep","_classPrivateFieldGet37","_classPrivateFieldGet38","_classPrivateFieldGet39","_classPrivateFieldGet40","DefaultStandardFontDataFactory","getDocument","_src$password","_src$length","PDFDocumentLoadingTask","rangeTransport","PDFDataRangeTransport","worker","PDFWorker","docBaseUrl","cMapUrl","cMapPacked","CMapReaderFactory","standardFontDataUrl","StandardFontDataFactory","ignoreErrors","stopAtErrors","maxImageSize","chrome","canvasMaxAreaInBytes","enableXfa","disableAutoFetch","pdfBug","CanvasFactory","FilterFactory","useSystemFonts","useWorkerFetch","transportFactory","cMapReaderFactory","standardFontDataFactory","workerParams","port","fromPort","_worker","docParams","apiVersion","evaluatorOptions","transportParams","loadingParams","workerIdPromise","messageHandler","networkStream","NetworkStream","Response","workerId","WorkerTransport","_transport","isRefProxy","ref","gen","_PDFDocumentLoadingTa","_PDFDocumentLoadingTa2","_docId2","onPassword","_this$_worker3","_this$_worker","_this$_transport","_pendingDestroy","_this$_worker2","_rangeListeners","_progressListeners","_progressiveReadListeners","_progressiveDoneListeners","_readyCapability","onDataRange","onDataProgress","onDataProgressiveRead","onDataProgressiveDone","PDFDocumentProxy","pdfInfo","_pdfInfo","numPages","fingerprints","isPureXfa","_htmlForXfa","allXfaHtml","getPage","getPageIndex","getDestinations","getDestination","getPageLabels","getPageLayout","getPageMode","getViewerPreferences","getOpenAction","getAttachments","getJSActions","getDocJSActions","getOutline","getOptionalContentConfig","getRenderingIntent","getPermissions","getMetadata","getMarkInfo","saveDocument","getDownloadInfo","downloadInfoCapability","keepLoadedFonts","startCleanup","loadingTask","cachedPageNumber","getFieldObjects","hasJSActions","getCalculationOrderIds","_delayedCleanupTimeout","_pendingCleanup","_PDFPageProxy_brand","PDFPageProxy","pageInfo","_pageIndex","_pageInfo","_pdfBug","PDFObjects","_maybeCleanupAfterRender","_intentStates","getViewport","getAnnotations","getPageJSActions","getXfa","_this$_transport$_htm","_this$_stats","_intentState","canvasContext","annotationMode","optionalContentConfigPromise","printAnnotationStorage","_ref38","intentArgs","_abortDelayedCleanup","intentState","streamReaderCancelTimeout","intentPrint","_this$_stats2","displayReadyCapability","lastChunk","separateAnnots","_pumpOperatorList","_globalThis$Stats","renderTasks","internalRenderTask","_tryCleanup","_abortOperatorList","Stats","InternalRenderTask","useRequestAnimationFrame","renderTask","_ref39","_this$_stats3","initializeGraphics","operatorListChanged","getOperatorList","opListTask","_intentState2","_this$_stats4","opListReadCapability","streamTextContent","includeMarkedContent","disableNormalization","highWaterMark","getTextContent","_ref40","_textContent$lang","getStructTree","waitOn","resetStats","_startRenderPage","_this$_stats5","_intentState$displayR","_renderPageChunk","operatorListChunk","annotationStorageSerializable","_ref41","streamReader","_ref42","_ref43","curCacheKey","curIntentState","delayed","_deferred","LoopbackPort","rmAbort","onAbort","terminate","_PDFWorker_brand","_webWorker","_messageHandler","_workerPorts$_","_workerPorts","_initializeFromPort","_initialize","_resolve","_isWorkerDisabled","_get_mainThreadWorkerMessageHandler","_setupFakeWorker","_isSameOrigin","_createCDNWrapper","terminateEarly","sendTest","testObj","_setupFakeWorkerGlobal","WorkerMessageHandler","_PDFWorker$fakeWorker","_PDFWorker$fakeWorker2","_fakeWorkerId","workerHandler","_this$_webWorker","_workerPorts$_2","_this$_messageHandler","_assertClassBrand$_","cachedPort","_globalThis$pdfjsWork","pdfjsWorker","_PDFWorker","otherUrl","wrapper","_methodPromises","_pageCache","_pagePromises","_pageRefCache","_passwordCapability","_WorkerTransport_brand","fontLoader","_params","destroyCapability","_networkStream","_fullReader","_lastProgress","setupMessageHandler","isOpList","modifiedIdsHash","_classPrivateFieldGet45","page","terminated","_this$_networkStream","_this$messageHandler","sink","_ref44","readyReason","_loadingTask$onProgre","_loadingTask$onProgre2","_ref45","_ref46","_numPages","htmlForXfa","updatePassword","_loadingTask$onProgre3","_ref47","_globalThis$FontInspe2","exportedData","exportedError","fontAdded","imageRef","pageProxy","dataLen","_ref48","_imageData$bitmap","_loadingTask$onProgre4","_this$_fullReader$fil","_this$_fullReader","cachedPromise","refStr","_cacheSimpleMethod","_this$_fullReader$fil2","_this$_fullReader2","_this$_fullReader$con","_this$_fullReader3","metadata","_classPrivateFieldGet46","INITIAL_DATA","_objs","_PDFObjects_brand","_ensureObj","_data$bitmap","_classPrivateFieldGet98","_internalRenderTask","RenderTask","onContinue","form","_rAF","_ref49","operatorListIdx","running","graphicsReadyCallback","graphicsReady","_useRequestAnimationFrame","cancelled","_cancelBound","_continueBound","_continue","_scheduleNextBound","_scheduleNext","_nextBound","_canvas","_globalThis$StepperMa","_this$graphicsReadyCa","_ref50","_canvasInUse","StepperManager","getNextBreakPoint","gfx","_this$gfx","_this$stepper","updateOperatorList","makeColorComp","scaleAndClamp","ColorConverters","CMYK_G","_ref51","G_CMYK","_ref52","G_RGB","_ref53","G_rgb","_ref54","G_HTML","_ref55","RGB_G","_ref56","RGB_rgb","RGB_HTML","T_HTML","T_rgb","CMYK_RGB","_ref57","CMYK_rgb","_ref58","CMYK_HTML","components","RGB_CMYK","_ref59","BaseSVGFactory","skipDimensions","_createSVG","DOMSVGFactory","XfaLayer","setupStorage","storage","storedData","xfaOn","xfaOff","setAttributes","linkService","_ref60","isHTMLAnchorElement","addLinkAttributes","newWindow","dataId","xfaHtml","rootHtml","isNotForRichText","rootDiv","_child$attributes","_child$children","childHtml","xmlns","DEFAULT_TAB_INDEX","GetElementsByNameSet","getRectDims","AnnotationElementFactory","annotationType","LinkAnnotationElement","TextAnnotationElement","fieldType","TextWidgetAnnotationElement","radioButton","RadioButtonWidgetAnnotationElement","checkBox","CheckboxWidgetAnnotationElement","PushButtonWidgetAnnotationElement","ChoiceWidgetAnnotationElement","SignatureWidgetAnnotationElement","WidgetAnnotationElement","PopupAnnotationElement","FreeTextAnnotationElement","LineAnnotationElement","SquareAnnotationElement","CircleAnnotationElement","PolylineAnnotationElement","CaretAnnotationElement","InkAnnotationElement","PolygonAnnotationElement","HighlightAnnotationElement","UnderlineAnnotationElement","SquigglyAnnotationElement","StrikeOutAnnotationElement","StampAnnotationElement","FileAttachmentAnnotationElement","AnnotationElement","_updates","_hasBorder","_popupElement","_AnnotationElement_brand","isRenderable","ignoreBorder","createQuadrilaterals","downloadManager","imageResourcesPath","renderForms","svgFactory","enableScripting","_fieldObjects","fieldObjects","_createContainer","_createQuadrilaterals","_hasPopupData","titleObj","contentsObj","richText","_ref61","_isEditable","isEditable","hasPopupData","updateEdited","_classPrivateFieldGet47","_setRectEdited","popup","resetEdited","_classPrivateFieldGet48","alternativeText","noRotate","setRotation","borderStyle","borderWidth","horizontalRadius","horizontalCornerRadius","verticalRadius","verticalCornerRadius","radius","borderRadius","borderBottomStyle","borderColor","elementWidth","elementHeight","_commonActions","setColor","jsName","styleName","colorType","colorArray","noView","noPrint","userName","readonly","required","_setRequired","textColor","_dispatchEventFromSandbox","jsEvent","commonActions","_setDefaultPropertiesFromJS","quadPoints","rectBlX","rectBlY","rectTrX","rectTrY","trX","trY","blX","blY","svgBuffer","defs","clipPath","_svgBuffer","rectWidth","rectHeight","backgroundImage","_createPopup","modificationDate","_getElementsByName","skipId","fields","fieldObj","exportValues","exportValue","domElement","_this$popup","maybeShow","_this$popup2","forceHide","getElementsToTriggerPopup","addHighlightArea","triggers","_editOnDoubleClick","annotationEditorType","_this$linkService$eve","currentRect","_LinkAnnotationElement_brand","isTooltipOnly","link","isBound","_bindNamedAction","attachment","_bindAttachment","attachmentDest","_bindSetOCGState","_bindLink","Action","_bindJSAction","resetForm","_bindResetFormAction","getDestinationHash","onclick","goToDestination","_setInternalLink","getAnchorUrl","executeNamedAction","_this$linkService$eve2","otherClickAction","resetFormFields","refs","resetFormRefs","include","allFields","fieldIds","fieldName","allIds","_this$linkService$eve3","_this$downloadManager","openOrDownloadData","executeSetOCGState","showElementAndHideCanvas","_element$previousSibl","previousSibling","_getKeyModifier","_setEventListener","elementData","baseName","valueGetter","_this$linkService$eve4","_this$linkService$eve5","focused","_this$data$actions","_this$data$actions2","_this$data$actions3","Blur","Focus","_setBackgroundColor","_setTextStyle","fontColor","defaultAppearanceData","computedFontSize","roundToOneDecimal","multiLine","textAlignment","textAlign","hasAppearance","fieldValue","setPropertyOnSiblings","keyInStorage","_this$data$textConten","maxLen","charLimit","fieldFormattedValues","formattedValue","comb","userValue","lastCommittedValue","commitKey","doNotScroll","readOnly","maxLength","_this$data$defaultFie","defaultFieldValue","blurListener","_this$data$actions6","_this$data$actions4","_event$detail$value","selRange","setSelectionRange","_this$linkService$eve6","willCommit","selStart","selectionStart","selEnd","selectionEnd","_this$linkService$eve7","_blurListener","_this$data$actions5","_this$linkService$eve8","Keystroke","_this$linkService$eve9","inputType","combWidth","verticalAlign","curChecked","buttonValue","pdfButtonValue","linkElement","selectElement","addAnEmptyEntry","combo","multiSelect","multiple","optionElement","displayValue","removeEmptyEntry","noneOptionElement","isExport","selectedValues","_removeEmptyEntry","multipleSelection","selectChild","indices","editable","_this$linkService$eve0","changeEx","PopupElement","elementIds","ariaHasPopup","_boundKeyDown","_boundHide","_boundShow","_boundToggle","_color","_container5","_contentsObj","_dateObj","_elements","_parent","_parentRect","_pinned","_popup","_position2","_rect","_richText","_titleObj","_updates2","_wasVisible","_PopupElement_brand","_ref62","_keyDown","_toggle","flatMap","_element$container","baseColor","outlineColor","BACKGROUND_ENLIGHT","dateObj","_get_html","_formatContents","_ref63","lines","_classPrivateFieldGet49","popupContent","_ref64","_makePopupContent","_classPrivateFieldGet50","_toSetter","_get_fontSize","_classPrivateGetter5","_get_fontColor","_this0","_classPrivateGetter6","popupLines","lineAttributes","_setPosition","useParentRect","normalizedRect","popupLeft","popupTop","textPosition","lineSpan","_line","lineCoordinates","_square","square","_circle","circle","_polyline","containerClassName","svgElementName","vertices","polyline","_polylinesGroupElement","_polylines","_InkAnnotationElement_brand","inkLists","_getTransform","thickness","_FileAttachmentAnnotationElement_brand","_this$linkService$eve1","_download","_this$downloadManager2","_accessibilityManager","_annotationCanvasMap","_editableAnnotations","_structTreeLayer","_AnnotationLayer_brand","AnnotationLayer","accessibilityManager","annotationEditorUIManager","structTreeLayer","_ref65","_annotationEditorUIManager","hasEditableAnnotations","annotations","popupToElements","elementParams","noHTML","isPopupAnnotation","rendered","_this$_annotationEdit","_appendElement","_setAnnotationCanvasMap","_ref66","getEditableAnnotations","getEditableAnnotation","_classPrivateFieldGet99","_classPrivateFieldGet100","contentElement","annotationId","ariaAttributes","getAriaAttributes","moveElementInDOM","EOL_PATTERN","_color2","_content","_editorDivId","_editModeAC","_fontSize","_FreeTextEditor_brand","FreeTextEditor","_translateEmpty","_defaultColor","_defaultFontSize","_internalPadding","_updateFontSize","_updateColor","overlayDiv","editorDiv","contentEditable","editorDivKeydown","editorDivFocus","editorDivBlur","editorDivInput","editorDivPaste","_classPrivateFieldGet51","_this$_initialOptions","savedText","newText","_extractText","setText","_setContent","_setEditorDimensions","baseX","baseY","posX","posY","deleteFromDocument","insertNode","collapseToStart","startContainer","bufferBefore","bufferAfter","newRange","Range","beforeLength","removeAllRanges","addRange","_serializeContent","structTreeParentId","_hasElementChanged","replaceChildren","setFontsize","savedFontsize","savedColor","prevChild","_prevChild","savedDisplay","savedVisibility","_getNodeContent","_deserializeContent","_FreeTextEditor","Outline","toSVGPath","_rotation","_rescale","Float32Array","_rescaleAndSwap","svgRound","_normalizePoint","_normalizePagePoint","createBezierPoints","FreeDrawOutliner","scaleFactor","_ref67","innerMargin","_FreeDrawOutliner_brand","_box","_bottom","_innerMargin","_isLTR2","_last","_lastX","_lastY","_min","_min_dist","_scaleFactor","_thickness","_points","_MIN_DIST","_MIN","_classPrivateFieldGet52","_ref68","diffX","diffY","diffD","nY","thX","thY","_toSVGPathTwoPoints","_toSVGPathEnd","_toSVGPathStart","newFreeDrawOutline","outline","FreeDrawOutline","getOutlines","_classPrivateFieldGet53","_classPrivateFieldGet54","_getOutlineTwoPoints","_getOutlineEnd","_getOutlineStart","_getLastCoords","lastTop","lastBottom","lastTopX","lastTopY","lastBottomX","lastBottomY","_box2","_bbox2","_innerMargin2","_isLTR3","_points2","_scaleFactor2","_outline","_FreeDrawOutline_brand","lastPoint","_computeMinMax","_ref69","newOutliner","getNewOutline","outliner","lastPointX","lastPointY","ltrCallback","HighlightOutliner","_HighlightOutliner_brand","_box3","_lastPoint","_verticalEdges","_intervals","EPSILON","shiftedMinX","shiftedMinY","lastEdge","edge","outlineVerticalEdges","_breakEdge","_insert","_remove","_getOutlines","edges","allEdges","edge1","edge2","outlines","HighlightOutline","_binarySearch","middle","_ref89","_ref90","y4","_box4","_outlines","polygon","prevX","prevY","_ref70","classNamesForOutlining","FreeHighlightOutliner","FreeHighlightOutline","ColorPicker","_hideDropdownFromKeyboard","_colorSelectFromKeyboard","_moveToNext","_moveToPrevious","_moveToBeginning","_moveToEnd","_classPrivateFieldGet55","_ref71","_ColorPicker_brand","_button","_buttonSwatch","_dropdown","_dropdownWasFromKeyboard","_isMainColorPicker","_editor3","_openDropdownAC","_uiManager3","_type2","_l10nColor","blue","green","pink","red","yellow","_openDropdown","_keyDown2","swatch","renderMainDropdown","_getDropdownRoot","_colorSelect","_event$target$nextSib","_classPrivateFieldGet56","_get_isDropdownVisible","_classPrivateFieldGet57","_event$target$previou","_classPrivateFieldGet58","_classPrivateFieldGet59","_classPrivateFieldGet60","_classPrivateFieldGet61","_classPrivateFieldGet62","_classPrivateFieldGet63","_classPrivateFieldGet64","role","_pointerDown3","_classPrivateFieldGet101","_this1","_ColorPicker","HighlightEditor","_moveCaret","_HighlightEditor_brand","_anchorNode","_anchorOffset","_boxes","_clipPathId","_colorPicker2","_focusOutlines","_focusNode","_focusOffset","_highlightDiv","_highlightOutlines","_id4","_isFreeHighlight","_lastPoint2","_opacity","_outlineId","_text","_thickness2","_methodOfCreation","_defaultThickness","_defaultOpacity","highlightId","_createFreeOutlines","_addToDrawLayer","_createOutlines","numberOfColors","_uiManager$highlightC","_updateColor2","_updateThickness","_getRotation","addUndoableEditor","_cleanDrawLayer","mustBeSelected","_this$div6","drawLayer","updateProperties","_keydown","highlightDiv","pointerover","_this$parent3","rootClass","hovered","_this$parent4","_setCaret","_this$parent5","_this$parent6","startHighlighting","_ref72","_endHighlight","_highlightMove","_freeHighlight","_freeHighlightId","clipPathId","_freeHighlightClipId","free","rawWidth","highlightOutlines","_serializeBoxes","_serializeOutlines","_hasElementChanged2","outlinerForOutline","_ref91","finalizeDraw","drawOutline","highlightOutline","setColorAndOpacity","opa","_this$parent12","_classPrivateFieldGet102","savedOpacity","savedThickness","setThickness","_changeThickness","_rotateBbox","_ref92","setPosition","_HighlightEditor","DrawingOptions","_svgProperties","updateProperty","updateSVGProperty","toSVGProperties","updateAll","_drawOutlines","_mustBeCommitted","_DrawingEditor_brand","DrawingEditor","mustBeCommitted","drawOutlines","_createDrawOutlines","_addToDrawLayer2","_mergeSVGProperties","p1Keys","getDefaultDrawingOptions","typesMap","supportMultipleDrawings","_defaultDrawingOptions","_currentParent","_currentDraw","_currentDrawId","_updateProperty","_drawingOptions","savedValue","_this$parent7","_updateBbox","_drawId","_this$parent8","getPathResizingSVGProperties","_convertToDrawSpace","_rotateBox","_this$parent9","getPathResizedSVGProperties","_this$parent0","_this$parent1","getPathTranslatedSVGProperties","_this$parent10","_this$parent11","_cleanDrawLayer2","_this$div7","updateRotation","updateParentDimensions","onScaleChangingWhenDrawing","drawDiv","createDrawerInstance","_x","_parentWidth","_parentHeight","startDrawing","_isLTR","_currentPointerType$_","_uiManager$_editorUnd","_currentPointerType","_currentDrawingAC","_currentPointerId","_currentPointerIds$_","_endDraw","_currentPointerIds","_currentPointerIds$_2","isCancellable","removeLastElement","_drawMove","_currentMoveTimestamp","startNew","_currentDrawingOptions","defaultSVGProperties","_currentPointerIds$_3","_cleanup","drawId","getLastElement","setLastElement","isAborted","_INNER_MARGIN","drawingOptions","createDrawingOptions","deserializeDraw","_pageX","_pageY","_pageWidth","_pageHeight","_innerWidth","serializeDraw","_ref93","defaultProperties","_createDrawing","updateParent","_convertToParentSpace","_ref94","pW","pH","_DrawingEditor","InkDrawOutliner","_InkDrawOutliner_brand","_last2","Float64Array","_line2","_lines","_rotation4","_thickness3","_points3","_lastSVGPath","_lastIndex","_outlines2","InkDrawOutline","_parentWidth2","_parentHeight2","firstX","firstY","secondX","secondY","c1x","c1y","c2x","c2y","_bbox3","_currentRotation","_innerMargin3","_lines2","_parentWidth3","_parentHeight3","_parentScale","_rotation5","_thickness4","_InkDrawOutline_brand","_computeBbox","_ref73","serializedLines","serializedPoints","_getBBoxWithNoMargin","rescaleFn","_ref74","newLines","_updateThickness2","_ref75","oldMarginX","oldMarginY","_getMarginComponents","newMarginX","newMarginY","diffMarginX","diffMarginY","rotationTransform","_ref76","marginX","marginY","PRECISION","s1x","s1y","s2x","s2y","_ref77","_ref78","newParentWidth","newParentHeight","InkDrawingOptions","viewerParameters","_viewParameters","_InkEditor_brand","InkEditor","_ref79","_hasElementChanged3","StampEditor","_StampEditor_brand","_bitmap","_bitmapId","_bitmapPromise","_bitmapUrl","_bitmapFile","_bitmapFileName","_resizeTimeoutId","_isSvg","_hasBeenAddedInUndoStack","bitmapUrl","bitmapFile","supportedTypes","supportedTypesStr","pasteEditor","getAsFile","_this$altTextData","_hasAltTextStats$get","_hasAltTextStats$get2","hasAltTextStats","hasNoAltText","mlGuessAltText","updateAltTextData","isEnabledFor","copyCanvas","guess","channels","_classPrivateFieldGet65","_getBitmap","_drawBitmap","maxDataDimension","maxPreviewDimension","bitmapWidth","bitmapHeight","outputScale","_window$matchMedia","_window","scaledWidth","scaledHeight","_scaleBitmap","boxDim","boxDimWidth","boxDimHeight","patternCtx","dataWidth","dataHeight","offscreenCtx","_await$parent$_struct","structParent","_structTree","bitmapId","_serializeBitmap","_hasElementChanged4","_this$_initialData$st","isSameAltText","stamps","prevData","_getBitmapFetched","fromId","_getBitmapDone","alt_text_modal","alt_text_type","files","_this$_initialOptions2","MAX_RATIO","prevWidth","prevHeight","toUrl","toDataURL","_serialized$accessibi","isSamePageIndex","_StampEditor","AnnotationEditorLayer","annotationLayer","_ref80","_AnnotationEditorLayer_brand","_accessibilityManager2","_allowClick","_annotationLayer","_clickAC","_editorFocusTimeoutId","_editors","_hadPointerDown","_isDisabling","_isEnabling","_drawingAC","_focusedElement","_textLayer","_textSelectionAC","_uiManager4","editorTypes","_editorTypes2","_initialized","isInvisible","disableTextSelection","toggleAnnotationLayerPointerEvents","enableTextSelection","_editorType","_classPrivateFieldGet66","_classPrivateFieldGet67","annotationElementIds","editables","changedAnnotations","resetAnnotations","_this$getEditableAnno","_classPrivateFieldGet68","_classPrivateFieldGet69","_textLayerPointerDown","_classPrivateFieldGet70","_classPrivateFieldGet71","attach","_classPrivateFieldGet72","removePointerInTextLayer","_editor$parent","_classPrivateFieldGet73","_classPrivateGetter2","_get_currentEditorType","_getCenterPoint","_createNewEditor","_editorTypes2$_$get","_data$annotationType","_classPrivateGetter3","_classPrivateGetter4","startDrawingSession","_ref81","pause","_classPrivateFieldGet74","_classPrivateFieldGet75","_classPrivateFieldGet76","_ref82","_ref83","oldRotation","DrawLayer","_ref84","_DrawLayer_brand","_parent2","_id5","_mapping","_toUpdate","_svgFactory","_this$id11","_this$id12","isPathUpdatable","hasClip","pathId","_createClipPath","use","mustRemoveSelfIntersections","_this$id13","_this$id14","maskId","use1","use2","elementOrId","_updateProperties","pathElement","_setBox","_ref95","clipPathUse","_DrawLayer","pdfjsTestingUtils","RenderingStates","INITIAL","RUNNING","PAUSED","FINISHED","ScrollMode","UNKNOWN","VERTICAL","HORIZONTAL","WRAPPED","PAGE","SpreadMode","ODD","EVEN","spot","scrollMatches","parseQueryString","query","URLSearchParams","InvisibleCharsRegExp","removeNullCharacters","replaceInvisible","binarySearchFirstItem","minIndex","currentIndex","approximateFraction","xinv","x_","floorToDivide","isValidRotation","isPortraitOrientation","docStyle","_classList","_disableAutoFetchTimeout","_percent","_style","ProgressBar","bar","setWidth","setDisableAutoFetch","calcRound","getCharacterType","NormalizeWithNFKC","FindState","FOUND","NOT_FOUND","PENDING","CHARACTERS_TO_NORMALIZE","DIACRITICS_EXCEPTION","DIACRITICS_EXCEPTION_STR","DIACRITICS_REG_EXP","SPECIAL_CHARS_REG_EXP","NOT_DIACRITIC_FROM_END_REG_EXP","NOT_DIACRITIC_FROM_START_REG_EXP","SYLLABLES_REG_EXP","SYLLABLES_LENGTHS","NFKC_CHARS_TO_NORMALIZE","noSyllablesRegExp","withSyllablesRegExp","syllablePositions","normalizationRegex","regexp","rawDiacriticsPositions","rawDiacriticsIndex","syllableIndex","shiftOrigin","eol","hasDiacritics","p5","p6","p7","p8","p9","_syllablePositions$sy","_rawDiacriticsPositio","replacement","_rawDiacriticsPositio2","hasTrailingDashEOL","newCharLen","starts","shifts","_updateMatchesCountOnProgress","_visitedPagesCount","_PDFFindController_brand","PDFFindController","updateMatchesCountOnProgress","_linkService","onIsPageVisible","_reset","_onFind","_onFindBarClose","highlightMatches","_highlightMatches","pageMatches","_pageMatches","pageMatchesLength","_pageMatchesLength","_selected","_pdfDocument","_firstPageCapability","selectedLeft","_scrollMatches","matchIdx","pageIdx","pageContent","_hasDiacritics","isUnicode","_convertToRegExpString","isUnicodePart","queryPart","caseSensitive","entireWord","_isEntireWord","_get_query","_rawQuery","_normalizedQuery","_shouldDirtyMatch","_dirtyMatch","_updateUIState","findbarClosed","pendingTimeout","_findTimeout","_nextMatch","highlightAll","_updateAllPages","_pageContents","_pageDiffs","_matchesCountTotal","_pagesToSearch","_pendingFindMatches","_resumePageIdx","wrapped","_extractTextPromises","prevType","_this$onIsPageVisible","_this$onIsPageVisible2","newQuery","prevQuery","newType","pagesCount","startIdx","matchDiacritics","trailingSpaces","matcherResult","matchesLength","matchLen","matchPos","oldStart","_updatePage","_nextPageMatch","pageMatchesCount","_updateUIResultsCount","_this$visitedPagesCou","textOptions","pdfPage","textItem","findPrevious","_calculateMatch","numPageMatches","_updateMatch","_advanceOffsetPage","numMatches","_matchesReady","previousPage","_this$_pageMatches$i","matchesCount","_requestMatchesCount","rawQuery","LinkTarget","SELF","externalLinkEnabled","PDFLinkService","externalLinkTarget","externalLinkRel","ignoreDestinationZoom","pdfViewer","pdfHistory","_ignoreDestinationZoom","setViewer","setHistory","currentPageNumber","isInPresentationMode","namedDest","explicitDest","destRef","PARENT","targetStr","scrollPageIntoView","destArray","pageLabelToPageNumber","pushCurrentPosition","pushPage","BLANK","TOP","phrase","zoomArgs","zoomArg","zoomArgNumber","allowNegativeOffset","_isValidExplicitDest","_this$pdfHistory","_this$pdfHistory2","back","nextPage","argsLen","allowNull","SimpleLinkService","pdfjsLib","AnnotationLayerBuilder","hasJSActionsPromise","fieldObjectsPromise","onAppend","_cancelled","_hasJSActionsPromise","_fieldObjectsPromise","_onAppend","_this$_eventBus","eventAbortController","_AnnotationLayerBuilder_brand","_updatePresentationModeState","_eventAbortController","_this$annotationLayer","disableFormElements","section","inert","blobUrl","DownloadManager","downloadData","EventBus","external","_off","eventListeners","externalListeners","_evt$rmAbort","globalEventNames","FluentType","FluentNone","FluentNumber","memoizeIntlObject","reportError","FluentDateTime","getDefault","variants","star","resolvePattern","getArguments","resolveExpression","ReferenceError","bundle","_messages","attribute","term","_terms","resolved","_functions","variant","resolveComplexPattern","MAX_PLACEABLES","ptn","dirty","_useIsolating","placeables","useIsolating","Scope","ctor","errors","_intls","allowed","unwrapped","NUMBER_ALLOWED","NUMBER","DATETIME_ALLOWED","DATETIME","FluentBundle","functions","hasMessage","stringLocale","memoizer","allowOverrides","RE_INDENT","TOKEN_BRACE_OPEN","TOKEN_BRACE_CLOSE","TOKEN_BRACKET_OPEN","TOKEN_BRACKET_CLOSE","TOKEN_PAREN_OPEN","TOKEN_ARROW","TOKEN_COLON","TOKEN_COMMA","TOKEN_BLANK","RE_UNICODE_ESCAPE","RE_LEADING_NEWLINES","RE_TRAILING_SPACES","RE_BLANK_LINES","RE_MESSAGE_START","re","consumeChar","errorClass","consumeToken","parsePattern","RE_ATTRIBUTE_START","RE_TEXT_RUN","parsePatternElements","indent","parseIndent","commonIndent","parsePlaceable","baked","Indent","parseInlineExpression","RE_VARIANT_START","parseVariantKey","RE_REFERENCE","sigil","RE_FUNCTION_NAME","RE_NUMBER_LITERAL","parseNumberLiteral","RE_IDENTIFIER","parseStringLiteral","parseEscapeSequence","RE_STRING_RUN","RE_STRING_ESCAPE","codepoint4","codepoint6","makeIndent","blank","reOverlay","TEXT_LEVEL_ELEMENTS","LOCALIZABLE_ATTRIBUTES","menuitem","menu","track","textarea","translateElement","translation","fromFragment","sanitized","templateElement","childNode","getNodeForNamedElement","isElementAllowed","createSanitizedElement","createTextNodeFromTextContent","overlayAttributes","fromElement","explicitlyAllowed","sourceElement","isAttrNameLocalizable","translatedChild","sourceChild","shallowPopulateUsing","attrName","elemName","CachedIterable","iterable","CachedAsyncIterable","asyncIterator","Localization","resourceIds","generateBundles","onChange","translations","hasAtLeastOneBundle","bundles","missingIds","keysFromBundle","formatWithFallback","messageFromBundle","valueFromBundle","formatValues","handleEvent","touchNext","formatPattern","messageErrors","getMessage","L10NID_ATTR_NAME","L10NARGS_ATTR_NAME","L10N_ELEMENT_QUERY","DOMLocalization","roots","pendingrAF","pendingElements","windowElement","observerConfig","characterData","attributeFilter","translateRoots","connectRoot","newRoot","pauseObserving","translateMutations","resumeObserving","translateFragment","takeRecords","mutation","addedNode","ELEMENT_NODE","childElementCount","getTranslatables","translateElements","getKeysForElement","formatMessages","applyTranslations","L10n","getDirection","_dir","getLanguage","_fixupLangCode","_isRTL","disconnectRoot","hi","hy","_messages$","translateOnce","langCode","_langCode","en","es","fy","ga","gu","ne","nn","pa","pt","sv","fixupLangCode","shortCode","createBundle","resource","FluentResource","addResource","genericl10n_GenericL10n","_generateBundles","_generateBundlesFallback","_setL10n","defaultLang","baseLang","baseURL","_getPaths","#createBundle","shortLang","langs","_createBundle","_createBundleFallback","UPDATE_VIEWAREA_TIMEOUT","getCurrentHash","PDFHistory","_eventAbortController2","fingerprint","_fingerprint","_isPagesLoaded","_popStateInProgress","_blockHashChange","resetHistory","updateUrl","reInitialized","_updateUrl","_bindEvents","history","_currentHash","_numPositionUpdates","_maxUid","_PDFHistory_brand","_isValidState","_parseCurrentHash","_pushOrReplaceState","_initialBookmark","_initialRotation","_pageHide","_unbindEvents","_updateViewareaTimeout","_isValidPage","forceReplace","pushHash","destHash","firstDest","secondDest","isEntryEqual","isValidPage","_this$_destination","_tryPushCurrentPosition","initialBookmark","shouldReplace","newState","newUrl","_updateInternalState","replaceState","pushState","temporary","checkReload","perfEntry","performance","getEntriesByType","removeTemporary","checkNameddest","nameddest","pdfOpenParams","newHash","hashChanged","setHash","_updateViewarea","_popState","AnnotationEditorLayerBuilder","annotationEditorLayer","_drawLayer","_onAppend2","clonedViewport","compatParams","maxTouchPoints","isAndroid","Type","supportsCaretBrowsingMode","defaultOptions","OptionKind","nimbusDataStr","supportsDocumentFonts","supportsIntegratedFind","supportsMouseWheelZoomCtrlKey","supportsMouseWheelZoomMetaKey","toolbarDensity","altTextLearnMoreUrl","annotationEditorMode","cursorToolOnLoad","debuggerSrc","defaultZoomDelay","defaultZoomValue","disableHistory","disablePageLabels","enableAltText","enableAltTextModelDownload","enableGuessAltText","enablePermissions","enablePrintAutoRotate","highlightEditorColors","historyUpdateUrl","maxCanvasPixels","forcePageColors","pageColorsBackground","pageColorsForeground","pdfBugEnabled","printResolution","sidebarViewOnLoad","scrollModeOnLoad","spreadModeOnLoad","textLayerMode","viewOnLoad","BOOLEAN","UNDEFINED","AppOptions","_opts","defaultOnly","defaultOpt","prefs","_hasInvokedSet","userOpt","_AppOptions","_checkDisablePreferences","DrawLayerBuilder","_drawLayer2","Link","Ruby","PDF_ROLE_TO_HTML_ROLE","LBody","Table","THead","TBody","TFoot","Caption","Figure","Formula","Artifact","Span","Em","Strong","Annot","Form","RB","RT","WP","HEADING_PATTERN","_promise","_treeDom","_treePromise","_elementAttributes","_rawDims","_elementsToAddToTextLayer","_StructTreeLayerBuilder_brand","StructTreeLayerBuilder","_walk","_document$getElementB","htmlElement","structElement","elementsToAddToTextLayer","calc","setTextMapping","_addImageInTextLayer","_setAttributes","kid","top1","TextAccessibilityManager","_TextAccessibilityManager_brand","_textChildren","_enabled","_textNodes","textChildren","_addIdToAriaOwns","isRemovable","_waitingElements","addPointerInTextLayer","_owns","owns","_compareElementPositions","findController","hasChildNodes","elementToCompare","e1","e2","bot1","mid1","top2","bot2","mid2","addIdToAriaOwns","TextHighlighter","_updateMatches","divs","texts","_eventAbortController3","divIdx","iIndex","prevEnd","isSelectedPage","infinity","appendTextToDiv","fromOffset","toOffset","i0","selectedMatchIdx","i1","lastOffset","lastDivIdx","highlightSuffix","n0","n1","clearedUntilDivIdx","scrollMatchIntoView","TextLayerBuilder","_convertMatches","_renderMatches","highlighter","_enablePermissions","_onAppend3","_this$highlighter","_this$accessibilityMa","_this$highlighter2","_this$accessibilityMa2","textContentParams","_renderingDone","_textLayer2","endOfContent","_bindMouse","_this$highlighter3","_this$highlighter4","_this$highlighter5","_this$accessibilityMa3","_removeGlobalSelectionListener","textLayerDiv","_textLayers","_selectionChangeAbortController","isPointerDown","prevRange","enableGlobalSelectionListener","_anchor$parentElement","activeTextLayers","intersectsNode","endDiv","modifyStart","compareBoundaryPoints","END_TO_END","START_TO_END","endContainer","parentTextLayer","cloneRange","DEFAULT_LAYER_PROPERTIES","LAYERS_ORDER","_annotationMode","_canvasWrapper","_hasRestrictedScaling","_layerProperties","_loadingId","_originalViewport","_previousRotation","_scaleRoundX","_scaleRoundY","_renderError","_renderingState","_textLayerMode","_useThumbnailCanvas","_layers","_PDFPageView_brand","PDFPageView","_options$textLayerMod","_options$annotationMo","_options$maxCanvasPix","_this$renderingQueue","directDrawing","initialOptionalContent","defaultViewport","layerProperties","pageLabel","pdfPageRotate","_optionalContentConfigPromise","renderingQueue","resume","_isStandalone","hasViewer","xfaLayer","_this$pageColors","renderingState","thumbnailCanvas","regularAnnotations","_this$pageColors2","_this$pageColors3","_this$_container","_this$_container2","totalRotation","_setDimensions","_this$pdfPage","_this$annotationLayer2","_this$annotationLayer3","_this$annotationEdito","_this$xfaLayer","_this$textLayer","_this$structTreeLayer","keepAnnotationLayer","keepAnnotationEditorLayer","keepXfaLayer","keepTextLayer","keepCanvasWrapper","cancelRendering","annotationLayerNode","annotationEditorLayerNode","xfaLayerNode","textLayerNode","canvasWrapperNode","layerIndex","_resetCanvas","drawingDelay","_this$_container3","onlyCssZoom","postponeDrawing","cancelExtraDelay","cssTransform","redrawAnnotationLayer","redrawAnnotationEditorLayer","redrawXfaLayer","redrawTextLayer","hideTextLayer","timestamp","_this$_textHighlighte","originalViewport","relativeRotation","_this$structTreeLayer2","_renderAnnotationLayer","_renderDrawLayer","_renderAnnotationEditorLayer","_renderXfaLayer","_renderTextLayer","cont","canvasWrapper","_addLayer","showCanvas","_textHighlighter","prevCanvas","annotationLayerDiv","sfy","hasHCM","updateOnFirstShow","isLastShow","resultPromise","invScale","pixelsInViewport","maxScale","annotationEditorLayerDiv","resetCanvas","sfx","renderContext","_showCanvas","isHighestPriority","_showCanvas2","_this$annotationLayer4","_finishRenderTask","getDrawLayer","_showCanvas3","XfaLayerBuilder","_this$pageLabel","oldDiv","_dispatchLayerRendered","_buildXfaTextContentItems","_this$xfaLayer2","_this$structTreeLayer3","_this$structTreeLayer5","treeDom","_this$structTreeLayer4","addElementsToTextLayer","_renderStructTreeLayer","GenericScripting","sandboxBundleSrc","_ready","pdfjsSandbox","QuickJSSandbox","sandbox","nukeSandbox","PDFScriptingManager","externalServices","docProperties","_docProperties","_pdfViewer","_PDFScriptingManager_brand","_destroyScripting","objects","calculationOrder","docActions","_scripting","_initScripting","_eventAbortController4","_updateFromSandbox","dispatchEventInSandbox","_dispatchPageClose","_dispatchPageOpen","_pageOpenPending","willPrintCapability","_closeCapability","createSandbox","appInfo","docInfo","_destroyCapability","_willPrintCapability","isChangingPresentationMode","command","modes","layout","scrollMode","spreadMode","pagesPromise","currentScaleValue","increaseScale","decreaseScale","actionsPromise","elementId","createScripting","_visitedPages","pageView","getPageView","_pageView$pdfPage","visitedPages","printing","_externalServices2","destroySandbox","PDFScriptingManagerComponents","isViewFinished","filesize","authors","PDFRenderingQueue","pdfThumbnailViewer","onIdle","highestPriorityPage","idleTimeout","isThumbnailViewEnabled","renderingId","currentlyVisiblePages","_this$pdfThumbnailVie","forceRendering","views","scrolledDown","preRenderExtra","visibleViews","numVisible","firstId","PagesCountLimit","lastId","visibleIds","holeId","holeView","preRenderIndex","preRenderView","renderHighestPriority","isValidAnnotationEditorMode","PDFPageViewBuffer","_PDFPageViewBuffer_brand","_buf","_size","_destroyFirstView","newSize","idsToKeep","firstView","PDFViewer","_this$container","_this$viewer","_options$textLayerMod2","_options$annotationMo2","_options$annotationEd","_PDFViewer_brand","ResizeObserver","_resizeObserverCallback","viewerVersion","_resizeObserver","_getVisiblePages","_scriptingManager","scriptingManager","_textLayerMode2","_annotationMode2","_annotationEditorMode","_annotationEditorHighlightColors","annotationEditorHighlightColors","removePageBorders","_enablePermissions2","_enableHWA2","defaultRenderingQueue","abortSignal","viewAreaElement","debounceScroll","rAF","currentX","currentY","down","_eventHandler","useCapture","_scrollUpdate","presentationModeState","_resetView","_updateContainerHeightCss","currentPageLabel","_pages","_buffer","_setCurrentPageNumber","getCachedPageViews","pageViewsReady","_currentPageNumber","_currentScaleValue","_currentScale","_this$_pageLabels2","_this$_pageLabels","_pageLabels","_setScale","noScroll","_pagesRotation","_self$pdfDocument","_self$pdfDocument2","_self$pdfDocument3","interruptCopyCondition","_onePageRenderedCapability","_pagesCapability","firstPageView","_scrollMode","_updateScrollMode","_spreadMode","_updateSpreadMode","_containerTopLeft","loadModel","updater","_cleanupSwitchAnnotationEditorMode","idsToRefresh","_switchToEditAnnotationMode","_switchAnnotationEditorModeAC","_eventAbortController5","_ref25","_switchAnnotationEditorModeTimeoutId","setPdfPage","_this$_pageLabels3","_this$_pageLabels4","resetCurrentPageView","_resetCurrentPageView","pageNum","labels","_this$findController","_this$_scriptingManag","_cancelRendering","firstPagePromise","permissionsPromise","onAfterDraw","_this$_pages$","firstPdfPage","permissions","_initializePermissions","_hiddenCopyElement","#setScaleUpdatePages","preset","newValue","viewerElement","currentScale","scaleTimeoutId","presetValue","_onePageRenderedOrForceFetch","_this$findController2","_this$_scriptingManag2","_copyCallback","getPagesLeft","setScaleUpdatePages","Language","_this$_pageLabels$i","_this$_pageLabels5","setPageLabel","_location","_previousScrollMode","_scrollModePageState","previousPageNumber","scrollDown","changeOrientation","hPadding","vPadding","boundingRect","_scrollIntoView","firstPage","normalizedScaleValue","currentPageView","getPagePoint","intLeft","intTop","pages","ensurePageViewVisible","visiblePages","numVisiblePages","newCacheSize","currentId","isSimpleLayout","stillFullyVisible","_updateLocation","_isContainerRtl","scrollEl","sortByVisibility","horizontal","rtl","numViews","firstVisibleElementInd","elementLeft","elementRight","elt","pageTop","currentWidth","currentHeight","viewWidth","viewHeight","viewRight","viewBottom","hiddenHeight","fractionWidth","pc","scrollAhead","_getScrollAhead","getHighestPriority","_ensurePdfPageLoaded","renderView","orientation","initialOrientation","advance","_ensurePageViewVisible","parity","spread","previousContainerHeight","pageLayout","yArray","expectedId","_getPageAdvance","visibilityState","hiddenCapability","containsNode","_getAllTextInProgress","_interruptCopyCondition","getAllText","clipboard","writeText","pageIndexSet","VERTICAL_PADDING","dummyPage","pageSpot","newScale","_isSameScale","_scaleTimeoutId","previousScale","scaleDiff","containerTopLeft","isVerticalScrollbarEnabled","_setScaleUpdatePages","currentPage","pageWidthScale","_get_pageWidthScaleFactor","pageHeightScale","horizontalScale","_visible$first","_visible$last","hasEqualPageSizes","pagesToRefresh","Virtual","cssModeTimeout","swiper","extendParams","virtual","slides","slidesPerViewAutoSlideSize","renderSlide","renderExternal","renderExternalUpdate","addSlidesBefore","addSlidesAfter","slidesGrid","tempDOM","slide","slideEl","setInnerHTML","isElement","slideClass","beforeInit","forceActiveIndex","slidesPerGroup","centeredSlides","slidesPerView","isLoop","initialSlide","previousFrom","previousTo","previousSlidesGrid","previousOffset","cssMode","updateActiveIndex","activeIndex","slidesPerViewNumeric","slidesAfter","slidesBefore","rtlTranslate","swiperSize","onRendered","updateSlides","updateProgress","updateSlidesClasses","cssOverflowAdjustment","slidesToRender","prependIndexes","appendIndexes","getSlideIndex","slideIndex","loopFrom","loopTo","slidesEl","elementChildren","domSlidesAssigned","passedParams","containerModifierClass","watchSlidesProgress","originalParams","_immediateVirtual","setCSSProperty","wrapperEl","virtualSize","appendSlide","prependSlide","newActiveIndex","numberOfNewSlides","cachedIndex","cachedEl","cachedElIndex","slideTo","removeSlide","slidesIndexes","removeAllSlides","Keyboard","kc","pageUpDown","isPageUp","isPageDown","isArrowLeft","isArrowRight","isArrowUp","isArrowDown","allowSlideNext","allowSlidePrev","isContentEditable","onlyInViewport","inView","elementParents","slideActiveClass","swiperWidth","swiperHeight","windowWidth","windowHeight","swiperOffset","elementOffset","swiperCoord","slideNext","slidePrev","Mousewheel","mousewheel","releaseOnEdges","forceToAxis","sensitivity","eventsTarget","thresholdDelta","thresholdTime","noMousewheelClass","lastEventBeforeSnap","lastScrollTime","recentWheelEvents","handleMouseEnter","mouseEntered","handleMouseLeave","animateSlider","newEvent","isEnd","animating","isBeginning","disableParentSwiper","targetEl","targetElContainsTarget","rtlFactor","sX","sY","pX","pY","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","spinX","spinY","pixelX","pixelY","getTranslate","minTranslate","maxTranslate","nested","freeMode","ignoreWheelEvents","wasBeginning","wasEnd","setTransition","setTranslate","loopFix","byMousewheel","sticky","prevEvent","firstEvent","snapToThreshold","nextTick","slideToClosest","autoplay","disableOnInteraction","createElementIfNotDefined","checkProps","createElements","auto","arrowSvg","Navigation","getEl","hostEl","uniqueNavElements","toggleEl","navigation","makeElementsArray","subEl","disabledClass","watchOverflow","isLocked","lockClass","nextEl","prevEl","rewind","onPrevClick","onNextClick","initButton","addIcons","tempEl","destroyButton","hideOnClick","hiddenClass","navigationDisabledClass","_s","targetIsButton","pathEl","pagination","clickable","isHidden","classesToSelector","Pagination","pfx","bulletSize","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","formatFractionTotal","bulletClass","bulletActiveClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","horizontalClass","verticalClass","paginationDisabledClass","bullets","dynamicBulletIndex","isPaginationDisabled","setSideBullets","bulletEl","onBulletClick","elementIndex","realIndex","moveDirection","prevIndex","nextIndex","slideToLoop","previousIndex","slidesLength","snapGrid","previousRealIndex","snapIndex","previousSnapIndex","firstIndex","midIndex","elementOuterSize","classesToRemove","bullet","bulletIndex","firstDisplayedBullet","lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","subElIndex","fractionEl","totalEl","progressbarDirection","progressEl","transitionDuration","grid","paginationHTML","numberOfBullets","Scrollbar","dragStartPos","dragSize","trackSize","isTouched","dragTimeout","scrollbar","dragEl","progressLoop","newPos","updateSize","slidesOffsetBefore","getPointerPosition","setDragPosition","positionRatio","onDragMove","onDragEnd","snapOnRelease","activeListener","passiveListeners","passiveListener","eventMethod","swiperEl","dragClass","draggable","classesToTokens","scrollbarDisabledClass","Parallax","parallax","elementsSelector","currentOpacity","slideProgress","_swiper","parallaxEl","parallaxDuration","Zoom","limitToOriginalSize","maxRatio","minRatio","panOnMouseMove","containerClass","zoomedSlideClass","fakeGestureTouched","fakeGestureMoved","isScaling","isPanningWithMouse","mousePanStart","evCache","gesture","originX","originY","slideWidth","slideHeight","imageEl","imageWrapEl","isMoved","touchesStart","touchesCurrent","velocity","prevPositionX","prevPositionY","prevTime","allowTouchMoveTimeout","getDistanceBetweenTouches","getMaxRatio","imageMaxRatio","eventWithinSlide","slideSelector","eventWithinZoomContainer","containerEl","onGestureStart","scaleStart","scrollX","scrollY","onGestureChange","pointerIndex","cachedEv","scaleMove","onGestureEnd","allowTouchMove","touchEventsData","preventTouchMoveFromPointerMove","onTouchMove","isMousePan","onMouseMove","allowClick","scaleRatio","zoomIn","touchX","touchY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","touchAction","prevScale","forceZoomRatio","zoomOut","zoomToggle","getListeners","activeListenerWithCapture","device","android","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","momentumDuration","in","Controller","LinearSpline","binarySearch","i3","removeSpline","control","spline","controlElement","eventsPrefix","onControllerSwiper","byController","_t","controlled","multiplier","controlledTranslate","Swiper","setControlledTranslate","setControlledTransition","transitionStart","autoHeight","updateAutoHeight","elementTransitionEnd","transitionEnd","A11y","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","containerRole","itemRoleDescriptionMessage","slideRole","scrollOnFocus","wrapperLiveRegion","clicked","preventFocusHandler","focusTargetSlideEl","liveRegion","visibilityChangedTimestamp","notification","makeElFocusable","makeElNotFocusable","addElRole","addElRoleDescription","addElLabel","disableEl","enableEl","onEnterOrSpaceKey","prevEls","hasPagination","hasClickablePagination","initNavEl","wrapperId","controls","handlePointerDown","handlePointerUp","handleFocus","isVirtual","visibleSlides","sourceCapabilities","firesTouchEvents","getSlideIndexWhenGrid","initSlides","repeat","randomChar","live","History","keepQuery","initialized","slugify","getPathValues","urlOverride","pathArray","pathname","currentState","scrollToSlide","runCallbacks","setHistoryPopState","hashNavigation","runCallbacksOnInit","HashNavigation","watchState","slideWithHash","onHashChange","activeSlideEl","newIndex","activeSlideHash","Autoplay","raf","paused","timeLeft","waitForTransition","stopOnLastSlide","reverseDirection","pauseOnMouseEnter","autoplayTimeLeft","wasPaused","pausedByTouch","touchStartTimeout","pausedByInteraction","pausedByPointerEnter","autoplayDelayTotal","autoplayDelayCurrent","autoplayStartTime","bySwiperTouchMove","calcTimeLeft","getTotalDelay","totalDelay","currentSlideDelay","getSlideDelay","delayForce","onPointerEnter","onPointerLeave","Thumb","thumbs","multipleActiveThumbs","autoScrollOffset","slideThumbActiveClass","thumbsContainerClass","swiperCreated","isVirtualEnabled","thumbsSwiper","onThumbClick","clickedIndex","clickedSlide","slideToIndex","thumbsParams","SwiperClass","slideToClickedSlide","thumbsSwiperParams","autoScroll","_p$autoScroll","thumbsToActivate","thumbActiveClass","slideSpeed","slidesPerViewDynamic","useOffset","currentThumbsIndex","newThumbsIndex","newThumbsSlide","visibleSlidesIndexes","getThumbsElementAndInit","thumbsElement","onThumbsSwiper","watchForThumbsToAppear","momentum","momentumRatio","momentumBounce","momentumBounceRatio","momentumVelocityRatio","minimumVelocity","onTouchStart","velocities","onTouchEnd","currentPos","touchStartTime","timeDiff","lastMoveEvent","velocityEvent","momentumDistance","newPosition","afterBouncePosition","doBounce","bounceAmount","needsLoopFix","allowMomentumBounce","nextSlide","swipeDirection","moveDistance","currentSlideSize","slidesSizesGrid","longSwipesMs","Grid","slidesNumberEvenToRows","slidesPerRow","numFullColumns","wasMultiRow","getSpaceBetween","spaceBetween","isMultiRow","emitContainerClasses","unsetSlides","swiperSlideGridSet","getDirectionLabel","updateSlide","newSlideOrderIndex","groupIndex","slideIndexInGroup","columnsInGroup","updateWrapperSize","slideSize","roundLengths","newSlidesGrid","slidesGridItem","loopDestroy","appendElement","recalcSlides","loopCreate","observer","prependElement","addSlide","activeIndexBuffer","loopedSlides","baseLength","slidesBuffer","currentSlide","indexToRemove","Manipulation","effectInit","effect","overwriteParams","perspective","recreateShadows","getEffectParams","requireUpdateOnVirtual","overwriteParamsResult","slideShadows","shadowEl","effectTarget","effectParams","transformEl","getSlideTransformEl","backfaceVisibility","effectVirtualTransitionEnd","transformElements","allSlides","virtualTranslate","transitionEndTarget","eventTriggered","shadowRoot","EffectFade","fadeEffect","crossFade","swiperSlideOffset","slideOpacity","EffectCube","cubeEffect","shadowOffset","shadowScale","createSlideShadows","shadowBefore","shadowAfter","browser","getRotateFix","cubeShadowEl","wrapperRotate","slideAngle","transformOrigin","shadowAngle","scale1","scale2","zFactor","isSafari","isWebView","needPerspectiveFix","resistanceRatio","createShadow","shadowClass","shadowContainer","EffectFlip","flipEffect","limitRotation","rotateFix","rotateY","rotateX","EffectCoverflow","coverflowEffect","stretch","centerOffset","offsetMultiplier","translateZ","slideTransform","shadowBeforeEl","shadowAfterEl","EffectCreative","creativeEffect","limitProgress","shadowPerProgress","progressMultiplier","getTranslateValue","isCenteredSlides","originalProgress","translateString","rotateString","scaleString","opacityString","shadowOpacity","EffectCards","cardsEffect","perSlideRotate","perSlideOffset","startTranslate","currentTranslate","tX","tY","tZ","tXAdd","isSwipeToNext","isSwipeToPrev","subProgress","_loopSwapReset","loopAdditionalSlides","noExtend","ssrDocument","importNode","hostname","ssrWindow","go","screen","deleteProps","curTransform","transformMatrix","curStyle","currentStyle","WebKitCSSMatrix","webkitTransform","MozTransform","OTransform","MsTransform","m41","m42","isNode","nextSource","keysArray","nextKey","__swiper__","varValue","animateCSSModeScroll","targetPosition","scrollSnapType","cssModeFrameID","isOutOfBound","easeProgress","currentPosition","HTMLSlotElement","assignedElements","elementIsChildOf","isChild","slot","elementsQueue","elementToCheck","showWarning","elementPrevAll","previousElementSibling","elementNextAll","nextEls","fireCallBack","includeMargins","need3dFix","trustedTypes","createPolicy","createHTML","deviceCached","getSupport","smoothScroll","DocumentTouch","getDevice","ua","screenWidth","screenHeight","ipad","ipod","iphone","windows","macos","os","getBrowser","major","minor","isSafariBrowser","eventsEmitter","eventsListeners","onceHandler","__emitterProxy","onAny","eventsAnyListeners","offAny","toggleSlideClasses$1","toggleSlideClasses","processLazyPreloader","lazyEl","lazyPreloaderClass","lazyPreloaderManaged","unlazy","preload","amount","lazyPreloadPrevNext","activeColumn","preloadColumns","slideIndexLastInView","getDirectionPropertyValue","wrongRTL","previousSlidesLength","offsetBefore","offsetAfter","slidesOffsetAfter","previousSnapGridLength","previousSlidesGridLength","slidePosition","prevSlideSize","gridEnabled","shouldResetSlideSize","breakpoints","slideStyles","currentWebKitTransform","paddingLeft","boxSizing","swiperSlideSize","slidesPerGroupSkip","setWrapperSize","isFractionalSlidesPerView","shouldSnapToSlideEdge","snapToSlideEdge","lastAllowedSnapIndex","minVisibleSlides","accumulatedSize","groupSize","centeredSlidesBounds","allSlidesSize","slideSizeValue","maxSnap","snap","centerInsufficientSlides","allSlidesOffset","addToSnapGrid","addToSlidesGrid","updateSlidesOffset","backFaceHiddenClass","hasClassBackfaceClassAdded","maxBackfaceHiddenSlides","activeSlides","getSlideByIndex","getSlideIndexByData","minusOffset","updateSlidesProgress","offsetCenter","slideOffset","originalSlideProgress","slideBefore","slideAfter","isFullyVisible","slideVisibleClass","slideFullyVisibleClass","translatesDiff","isBeginningRounded","isEndRounded","firstSlideIndex","lastSlideIndex","firstSlideTranslate","lastSlideTranslate","translateMax","translateAbs","getFilteredSlide","activeSlide","prevSlide","slideNextClass","slidePrevClass","emitSlidesClasses","getVirtualRealIndex","aIndex","normalizeSlideIndex","firstSlideInColumn","activeSlideIndex","updateClickedSlide","slideFound","newProgress","previousTranslate","translateTo","translateBounds","preventInteractionOnTransition","newTranslate","isH","onTranslateToWrapperTransitionEnd","transitionEmit","transitionDelay","normalizedTranslate","normalizedGrid","normalizedGridNext","_cssModeVirtualInitialSet","onSlideToWrapperTransitionEnd","targetSlideIndex","bothDirections","needLoopFix","slideRealIndex","perGroup","slidesPerGroupAuto","increment","loopPreventsSliding","_clientLeft","normalizedSnapGrid","isFreeMode","prevSnap","prevSnapIndex","slideReset","currentSnap","isGrid","loopAddBlankSlides","clearBlankSlides","slideBlankClass","shouldFillGroup","shouldFillGrid","addBlankSlides","amountOfSlides","prependSlidesIndexes","appendSlidesIndexes","isInitialOverflow","isNext","isPrev","slidesPrepended","slidesAppended","activeColIndexWithShift","colIndexToPrepend","__preventObserver__","swiperLoopMoveDOM","currentSlideTranslate","loopParams","newSlidesOrder","swiperSlideIndex","preventEdgeSwipe","edgeSwipeDetection","edgeSwipeThreshold","touchId","simulateTouch","touchEventsTarget","swipingClassHasValue","noSwipingClass","noSwipingSelector","isTargetShadow","noSwiping","__closestFrom","assignedSlot","swipeHandler","allowTouchCallbacks","isScrolling","startMoving","allowThresholdMove","focusableElements","shouldPreventDefault","touchStartPreventDefault","touchStartForcePreventDefault","targetTouch","preventedByNestedSwiper","touchReleaseOnEdges","previousX","previousY","touchAngle","touchMoveStopPropagation","touchesDiff","oneWayMovement","touchRatio","prevTouchesDirection","touchesDirection","allowLoopFix","grabCursor","setGrabCursor","loopSwapReset","resistance","followFinger","touchEndTime","pathTree","lastClickTime","swipeToLast","stopIndex","rewindFirstIndex","rewindLastIndex","longSwipes","longSwipesRatio","shortSwipes","setBreakpoint","isVirtualLoop","resizeTimeout","preventClicks","preventClicksPropagation","onScroll","onDocumentTouchStart","documentTouchHandlerProceeded","domMethod","swiperMethod","updateOnWindowResize","isGridEnabled","breakpointsBase","breakpointContainer","breakpoint","getBreakpoint","currentBreakpoint","breakpointParams","wasGrabCursor","isGrabCursor","wasEnabled","unsetGrabCursor","wasModuleEnabled","isModuleEnabled","directionChanged","needsReLoop","wasLoop","changeDirection","isEnabled","hasLoop","swiperElementNodeName","resizeObserver","wrapperClass","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","prototypes","attachEvents","detachEvents","wasLocked","lastSlideRightEdge","addClasses","resultClasses","autoheight","centered","removeClasses","extendedDefaults","swipers","newParams","modules","__modules__","mod","swiperParams","clickTimeout","imagesToLoad","imagesLoaded","setProgress","cls","getSlideClasses","updates","exact","spv","breakLoop","translateValue","translated","newDirection","needUpdate","currentDirection","changeLanguageDirection","mount","mounted","getWrapperSelector","slideSlots","lazyElements","deleteInstance","cleanStyles","extendDefaults","newDefaults","installModule","prototypeGroup","protoMethod","resizeHandler","orientationChangeHandler","contentBoxSize","contentRect","inlineSize","blockSize","unobserve","observers","WebkitMutationObserver","observerUpdate","observeParents","observeSlideChildren","containerParents"],"sources":["webpack://__ember_auto_import__/node_modules/tslib/tslib.es6.mjs","webpack://__ember_auto_import__/index.ts","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/@formatjs/icu-messageformat-parser/lib/error.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/@formatjs/icu-messageformat-parser/lib/types.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/@formatjs/icu-messageformat-parser/lib/regex.generated.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/@formatjs/icu-skeleton-parser/lib/date-time.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/@formatjs/icu-skeleton-parser/lib/regex.generated.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/@formatjs/icu-skeleton-parser/lib/number.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/@formatjs/icu-messageformat-parser/lib/time-data.generated.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/@formatjs/icu-messageformat-parser/lib/parser.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/@formatjs/icu-messageformat-parser/lib/date-time-pattern-generator.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/intl-messageformat/lib/src/error.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/@formatjs/icu-messageformat-parser/lib/index.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/intl-messageformat/lib/src/formatters.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/node_modules/intl-messageformat/lib/src/core.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/src/error.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/src/utils.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/src/message.js","webpack://__ember_auto_import__/node_modules/@formatjs/ecma402-abstract/lib/utils.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/src/dateTime.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/src/displayName.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/src/list.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/src/plural.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/src/relativeTime.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/src/number.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/src/create-intl.js","webpack://__ember_auto_import__/node_modules/@formatjs/intl/lib/index.js","webpack://__ember_auto_import__/src/fetch.ts","webpack://__ember_auto_import__/src/parse.ts","webpack://__ember_auto_import__/node_modules/diacritic/diacritics.js","webpack://__ember_auto_import__/src/utils/scroll-helpers.ts","webpack://__ember_auto_import__/src/components/basic-dropdown-content.gts","webpack://__ember_auto_import__/src/components/basic-dropdown-trigger.gts","webpack://__ember_auto_import__/src/components/basic-dropdown-wormhole.gts","webpack://__ember_auto_import__/src/components/basic-dropdown.gts","webpack://__ember_auto_import__/src/config.ts","webpack://__ember_auto_import__/src/modifiers/basic-dropdown-trigger.ts","webpack://__ember_auto_import__/src/utils/calculate-position.ts","webpack://__ember_auto_import__/src/utils/has-moved.ts","webpack://__ember_auto_import__/src/-private/matches-selector.js","webpack://__ember_auto_import__/src/utils.js","webpack://__ember_auto_import__/src/modifiers/on-click-outside.js","webpack://__ember_auto_import__/src/-private/helpers.js","webpack://__ember_auto_import__/src/helpers/cancel-all.ts","webpack://__ember_auto_import__/src/helpers/perform.ts","webpack://__ember_auto_import__/src/helpers/task.ts","webpack://__ember_auto_import__/src/-private/external/environment.js","webpack://__ember_auto_import__/src/-private/ember-environment.js","webpack://__ember_auto_import__/src/-private/external/yieldables.js","webpack://__ember_auto_import__/src/-private/utils.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/bounded-policy.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/execution-states.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/drop-policy.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/enqueued-policy.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/keep-latest-policy.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/restartable-policy.js","webpack://__ember_auto_import__/src/-private/task-properties.js","webpack://__ember_auto_import__/src/-private/external/scheduler/refresh.js","webpack://__ember_auto_import__/src/-private/external/scheduler/state-tracker/state.js","webpack://__ember_auto_import__/src/-private/external/task-instance/completion-states.js","webpack://__ember_auto_import__/src/-private/external/scheduler/state-tracker/state-tracker.js","webpack://__ember_auto_import__/src/-private/external/scheduler/state-tracker/null-state-tracker.js","webpack://__ember_auto_import__/src/-private/external/scheduler/state-tracker/null-state.js","webpack://__ember_auto_import__/src/-private/external/scheduler/scheduler.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/unbounded-policy.js","webpack://__ember_auto_import__/src/-private/external/task/default-state.js","webpack://__ember_auto_import__/src/-private/external/task-instance/cancelation.js","webpack://__ember_auto_import__/src/-private/external/task/taskable.js","webpack://__ember_auto_import__/src/-private/external/generator-state.js","webpack://__ember_auto_import__/src/-private/external/task-instance/initial-state.js","webpack://__ember_auto_import__/src/-private/external/task-instance/executor.js","webpack://__ember_auto_import__/src/-private/external/task/task.js","webpack://__ember_auto_import__/src/-private/external/task/task-group.js","webpack://__ember_auto_import__/src/-private/external/task-factory.js","webpack://__ember_auto_import__/src/-private/external/task-decorators.js","webpack://__ember_auto_import__/src/-private/scheduler/ember-scheduler.js","webpack://__ember_auto_import__/src/-private/external/task-instance/base.js","webpack://__ember_auto_import__/src/-private/tracked-state.js","webpack://__ember_auto_import__/src/-private/task-instance.js","webpack://__ember_auto_import__/src/-private/taskable-mixin.js","webpack://__ember_auto_import__/src/-private/task.js","webpack://__ember_auto_import__/src/-private/task-group.js","webpack://__ember_auto_import__/src/-private/task-factory.js","webpack://__ember_auto_import__/src/-private/task-decorators.js","webpack://__ember_auto_import__/src/-private/task-public-api.js","webpack://__ember_auto_import__/src/-private/cancelable-promise-helpers.js","webpack://__ember_auto_import__/src/-private/wait-for.js","webpack://__ember_auto_import__/src/helpers/element.ts","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/_rollupPluginBabelHelpers-30c82890.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/fixtures/key-maps.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/fixtures/modifiers-array.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/helpers/if-key.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/helpers/on-key.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/utils/get-mouse-code.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/decorators/key-responder.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/decorators/on-key.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/listeners/mouse-events.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/fixtures/mouse-buttons-array.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/listeners/touch-events.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/utils/trigger-event.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/index.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/listeners/key-events.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/modifiers/on-key.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/services/keyboard.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/utils/handle-key-event.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/utils/sort.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/utils/get-mouse-name.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/utils/is-key.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/utils/keyboard-listener.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/utils/listener-name.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/utils/get-cmd-key.js","webpack://__ember_auto_import__/node_modules/ember-keyboard/dist/utils/platform.js","webpack://__ember_auto_import__/node_modules/ember-lifeline/dist/utils/get-task.js","webpack://__ember_auto_import__/node_modules/ember-lifeline/dist/cancel-task.js","webpack://__ember_auto_import__/node_modules/ember-lifeline/dist/run-task.js","webpack://__ember_auto_import__/node_modules/ember-lifeline/dist/schedule-task.js","webpack://__ember_auto_import__/node_modules/ember-lifeline/dist/throttle-task.js","webpack://__ember_auto_import__/node_modules/ember-lifeline/dist/poll-task.js","webpack://__ember_auto_import__/node_modules/ember-lifeline/dist/debounce-task.js","webpack://__ember_auto_import__/node_modules/ember-lifeline/dist/utils/get-timeout-or-test-fallback.js","webpack://__ember_auto_import__/src/-private/class-based/modifier-manager.ts","webpack://__ember_auto_import__/src/-private/class-based/modifier.ts","webpack://__ember_auto_import__/src/-private/function-based/modifier.ts","webpack://__ember_auto_import__/src/-private/function-based/modifier-manager.ts","webpack://__ember_auto_import__/src/components/pikaday-input.js","webpack://__ember_auto_import__/src/components/pikaday-inputless.js","webpack://__ember_auto_import__/src/find-moment.js","webpack://__ember_auto_import__/node_modules/@embroider/macros/src/addon/es-compat2.js","webpack://__ember_auto_import__/src/modifiers/pikaday.js","webpack://__ember_auto_import__/vendor/pikaday.js","webpack://__ember_auto_import__/src/modifiers/style.ts","webpack://__ember_auto_import__/src/helpers/and.ts","webpack://__ember_auto_import__/src/helpers/eq.ts","webpack://__ember_auto_import__/src/helpers/gt.ts","webpack://__ember_auto_import__/src/helpers/gte.ts","webpack://__ember_auto_import__/src/helpers/is-array.ts","webpack://__ember_auto_import__/src/helpers/lt.ts","webpack://__ember_auto_import__/src/helpers/lte.ts","webpack://__ember_auto_import__/src/helpers/not-eq.ts","webpack://__ember_auto_import__/src/helpers/not.ts","webpack://__ember_auto_import__/src/helpers/or.ts","webpack://__ember_auto_import__/src/helpers/xor.ts","webpack://__ember_auto_import__/src/utils/truth-convert.ts","webpack://__ember_auto_import__/node_modules/eventemitter3/index.js","webpack://__ember_auto_import__/src/FileSaver.js","webpack://__ember_auto_import__/node_modules/jquery/dist/jquery.js","webpack://__ember_auto_import__/node_modules/js-base64/base64.js","webpack://__ember_auto_import__/src/errors.js","webpack://__ember_auto_import__/src/impl/formats.js","webpack://__ember_auto_import__/src/zone.js","webpack://__ember_auto_import__/src/zones/systemZone.js","webpack://__ember_auto_import__/src/zones/IANAZone.js","webpack://__ember_auto_import__/src/impl/locale.js","webpack://__ember_auto_import__/src/impl/english.js","webpack://__ember_auto_import__/src/zones/fixedOffsetZone.js","webpack://__ember_auto_import__/src/zones/invalidZone.js","webpack://__ember_auto_import__/src/impl/zoneUtil.js","webpack://__ember_auto_import__/src/impl/util.js","webpack://__ember_auto_import__/src/impl/digits.js","webpack://__ember_auto_import__/src/settings.js","webpack://__ember_auto_import__/src/impl/invalid.js","webpack://__ember_auto_import__/src/impl/conversions.js","webpack://__ember_auto_import__/src/impl/formatter.js","webpack://__ember_auto_import__/src/impl/regexParser.js","webpack://__ember_auto_import__/src/duration.js","webpack://__ember_auto_import__/src/interval.js","webpack://__ember_auto_import__/src/info.js","webpack://__ember_auto_import__/src/impl/diff.js","webpack://__ember_auto_import__/src/impl/tokenParser.js","webpack://__ember_auto_import__/src/datetime.js","webpack://__ember_auto_import__/src/luxon.js","webpack://__ember_auto_import__/node_modules/moment/locale/af.js","webpack://__ember_auto_import__/node_modules/moment/locale/ar-dz.js","webpack://__ember_auto_import__/node_modules/moment/locale/ar-kw.js","webpack://__ember_auto_import__/node_modules/moment/locale/ar-ly.js","webpack://__ember_auto_import__/node_modules/moment/locale/ar-ma.js","webpack://__ember_auto_import__/node_modules/moment/locale/ar-ps.js","webpack://__ember_auto_import__/node_modules/moment/locale/ar-sa.js","webpack://__ember_auto_import__/node_modules/moment/locale/ar-tn.js","webpack://__ember_auto_import__/node_modules/moment/locale/ar.js","webpack://__ember_auto_import__/node_modules/moment/locale/az.js","webpack://__ember_auto_import__/node_modules/moment/locale/be.js","webpack://__ember_auto_import__/node_modules/moment/locale/bg.js","webpack://__ember_auto_import__/node_modules/moment/locale/bm.js","webpack://__ember_auto_import__/node_modules/moment/locale/bn-bd.js","webpack://__ember_auto_import__/node_modules/moment/locale/bn.js","webpack://__ember_auto_import__/node_modules/moment/locale/bo.js","webpack://__ember_auto_import__/node_modules/moment/locale/br.js","webpack://__ember_auto_import__/node_modules/moment/locale/bs.js","webpack://__ember_auto_import__/node_modules/moment/locale/ca.js","webpack://__ember_auto_import__/node_modules/moment/locale/cs.js","webpack://__ember_auto_import__/node_modules/moment/locale/cv.js","webpack://__ember_auto_import__/node_modules/moment/locale/cy.js","webpack://__ember_auto_import__/node_modules/moment/locale/da.js","webpack://__ember_auto_import__/node_modules/moment/locale/de-at.js","webpack://__ember_auto_import__/node_modules/moment/locale/de-ch.js","webpack://__ember_auto_import__/node_modules/moment/locale/de.js","webpack://__ember_auto_import__/node_modules/moment/locale/dv.js","webpack://__ember_auto_import__/node_modules/moment/locale/el.js","webpack://__ember_auto_import__/node_modules/moment/locale/en-au.js","webpack://__ember_auto_import__/node_modules/moment/locale/en-ca.js","webpack://__ember_auto_import__/node_modules/moment/locale/en-gb.js","webpack://__ember_auto_import__/node_modules/moment/locale/en-ie.js","webpack://__ember_auto_import__/node_modules/moment/locale/en-il.js","webpack://__ember_auto_import__/node_modules/moment/locale/en-in.js","webpack://__ember_auto_import__/node_modules/moment/locale/en-nz.js","webpack://__ember_auto_import__/node_modules/moment/locale/en-sg.js","webpack://__ember_auto_import__/node_modules/moment/locale/eo.js","webpack://__ember_auto_import__/node_modules/moment/locale/es-do.js","webpack://__ember_auto_import__/node_modules/moment/locale/es-mx.js","webpack://__ember_auto_import__/node_modules/moment/locale/es-us.js","webpack://__ember_auto_import__/node_modules/moment/locale/es.js","webpack://__ember_auto_import__/node_modules/moment/locale/et.js","webpack://__ember_auto_import__/node_modules/moment/locale/eu.js","webpack://__ember_auto_import__/node_modules/moment/locale/fa.js","webpack://__ember_auto_import__/node_modules/moment/locale/fi.js","webpack://__ember_auto_import__/node_modules/moment/locale/fil.js","webpack://__ember_auto_import__/node_modules/moment/locale/fo.js","webpack://__ember_auto_import__/node_modules/moment/locale/fr-ca.js","webpack://__ember_auto_import__/node_modules/moment/locale/fr-ch.js","webpack://__ember_auto_import__/node_modules/moment/locale/fr.js","webpack://__ember_auto_import__/node_modules/moment/locale/fy.js","webpack://__ember_auto_import__/node_modules/moment/locale/ga.js","webpack://__ember_auto_import__/node_modules/moment/locale/gd.js","webpack://__ember_auto_import__/node_modules/moment/locale/gl.js","webpack://__ember_auto_import__/node_modules/moment/locale/gom-deva.js","webpack://__ember_auto_import__/node_modules/moment/locale/gom-latn.js","webpack://__ember_auto_import__/node_modules/moment/locale/gu.js","webpack://__ember_auto_import__/node_modules/moment/locale/he.js","webpack://__ember_auto_import__/node_modules/moment/locale/hi.js","webpack://__ember_auto_import__/node_modules/moment/locale/hr.js","webpack://__ember_auto_import__/node_modules/moment/locale/hu.js","webpack://__ember_auto_import__/node_modules/moment/locale/hy-am.js","webpack://__ember_auto_import__/node_modules/moment/locale/id.js","webpack://__ember_auto_import__/node_modules/moment/locale/is.js","webpack://__ember_auto_import__/node_modules/moment/locale/it-ch.js","webpack://__ember_auto_import__/node_modules/moment/locale/it.js","webpack://__ember_auto_import__/node_modules/moment/locale/ja.js","webpack://__ember_auto_import__/node_modules/moment/locale/jv.js","webpack://__ember_auto_import__/node_modules/moment/locale/ka.js","webpack://__ember_auto_import__/node_modules/moment/locale/kk.js","webpack://__ember_auto_import__/node_modules/moment/locale/km.js","webpack://__ember_auto_import__/node_modules/moment/locale/kn.js","webpack://__ember_auto_import__/node_modules/moment/locale/ko.js","webpack://__ember_auto_import__/node_modules/moment/locale/ku-kmr.js","webpack://__ember_auto_import__/node_modules/moment/locale/ku.js","webpack://__ember_auto_import__/node_modules/moment/locale/ky.js","webpack://__ember_auto_import__/node_modules/moment/locale/lb.js","webpack://__ember_auto_import__/node_modules/moment/locale/lo.js","webpack://__ember_auto_import__/node_modules/moment/locale/lt.js","webpack://__ember_auto_import__/node_modules/moment/locale/lv.js","webpack://__ember_auto_import__/node_modules/moment/locale/me.js","webpack://__ember_auto_import__/node_modules/moment/locale/mi.js","webpack://__ember_auto_import__/node_modules/moment/locale/mk.js","webpack://__ember_auto_import__/node_modules/moment/locale/ml.js","webpack://__ember_auto_import__/node_modules/moment/locale/mn.js","webpack://__ember_auto_import__/node_modules/moment/locale/mr.js","webpack://__ember_auto_import__/node_modules/moment/locale/ms-my.js","webpack://__ember_auto_import__/node_modules/moment/locale/ms.js","webpack://__ember_auto_import__/node_modules/moment/locale/mt.js","webpack://__ember_auto_import__/node_modules/moment/locale/my.js","webpack://__ember_auto_import__/node_modules/moment/locale/nb.js","webpack://__ember_auto_import__/node_modules/moment/locale/ne.js","webpack://__ember_auto_import__/node_modules/moment/locale/nl-be.js","webpack://__ember_auto_import__/node_modules/moment/locale/nl.js","webpack://__ember_auto_import__/node_modules/moment/locale/nn.js","webpack://__ember_auto_import__/node_modules/moment/locale/oc-lnc.js","webpack://__ember_auto_import__/node_modules/moment/locale/pa-in.js","webpack://__ember_auto_import__/node_modules/moment/locale/pl.js","webpack://__ember_auto_import__/node_modules/moment/locale/pt-br.js","webpack://__ember_auto_import__/node_modules/moment/locale/pt.js","webpack://__ember_auto_import__/node_modules/moment/locale/ro.js","webpack://__ember_auto_import__/node_modules/moment/locale/ru.js","webpack://__ember_auto_import__/node_modules/moment/locale/sd.js","webpack://__ember_auto_import__/node_modules/moment/locale/se.js","webpack://__ember_auto_import__/node_modules/moment/locale/si.js","webpack://__ember_auto_import__/node_modules/moment/locale/sk.js","webpack://__ember_auto_import__/node_modules/moment/locale/sl.js","webpack://__ember_auto_import__/node_modules/moment/locale/sq.js","webpack://__ember_auto_import__/node_modules/moment/locale/sr-cyrl.js","webpack://__ember_auto_import__/node_modules/moment/locale/sr.js","webpack://__ember_auto_import__/node_modules/moment/locale/ss.js","webpack://__ember_auto_import__/node_modules/moment/locale/sv.js","webpack://__ember_auto_import__/node_modules/moment/locale/sw.js","webpack://__ember_auto_import__/node_modules/moment/locale/ta.js","webpack://__ember_auto_import__/node_modules/moment/locale/te.js","webpack://__ember_auto_import__/node_modules/moment/locale/tet.js","webpack://__ember_auto_import__/node_modules/moment/locale/tg.js","webpack://__ember_auto_import__/node_modules/moment/locale/th.js","webpack://__ember_auto_import__/node_modules/moment/locale/tk.js","webpack://__ember_auto_import__/node_modules/moment/locale/tl-ph.js","webpack://__ember_auto_import__/node_modules/moment/locale/tlh.js","webpack://__ember_auto_import__/node_modules/moment/locale/tr.js","webpack://__ember_auto_import__/node_modules/moment/locale/tzl.js","webpack://__ember_auto_import__/node_modules/moment/locale/tzm-latn.js","webpack://__ember_auto_import__/node_modules/moment/locale/tzm.js","webpack://__ember_auto_import__/node_modules/moment/locale/ug-cn.js","webpack://__ember_auto_import__/node_modules/moment/locale/uk.js","webpack://__ember_auto_import__/node_modules/moment/locale/ur.js","webpack://__ember_auto_import__/node_modules/moment/locale/uz-latn.js","webpack://__ember_auto_import__/node_modules/moment/locale/uz.js","webpack://__ember_auto_import__/node_modules/moment/locale/vi.js","webpack://__ember_auto_import__/node_modules/moment/locale/x-pseudo.js","webpack://__ember_auto_import__/node_modules/moment/locale/yo.js","webpack://__ember_auto_import__/node_modules/moment/locale/zh-cn.js","webpack://__ember_auto_import__/node_modules/moment/locale/zh-hk.js","webpack://__ember_auto_import__/node_modules/moment/locale/zh-mo.js","webpack://__ember_auto_import__/node_modules/moment/locale/zh-tw.js","webpack://__ember_auto_import__/node_modules/moment/moment.js","webpack://__ember_auto_import__/src/utils/isBrowser.js","webpack://__ember_auto_import__/src/utils/debounce.js","webpack://__ember_auto_import__/src/utils/isFunction.js","webpack://__ember_auto_import__/src/utils/getStyleComputedProperty.js","webpack://__ember_auto_import__/src/utils/getParentNode.js","webpack://__ember_auto_import__/src/utils/getScrollParent.js","webpack://__ember_auto_import__/src/utils/getReferenceNode.js","webpack://__ember_auto_import__/src/utils/isIE.js","webpack://__ember_auto_import__/src/utils/getOffsetParent.js","webpack://__ember_auto_import__/src/utils/getRoot.js","webpack://__ember_auto_import__/src/utils/findCommonOffsetParent.js","webpack://__ember_auto_import__/src/utils/isOffsetContainer.js","webpack://__ember_auto_import__/src/utils/getScroll.js","webpack://__ember_auto_import__/src/utils/getBordersSize.js","webpack://__ember_auto_import__/src/utils/getWindowSizes.js","webpack://__ember_auto_import__/src/utils/getClientRect.js","webpack://__ember_auto_import__/src/utils/getBoundingClientRect.js","webpack://__ember_auto_import__/src/utils/getOffsetRectRelativeToArbitraryNode.js","webpack://__ember_auto_import__/src/utils/includeScroll.js","webpack://__ember_auto_import__/src/utils/isFixed.js","webpack://__ember_auto_import__/src/utils/getFixedPositionOffsetParent.js","webpack://__ember_auto_import__/src/utils/getBoundaries.js","webpack://__ember_auto_import__/src/utils/getViewportOffsetRectRelativeToArtbitraryNode.js","webpack://__ember_auto_import__/src/utils/computeAutoPlacement.js","webpack://__ember_auto_import__/src/utils/getReferenceOffsets.js","webpack://__ember_auto_import__/src/utils/getOuterSizes.js","webpack://__ember_auto_import__/src/utils/getOppositePlacement.js","webpack://__ember_auto_import__/src/utils/getPopperOffsets.js","webpack://__ember_auto_import__/src/utils/find.js","webpack://__ember_auto_import__/src/utils/runModifiers.js","webpack://__ember_auto_import__/src/utils/findIndex.js","webpack://__ember_auto_import__/src/methods/update.js","webpack://__ember_auto_import__/src/utils/isModifierEnabled.js","webpack://__ember_auto_import__/src/utils/getSupportedPropertyName.js","webpack://__ember_auto_import__/src/methods/destroy.js","webpack://__ember_auto_import__/src/utils/getWindow.js","webpack://__ember_auto_import__/src/utils/setupEventListeners.js","webpack://__ember_auto_import__/src/methods/enableEventListeners.js","webpack://__ember_auto_import__/src/methods/disableEventListeners.js","webpack://__ember_auto_import__/src/utils/removeEventListeners.js","webpack://__ember_auto_import__/src/utils/isNumeric.js","webpack://__ember_auto_import__/src/utils/setStyles.js","webpack://__ember_auto_import__/src/modifiers/computeStyle.js","webpack://__ember_auto_import__/src/utils/isModifierRequired.js","webpack://__ember_auto_import__/src/methods/placements.js","webpack://__ember_auto_import__/src/utils/clockwise.js","webpack://__ember_auto_import__/src/modifiers/index.js","webpack://__ember_auto_import__/src/modifiers/shift.js","webpack://__ember_auto_import__/src/modifiers/offset.js","webpack://__ember_auto_import__/src/modifiers/preventOverflow.js","webpack://__ember_auto_import__/src/modifiers/keepTogether.js","webpack://__ember_auto_import__/src/modifiers/arrow.js","webpack://__ember_auto_import__/src/modifiers/flip.js","webpack://__ember_auto_import__/src/utils/getOppositeVariation.js","webpack://__ember_auto_import__/src/modifiers/inner.js","webpack://__ember_auto_import__/src/modifiers/hide.js","webpack://__ember_auto_import__/src/utils/getRoundedOffsets.js","webpack://__ember_auto_import__/src/modifiers/applyStyle.js","webpack://__ember_auto_import__/src/utils/setAttributes.js","webpack://__ember_auto_import__/src/methods/defaults.js","webpack://__ember_auto_import__/src/index.js","webpack://__ember_auto_import__/popper/src/utils/isFunction.js","webpack://__ember_auto_import__/node_modules/viewerjs/dist/viewer.js","webpack://__ember_auto_import__/node_modules/@tauri-apps/api/core.cjs","webpack://__ember_auto_import__/node_modules/@tauri-apps/api/event.cjs","webpack://__ember_auto_import__/node_modules/@tauri-apps/api/external/tslib/tslib.es6.cjs","webpack://__ember_auto_import__/node_modules/@tauri-apps/plugin-dialog/dist-js/index.cjs","webpack://__ember_auto_import__/node_modules/@tauri-apps/plugin-dialog/node_modules/@tauri-apps/api/core.cjs","webpack://__ember_auto_import__/node_modules/@tauri-apps/plugin-dialog/node_modules/@tauri-apps/api/external/tslib/tslib.es6.cjs","webpack://__ember_auto_import__/node_modules/@tauri-apps/plugin-opener/dist-js/index.cjs","webpack://__ember_auto_import__/node_modules/@tauri-apps/plugin-opener/node_modules/@tauri-apps/api/core.cjs","webpack://__ember_auto_import__/node_modules/@tauri-apps/plugin-opener/node_modules/@tauri-apps/api/external/tslib/tslib.es6.cjs","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/index.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/max.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/md5.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/native.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/nil.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/parse.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/regex.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/rng.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/sha1.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/stringify.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/v1.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/v1ToV6.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/v3.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/v35.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/v4.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/v5.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/v6.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/v6ToV1.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/v7.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/validate.js","webpack://__ember_auto_import__/node_modules/uuid/dist/cjs-browser/version.js","webpack://__ember_auto_import__/src/runtime.ts","webpack://__ember_auto_import__/node_modules/mime/dist/types/other.js","webpack://__ember_auto_import__/node_modules/mime/dist/types/standard.js","webpack://__ember_auto_import__/node_modules/mime/dist/src/Mime.js","webpack://__ember_auto_import__/node_modules/mime/dist/src/index.js","webpack://__ember_auto_import__/node_modules/nanoid/url-alphabet/index.js","webpack://__ember_auto_import__/node_modules/nanoid/index.browser.js","webpack://__ember_auto_import__/pdf.js/webpack/bootstrap","webpack://__ember_auto_import__/pdf.js/webpack/runtime/define property getters","webpack://__ember_auto_import__/pdf.js/webpack/runtime/hasOwnProperty shorthand","webpack://__ember_auto_import__/pdf.js/src/shared/util.js","webpack://__ember_auto_import__/pdf.js/src/display/display_utils.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/toolbar.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/tools.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/alt_text.js","webpack://__ember_auto_import__/pdf.js/src/display/touch_manager.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/editor.js","webpack://__ember_auto_import__/pdf.js/src/shared/murmurhash3.js","webpack://__ember_auto_import__/pdf.js/src/display/annotation_storage.js","webpack://__ember_auto_import__/pdf.js/src/display/font_loader.js","webpack://__ember_auto_import__/pdf.js/src/shared/message_handler.js","webpack://__ember_auto_import__/pdf.js/src/display/canvas_factory.js","webpack://__ember_auto_import__/pdf.js/src/display/cmap_reader_factory.js","webpack://__ember_auto_import__/pdf.js/src/display/filter_factory.js","webpack://__ember_auto_import__/pdf.js/src/display/standard_fontdata_factory.js","webpack://__ember_auto_import__/pdf.js/src/display/node_utils.js","webpack://__ember_auto_import__/pdf.js/src/display/pattern_helper.js","webpack://__ember_auto_import__/pdf.js/src/shared/image_utils.js","webpack://__ember_auto_import__/pdf.js/src/display/canvas.js","webpack://__ember_auto_import__/pdf.js/src/display/worker_options.js","webpack://__ember_auto_import__/pdf.js/src/display/metadata.js","webpack://__ember_auto_import__/pdf.js/src/display/optional_content_config.js","webpack://__ember_auto_import__/pdf.js/src/display/transport_stream.js","webpack://__ember_auto_import__/pdf.js/src/display/network_utils.js","webpack://__ember_auto_import__/pdf.js/src/display/content_disposition.js","webpack://__ember_auto_import__/pdf.js/src/display/fetch_stream.js","webpack://__ember_auto_import__/pdf.js/src/display/network.js","webpack://__ember_auto_import__/pdf.js/src/display/node_stream.js","webpack://__ember_auto_import__/pdf.js/src/display/text_layer.js","webpack://__ember_auto_import__/pdf.js/src/display/xfa_text.js","webpack://__ember_auto_import__/pdf.js/src/display/api.js","webpack://__ember_auto_import__/pdf.js/src/shared/scripting_utils.js","webpack://__ember_auto_import__/pdf.js/src/display/svg_factory.js","webpack://__ember_auto_import__/pdf.js/src/display/xfa_layer.js","webpack://__ember_auto_import__/pdf.js/src/display/annotation_layer.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/freetext.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/drawers/outline.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/drawers/freedraw.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/drawers/highlight.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/color_picker.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/highlight.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/draw.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/drawers/inkdraw.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/ink.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/stamp.js","webpack://__ember_auto_import__/pdf.js/src/display/editor/annotation_editor_layer.js","webpack://__ember_auto_import__/pdf.js/src/display/draw_layer.js","webpack://__ember_auto_import__/pdf.js/src/pdf.js","webpack://__ember_auto_import__/pdf.js/web/ui_utils.js","webpack://__ember_auto_import__/pdf.js/web/pdf_find_utils.js","webpack://__ember_auto_import__/pdf.js/web/pdf_find_controller.js","webpack://__ember_auto_import__/pdf.js/web/pdf_link_service.js","webpack://__ember_auto_import__/pdf.js/web/pdfjs.js","webpack://__ember_auto_import__/pdf.js/web/annotation_layer_builder.js","webpack://__ember_auto_import__/pdf.js/web/download_manager.js","webpack://__ember_auto_import__/pdf.js/web/event_utils.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/bundle/esm/types.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/bundle/esm/resolver.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/bundle/esm/scope.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/bundle/esm/builtins.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/bundle/esm/memoizer.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/bundle/esm/bundle.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/bundle/esm/resource.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/bundle/esm/index.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/dom/esm/overlay.js","webpack://__ember_auto_import__/pdf.js/node_modules/cached-iterable/src/cached_iterable.mjs","webpack://__ember_auto_import__/pdf.js/node_modules/cached-iterable/src/cached_sync_iterable.mjs","webpack://__ember_auto_import__/pdf.js/node_modules/cached-iterable/src/cached_async_iterable.mjs","webpack://__ember_auto_import__/pdf.js/node_modules/cached-iterable/src/index.mjs","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/dom/esm/localization.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/dom/esm/dom_localization.js","webpack://__ember_auto_import__/pdf.js/node_modules/@fluent/dom/esm/index.js","webpack://__ember_auto_import__/pdf.js/web/l10n.js","webpack://__ember_auto_import__/pdf.js/web/genericl10n.js","webpack://__ember_auto_import__/pdf.js/web/pdf_history.js","webpack://__ember_auto_import__/pdf.js/web/annotation_editor_layer_builder.js","webpack://__ember_auto_import__/pdf.js/web/app_options.js","webpack://__ember_auto_import__/pdf.js/web/draw_layer_builder.js","webpack://__ember_auto_import__/pdf.js/web/struct_tree_layer_builder.js","webpack://__ember_auto_import__/pdf.js/web/text_accessibility.js","webpack://__ember_auto_import__/pdf.js/web/text_highlighter.js","webpack://__ember_auto_import__/pdf.js/web/text_layer_builder.js","webpack://__ember_auto_import__/pdf.js/web/xfa_layer_builder.js","webpack://__ember_auto_import__/pdf.js/web/pdf_page_view.js","webpack://__ember_auto_import__/pdf.js/web/generic_scripting.js","webpack://__ember_auto_import__/pdf.js/web/pdf_scripting_manager.js","webpack://__ember_auto_import__/pdf.js/web/pdf_scripting_manager.component.js","webpack://__ember_auto_import__/pdf.js/web/pdf_rendering_queue.js","webpack://__ember_auto_import__/pdf.js/web/pdf_viewer.js","webpack://__ember_auto_import__/pdf.js/web/pdf_single_page_viewer.js","webpack://__ember_auto_import__/pdf.js/web/pdf_viewer.component.js","webpack://__ember_auto_import__/node_modules/swiper/modules/virtual.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/keyboard.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/mousewheel.mjs","webpack://__ember_auto_import__/node_modules/swiper/shared/create-element-if-not-defined.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/navigation.mjs","webpack://__ember_auto_import__/node_modules/swiper/shared/classes-to-selector.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/pagination.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/scrollbar.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/parallax.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/zoom.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/controller.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/a11y.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/history.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/hash-navigation.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/autoplay.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/thumbs.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/free-mode.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/grid.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/manipulation.mjs","webpack://__ember_auto_import__/node_modules/swiper/shared/effect-init.mjs","webpack://__ember_auto_import__/node_modules/swiper/shared/effect-target.mjs","webpack://__ember_auto_import__/node_modules/swiper/shared/effect-virtual-transition-end.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/effect-fade.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/effect-cube.mjs","webpack://__ember_auto_import__/node_modules/swiper/shared/create-shadow.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/effect-flip.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/effect-coverflow.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/effect-creative.mjs","webpack://__ember_auto_import__/node_modules/swiper/modules/effect-cards.mjs","webpack://__ember_auto_import__/node_modules/swiper/shared/ssr-window.esm.mjs","webpack://__ember_auto_import__/node_modules/swiper/shared/utils.mjs","webpack://__ember_auto_import__/node_modules/swiper/shared/swiper-core.mjs"],"sourcesContent":["/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n  return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n  ownKeys = Object.getOwnPropertyNames || function (o) {\n    var ar = [];\n    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n    return ar;\n  };\n  return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose, inner;\n    if (async) {\n      if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n      dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n      if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n      dispose = value[Symbol.dispose];\n      if (async) inner = dispose;\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  var r, s = 0;\n  function next() {\n    while (r = env.stack.pop()) {\n      try {\n        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n        if (r.dispose) {\n          var result = r.dispose.call(r.value);\n          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n        }\n        else s |= 1;\n      }\n      catch (e) {\n        fail(e);\n      }\n    }\n    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n  if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n      return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n          return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n      });\n  }\n  return path;\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __esDecorate,\n  __runInitializers,\n  __propKey,\n  __setFunctionName,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n  __rewriteRelativeImportExtension,\n};\n",null,"export var ErrorKind;\n(function (ErrorKind) {\n    /** Argument is unclosed (e.g. `{0`) */\n    ErrorKind[ErrorKind[\"EXPECT_ARGUMENT_CLOSING_BRACE\"] = 1] = \"EXPECT_ARGUMENT_CLOSING_BRACE\";\n    /** Argument is empty (e.g. `{}`). */\n    ErrorKind[ErrorKind[\"EMPTY_ARGUMENT\"] = 2] = \"EMPTY_ARGUMENT\";\n    /** Argument is malformed (e.g. `{foo!}``) */\n    ErrorKind[ErrorKind[\"MALFORMED_ARGUMENT\"] = 3] = \"MALFORMED_ARGUMENT\";\n    /** Expect an argument type (e.g. `{foo,}`) */\n    ErrorKind[ErrorKind[\"EXPECT_ARGUMENT_TYPE\"] = 4] = \"EXPECT_ARGUMENT_TYPE\";\n    /** Unsupported argument type (e.g. `{foo,foo}`) */\n    ErrorKind[ErrorKind[\"INVALID_ARGUMENT_TYPE\"] = 5] = \"INVALID_ARGUMENT_TYPE\";\n    /** Expect an argument style (e.g. `{foo, number, }`) */\n    ErrorKind[ErrorKind[\"EXPECT_ARGUMENT_STYLE\"] = 6] = \"EXPECT_ARGUMENT_STYLE\";\n    /** The number skeleton is invalid. */\n    ErrorKind[ErrorKind[\"INVALID_NUMBER_SKELETON\"] = 7] = \"INVALID_NUMBER_SKELETON\";\n    /** The date time skeleton is invalid. */\n    ErrorKind[ErrorKind[\"INVALID_DATE_TIME_SKELETON\"] = 8] = \"INVALID_DATE_TIME_SKELETON\";\n    /** Exepct a number skeleton following the `::` (e.g. `{foo, number, ::}`) */\n    ErrorKind[ErrorKind[\"EXPECT_NUMBER_SKELETON\"] = 9] = \"EXPECT_NUMBER_SKELETON\";\n    /** Exepct a date time skeleton following the `::` (e.g. `{foo, date, ::}`) */\n    ErrorKind[ErrorKind[\"EXPECT_DATE_TIME_SKELETON\"] = 10] = \"EXPECT_DATE_TIME_SKELETON\";\n    /** Unmatched apostrophes in the argument style (e.g. `{foo, number, 'test`) */\n    ErrorKind[ErrorKind[\"UNCLOSED_QUOTE_IN_ARGUMENT_STYLE\"] = 11] = \"UNCLOSED_QUOTE_IN_ARGUMENT_STYLE\";\n    /** Missing select argument options (e.g. `{foo, select}`) */\n    ErrorKind[ErrorKind[\"EXPECT_SELECT_ARGUMENT_OPTIONS\"] = 12] = \"EXPECT_SELECT_ARGUMENT_OPTIONS\";\n    /** Expecting an offset value in `plural` or `selectordinal` argument (e.g `{foo, plural, offset}`) */\n    ErrorKind[ErrorKind[\"EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE\"] = 13] = \"EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE\";\n    /** Offset value in `plural` or `selectordinal` is invalid (e.g. `{foo, plural, offset: x}`) */\n    ErrorKind[ErrorKind[\"INVALID_PLURAL_ARGUMENT_OFFSET_VALUE\"] = 14] = \"INVALID_PLURAL_ARGUMENT_OFFSET_VALUE\";\n    /** Expecting a selector in `select` argument (e.g `{foo, select}`) */\n    ErrorKind[ErrorKind[\"EXPECT_SELECT_ARGUMENT_SELECTOR\"] = 15] = \"EXPECT_SELECT_ARGUMENT_SELECTOR\";\n    /** Expecting a selector in `plural` or `selectordinal` argument (e.g `{foo, plural}`) */\n    ErrorKind[ErrorKind[\"EXPECT_PLURAL_ARGUMENT_SELECTOR\"] = 16] = \"EXPECT_PLURAL_ARGUMENT_SELECTOR\";\n    /** Expecting a message fragment after the `select` selector (e.g. `{foo, select, apple}`) */\n    ErrorKind[ErrorKind[\"EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT\"] = 17] = \"EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT\";\n    /**\n     * Expecting a message fragment after the `plural` or `selectordinal` selector\n     * (e.g. `{foo, plural, one}`)\n     */\n    ErrorKind[ErrorKind[\"EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT\"] = 18] = \"EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT\";\n    /** Selector in `plural` or `selectordinal` is malformed (e.g. `{foo, plural, =x {#}}`) */\n    ErrorKind[ErrorKind[\"INVALID_PLURAL_ARGUMENT_SELECTOR\"] = 19] = \"INVALID_PLURAL_ARGUMENT_SELECTOR\";\n    /**\n     * Duplicate selectors in `plural` or `selectordinal` argument.\n     * (e.g. {foo, plural, one {#} one {#}})\n     */\n    ErrorKind[ErrorKind[\"DUPLICATE_PLURAL_ARGUMENT_SELECTOR\"] = 20] = \"DUPLICATE_PLURAL_ARGUMENT_SELECTOR\";\n    /** Duplicate selectors in `select` argument.\n     * (e.g. {foo, select, apple {apple} apple {apple}})\n     */\n    ErrorKind[ErrorKind[\"DUPLICATE_SELECT_ARGUMENT_SELECTOR\"] = 21] = \"DUPLICATE_SELECT_ARGUMENT_SELECTOR\";\n    /** Plural or select argument option must have `other` clause. */\n    ErrorKind[ErrorKind[\"MISSING_OTHER_CLAUSE\"] = 22] = \"MISSING_OTHER_CLAUSE\";\n    /** The tag is malformed. (e.g. `<bold!>foo</bold!>) */\n    ErrorKind[ErrorKind[\"INVALID_TAG\"] = 23] = \"INVALID_TAG\";\n    /** The tag name is invalid. (e.g. `<123>foo</123>`) */\n    ErrorKind[ErrorKind[\"INVALID_TAG_NAME\"] = 25] = \"INVALID_TAG_NAME\";\n    /** The closing tag does not match the opening tag. (e.g. `<bold>foo</italic>`) */\n    ErrorKind[ErrorKind[\"UNMATCHED_CLOSING_TAG\"] = 26] = \"UNMATCHED_CLOSING_TAG\";\n    /** The opening tag has unmatched closing tag. (e.g. `<bold>foo`) */\n    ErrorKind[ErrorKind[\"UNCLOSED_TAG\"] = 27] = \"UNCLOSED_TAG\";\n})(ErrorKind || (ErrorKind = {}));\n","export var TYPE;\n(function (TYPE) {\n    /**\n     * Raw text\n     */\n    TYPE[TYPE[\"literal\"] = 0] = \"literal\";\n    /**\n     * Variable w/o any format, e.g `var` in `this is a {var}`\n     */\n    TYPE[TYPE[\"argument\"] = 1] = \"argument\";\n    /**\n     * Variable w/ number format\n     */\n    TYPE[TYPE[\"number\"] = 2] = \"number\";\n    /**\n     * Variable w/ date format\n     */\n    TYPE[TYPE[\"date\"] = 3] = \"date\";\n    /**\n     * Variable w/ time format\n     */\n    TYPE[TYPE[\"time\"] = 4] = \"time\";\n    /**\n     * Variable w/ select format\n     */\n    TYPE[TYPE[\"select\"] = 5] = \"select\";\n    /**\n     * Variable w/ plural format\n     */\n    TYPE[TYPE[\"plural\"] = 6] = \"plural\";\n    /**\n     * Only possible within plural argument.\n     * This is the `#` symbol that will be substituted with the count.\n     */\n    TYPE[TYPE[\"pound\"] = 7] = \"pound\";\n    /**\n     * XML-like tag\n     */\n    TYPE[TYPE[\"tag\"] = 8] = \"tag\";\n})(TYPE || (TYPE = {}));\nexport var SKELETON_TYPE;\n(function (SKELETON_TYPE) {\n    SKELETON_TYPE[SKELETON_TYPE[\"number\"] = 0] = \"number\";\n    SKELETON_TYPE[SKELETON_TYPE[\"dateTime\"] = 1] = \"dateTime\";\n})(SKELETON_TYPE || (SKELETON_TYPE = {}));\n/**\n * Type Guards\n */\nexport function isLiteralElement(el) {\n    return el.type === TYPE.literal;\n}\nexport function isArgumentElement(el) {\n    return el.type === TYPE.argument;\n}\nexport function isNumberElement(el) {\n    return el.type === TYPE.number;\n}\nexport function isDateElement(el) {\n    return el.type === TYPE.date;\n}\nexport function isTimeElement(el) {\n    return el.type === TYPE.time;\n}\nexport function isSelectElement(el) {\n    return el.type === TYPE.select;\n}\nexport function isPluralElement(el) {\n    return el.type === TYPE.plural;\n}\nexport function isPoundElement(el) {\n    return el.type === TYPE.pound;\n}\nexport function isTagElement(el) {\n    return el.type === TYPE.tag;\n}\nexport function isNumberSkeleton(el) {\n    return !!(el && typeof el === 'object' && el.type === SKELETON_TYPE.number);\n}\nexport function isDateTimeSkeleton(el) {\n    return !!(el && typeof el === 'object' && el.type === SKELETON_TYPE.dateTime);\n}\nexport function createLiteralElement(value) {\n    return {\n        type: TYPE.literal,\n        value: value,\n    };\n}\nexport function createNumberElement(value, style) {\n    return {\n        type: TYPE.number,\n        value: value,\n        style: style,\n    };\n}\n","// @generated from regex-gen.ts\nexport var SPACE_SEPARATOR_REGEX = /[ \\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/;\nexport var WHITE_SPACE_REGEX = /[\\t-\\r \\x85\\u200E\\u200F\\u2028\\u2029]/;\n","/**\n * https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * Credit: https://github.com/caridy/intl-datetimeformat-pattern/blob/master/index.js\n * with some tweaks\n */\nvar DATE_TIME_REGEX = /(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g;\n/**\n * Parse Date time skeleton into Intl.DateTimeFormatOptions\n * Ref: https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * @public\n * @param skeleton skeleton string\n */\nexport function parseDateTimeSkeleton(skeleton) {\n    var result = {};\n    skeleton.replace(DATE_TIME_REGEX, function (match) {\n        var len = match.length;\n        switch (match[0]) {\n            // Era\n            case 'G':\n                result.era = len === 4 ? 'long' : len === 5 ? 'narrow' : 'short';\n                break;\n            // Year\n            case 'y':\n                result.year = len === 2 ? '2-digit' : 'numeric';\n                break;\n            case 'Y':\n            case 'u':\n            case 'U':\n            case 'r':\n                throw new RangeError('`Y/u/U/r` (year) patterns are not supported, use `y` instead');\n            // Quarter\n            case 'q':\n            case 'Q':\n                throw new RangeError('`q/Q` (quarter) patterns are not supported');\n            // Month\n            case 'M':\n            case 'L':\n                result.month = ['numeric', '2-digit', 'short', 'long', 'narrow'][len - 1];\n                break;\n            // Week\n            case 'w':\n            case 'W':\n                throw new RangeError('`w/W` (week) patterns are not supported');\n            case 'd':\n                result.day = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'D':\n            case 'F':\n            case 'g':\n                throw new RangeError('`D/F/g` (day) patterns are not supported, use `d` instead');\n            // Weekday\n            case 'E':\n                result.weekday = len === 4 ? 'long' : len === 5 ? 'narrow' : 'short';\n                break;\n            case 'e':\n                if (len < 4) {\n                    throw new RangeError('`e..eee` (weekday) patterns are not supported');\n                }\n                result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];\n                break;\n            case 'c':\n                if (len < 4) {\n                    throw new RangeError('`c..ccc` (weekday) patterns are not supported');\n                }\n                result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];\n                break;\n            // Period\n            case 'a': // AM, PM\n                result.hour12 = true;\n                break;\n            case 'b': // am, pm, noon, midnight\n            case 'B': // flexible day periods\n                throw new RangeError('`b/B` (period) patterns are not supported, use `a` instead');\n            // Hour\n            case 'h':\n                result.hourCycle = 'h12';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'H':\n                result.hourCycle = 'h23';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'K':\n                result.hourCycle = 'h11';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'k':\n                result.hourCycle = 'h24';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'j':\n            case 'J':\n            case 'C':\n                throw new RangeError('`j/J/C` (hour) patterns are not supported, use `h/H/K/k` instead');\n            // Minute\n            case 'm':\n                result.minute = ['numeric', '2-digit'][len - 1];\n                break;\n            // Second\n            case 's':\n                result.second = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'S':\n            case 'A':\n                throw new RangeError('`S/A` (second) patterns are not supported, use `s` instead');\n            // Zone\n            case 'z': // 1..3, 4: specific non-location format\n                result.timeZoneName = len < 4 ? 'short' : 'long';\n                break;\n            case 'Z': // 1..3, 4, 5: The ISO8601 varios formats\n            case 'O': // 1, 4: milliseconds in day short, long\n            case 'v': // 1, 4: generic non-location format\n            case 'V': // 1, 2, 3, 4: time zone ID or city\n            case 'X': // 1, 2, 3, 4: The ISO8601 varios formats\n            case 'x': // 1, 2, 3, 4: The ISO8601 varios formats\n                throw new RangeError('`Z/O/v/V/X/x` (timeZone) patterns are not supported, use `z` instead');\n        }\n        return '';\n    });\n    return result;\n}\n","// @generated from regex-gen.ts\nexport var WHITE_SPACE_REGEX = /[\\t-\\r \\x85\\u200E\\u200F\\u2028\\u2029]/i;\n","import { __assign } from \"tslib\";\nimport { WHITE_SPACE_REGEX } from './regex.generated';\nexport function parseNumberSkeletonFromString(skeleton) {\n    if (skeleton.length === 0) {\n        throw new Error('Number skeleton cannot be empty');\n    }\n    // Parse the skeleton\n    var stringTokens = skeleton\n        .split(WHITE_SPACE_REGEX)\n        .filter(function (x) { return x.length > 0; });\n    var tokens = [];\n    for (var _i = 0, stringTokens_1 = stringTokens; _i < stringTokens_1.length; _i++) {\n        var stringToken = stringTokens_1[_i];\n        var stemAndOptions = stringToken.split('/');\n        if (stemAndOptions.length === 0) {\n            throw new Error('Invalid number skeleton');\n        }\n        var stem = stemAndOptions[0], options = stemAndOptions.slice(1);\n        for (var _a = 0, options_1 = options; _a < options_1.length; _a++) {\n            var option = options_1[_a];\n            if (option.length === 0) {\n                throw new Error('Invalid number skeleton');\n            }\n        }\n        tokens.push({ stem: stem, options: options });\n    }\n    return tokens;\n}\nfunction icuUnitToEcma(unit) {\n    return unit.replace(/^(.*?)-/, '');\n}\nvar FRACTION_PRECISION_REGEX = /^\\.(?:(0+)(\\*)?|(#+)|(0+)(#+))$/g;\nvar SIGNIFICANT_PRECISION_REGEX = /^(@+)?(\\+|#+)?[rs]?$/g;\nvar INTEGER_WIDTH_REGEX = /(\\*)(0+)|(#+)(0+)|(0+)/g;\nvar CONCISE_INTEGER_WIDTH_REGEX = /^(0+)$/;\nfunction parseSignificantPrecision(str) {\n    var result = {};\n    if (str[str.length - 1] === 'r') {\n        result.roundingPriority = 'morePrecision';\n    }\n    else if (str[str.length - 1] === 's') {\n        result.roundingPriority = 'lessPrecision';\n    }\n    str.replace(SIGNIFICANT_PRECISION_REGEX, function (_, g1, g2) {\n        // @@@ case\n        if (typeof g2 !== 'string') {\n            result.minimumSignificantDigits = g1.length;\n            result.maximumSignificantDigits = g1.length;\n        }\n        // @@@+ case\n        else if (g2 === '+') {\n            result.minimumSignificantDigits = g1.length;\n        }\n        // .### case\n        else if (g1[0] === '#') {\n            result.maximumSignificantDigits = g1.length;\n        }\n        // .@@## or .@@@ case\n        else {\n            result.minimumSignificantDigits = g1.length;\n            result.maximumSignificantDigits =\n                g1.length + (typeof g2 === 'string' ? g2.length : 0);\n        }\n        return '';\n    });\n    return result;\n}\nfunction parseSign(str) {\n    switch (str) {\n        case 'sign-auto':\n            return {\n                signDisplay: 'auto',\n            };\n        case 'sign-accounting':\n        case '()':\n            return {\n                currencySign: 'accounting',\n            };\n        case 'sign-always':\n        case '+!':\n            return {\n                signDisplay: 'always',\n            };\n        case 'sign-accounting-always':\n        case '()!':\n            return {\n                signDisplay: 'always',\n                currencySign: 'accounting',\n            };\n        case 'sign-except-zero':\n        case '+?':\n            return {\n                signDisplay: 'exceptZero',\n            };\n        case 'sign-accounting-except-zero':\n        case '()?':\n            return {\n                signDisplay: 'exceptZero',\n                currencySign: 'accounting',\n            };\n        case 'sign-never':\n        case '+_':\n            return {\n                signDisplay: 'never',\n            };\n    }\n}\nfunction parseConciseScientificAndEngineeringStem(stem) {\n    // Engineering\n    var result;\n    if (stem[0] === 'E' && stem[1] === 'E') {\n        result = {\n            notation: 'engineering',\n        };\n        stem = stem.slice(2);\n    }\n    else if (stem[0] === 'E') {\n        result = {\n            notation: 'scientific',\n        };\n        stem = stem.slice(1);\n    }\n    if (result) {\n        var signDisplay = stem.slice(0, 2);\n        if (signDisplay === '+!') {\n            result.signDisplay = 'always';\n            stem = stem.slice(2);\n        }\n        else if (signDisplay === '+?') {\n            result.signDisplay = 'exceptZero';\n            stem = stem.slice(2);\n        }\n        if (!CONCISE_INTEGER_WIDTH_REGEX.test(stem)) {\n            throw new Error('Malformed concise eng/scientific notation');\n        }\n        result.minimumIntegerDigits = stem.length;\n    }\n    return result;\n}\nfunction parseNotationOptions(opt) {\n    var result = {};\n    var signOpts = parseSign(opt);\n    if (signOpts) {\n        return signOpts;\n    }\n    return result;\n}\n/**\n * https://github.com/unicode-org/icu/blob/master/docs/userguide/format_parse/numbers/skeletons.md#skeleton-stems-and-options\n */\nexport function parseNumberSkeleton(tokens) {\n    var result = {};\n    for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {\n        var token = tokens_1[_i];\n        switch (token.stem) {\n            case 'percent':\n            case '%':\n                result.style = 'percent';\n                continue;\n            case '%x100':\n                result.style = 'percent';\n                result.scale = 100;\n                continue;\n            case 'currency':\n                result.style = 'currency';\n                result.currency = token.options[0];\n                continue;\n            case 'group-off':\n            case ',_':\n                result.useGrouping = false;\n                continue;\n            case 'precision-integer':\n            case '.':\n                result.maximumFractionDigits = 0;\n                continue;\n            case 'measure-unit':\n            case 'unit':\n                result.style = 'unit';\n                result.unit = icuUnitToEcma(token.options[0]);\n                continue;\n            case 'compact-short':\n            case 'K':\n                result.notation = 'compact';\n                result.compactDisplay = 'short';\n                continue;\n            case 'compact-long':\n            case 'KK':\n                result.notation = 'compact';\n                result.compactDisplay = 'long';\n                continue;\n            case 'scientific':\n                result = __assign(__assign(__assign({}, result), { notation: 'scientific' }), token.options.reduce(function (all, opt) { return (__assign(__assign({}, all), parseNotationOptions(opt))); }, {}));\n                continue;\n            case 'engineering':\n                result = __assign(__assign(__assign({}, result), { notation: 'engineering' }), token.options.reduce(function (all, opt) { return (__assign(__assign({}, all), parseNotationOptions(opt))); }, {}));\n                continue;\n            case 'notation-simple':\n                result.notation = 'standard';\n                continue;\n            // https://github.com/unicode-org/icu/blob/master/icu4c/source/i18n/unicode/unumberformatter.h\n            case 'unit-width-narrow':\n                result.currencyDisplay = 'narrowSymbol';\n                result.unitDisplay = 'narrow';\n                continue;\n            case 'unit-width-short':\n                result.currencyDisplay = 'code';\n                result.unitDisplay = 'short';\n                continue;\n            case 'unit-width-full-name':\n                result.currencyDisplay = 'name';\n                result.unitDisplay = 'long';\n                continue;\n            case 'unit-width-iso-code':\n                result.currencyDisplay = 'symbol';\n                continue;\n            case 'scale':\n                result.scale = parseFloat(token.options[0]);\n                continue;\n            case 'rounding-mode-floor':\n                result.roundingMode = 'floor';\n                continue;\n            case 'rounding-mode-ceiling':\n                result.roundingMode = 'ceil';\n                continue;\n            case 'rounding-mode-down':\n                result.roundingMode = 'trunc';\n                continue;\n            case 'rounding-mode-up':\n                result.roundingMode = 'expand';\n                continue;\n            case 'rounding-mode-half-even':\n                result.roundingMode = 'halfEven';\n                continue;\n            case 'rounding-mode-half-down':\n                result.roundingMode = 'halfTrunc';\n                continue;\n            case 'rounding-mode-half-up':\n                result.roundingMode = 'halfExpand';\n                continue;\n            // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#integer-width\n            case 'integer-width':\n                if (token.options.length > 1) {\n                    throw new RangeError('integer-width stems only accept a single optional option');\n                }\n                token.options[0].replace(INTEGER_WIDTH_REGEX, function (_, g1, g2, g3, g4, g5) {\n                    if (g1) {\n                        result.minimumIntegerDigits = g2.length;\n                    }\n                    else if (g3 && g4) {\n                        throw new Error('We currently do not support maximum integer digits');\n                    }\n                    else if (g5) {\n                        throw new Error('We currently do not support exact integer digits');\n                    }\n                    return '';\n                });\n                continue;\n        }\n        // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#integer-width\n        if (CONCISE_INTEGER_WIDTH_REGEX.test(token.stem)) {\n            result.minimumIntegerDigits = token.stem.length;\n            continue;\n        }\n        if (FRACTION_PRECISION_REGEX.test(token.stem)) {\n            // Precision\n            // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#fraction-precision\n            // precision-integer case\n            if (token.options.length > 1) {\n                throw new RangeError('Fraction-precision stems only accept a single optional option');\n            }\n            token.stem.replace(FRACTION_PRECISION_REGEX, function (_, g1, g2, g3, g4, g5) {\n                // .000* case (before ICU67 it was .000+)\n                if (g2 === '*') {\n                    result.minimumFractionDigits = g1.length;\n                }\n                // .### case\n                else if (g3 && g3[0] === '#') {\n                    result.maximumFractionDigits = g3.length;\n                }\n                // .00## case\n                else if (g4 && g5) {\n                    result.minimumFractionDigits = g4.length;\n                    result.maximumFractionDigits = g4.length + g5.length;\n                }\n                else {\n                    result.minimumFractionDigits = g1.length;\n                    result.maximumFractionDigits = g1.length;\n                }\n                return '';\n            });\n            var opt = token.options[0];\n            // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#trailing-zero-display\n            if (opt === 'w') {\n                result = __assign(__assign({}, result), { trailingZeroDisplay: 'stripIfInteger' });\n            }\n            else if (opt) {\n                result = __assign(__assign({}, result), parseSignificantPrecision(opt));\n            }\n            continue;\n        }\n        // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#significant-digits-precision\n        if (SIGNIFICANT_PRECISION_REGEX.test(token.stem)) {\n            result = __assign(__assign({}, result), parseSignificantPrecision(token.stem));\n            continue;\n        }\n        var signOpts = parseSign(token.stem);\n        if (signOpts) {\n            result = __assign(__assign({}, result), signOpts);\n        }\n        var conciseScientificAndEngineeringOpts = parseConciseScientificAndEngineeringStem(token.stem);\n        if (conciseScientificAndEngineeringOpts) {\n            result = __assign(__assign({}, result), conciseScientificAndEngineeringOpts);\n        }\n    }\n    return result;\n}\n","// @generated from time-data-gen.ts\n// prettier-ignore  \nexport var timeData = {\n    \"001\": [\n        \"H\",\n        \"h\"\n    ],\n    \"419\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"AC\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"AD\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"AE\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"AF\": [\n        \"H\",\n        \"hb\",\n        \"hB\",\n        \"h\"\n    ],\n    \"AG\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"AI\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"AL\": [\n        \"h\",\n        \"H\",\n        \"hB\"\n    ],\n    \"AM\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"AO\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"AR\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"AS\": [\n        \"h\",\n        \"H\"\n    ],\n    \"AT\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"AU\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"AW\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"AX\": [\n        \"H\"\n    ],\n    \"AZ\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"BA\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"BB\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"BD\": [\n        \"h\",\n        \"hB\",\n        \"H\"\n    ],\n    \"BE\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"BF\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"BG\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"BH\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"BI\": [\n        \"H\",\n        \"h\"\n    ],\n    \"BJ\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"BL\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"BM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"BN\": [\n        \"hb\",\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"BO\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"BQ\": [\n        \"H\"\n    ],\n    \"BR\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"BS\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"BT\": [\n        \"h\",\n        \"H\"\n    ],\n    \"BW\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"BY\": [\n        \"H\",\n        \"h\"\n    ],\n    \"BZ\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"CA\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"CC\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"CD\": [\n        \"hB\",\n        \"H\"\n    ],\n    \"CF\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"CG\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"CH\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"CI\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"CK\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"CL\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"CM\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"CN\": [\n        \"H\",\n        \"hB\",\n        \"hb\",\n        \"h\"\n    ],\n    \"CO\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"CP\": [\n        \"H\"\n    ],\n    \"CR\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"CU\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"CV\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"CW\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"CX\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"CY\": [\n        \"h\",\n        \"H\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"CZ\": [\n        \"H\"\n    ],\n    \"DE\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"DG\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"DJ\": [\n        \"h\",\n        \"H\"\n    ],\n    \"DK\": [\n        \"H\"\n    ],\n    \"DM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"DO\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"DZ\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"EA\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"EC\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"EE\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"EG\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"EH\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"ER\": [\n        \"h\",\n        \"H\"\n    ],\n    \"ES\": [\n        \"H\",\n        \"hB\",\n        \"h\",\n        \"hb\"\n    ],\n    \"ET\": [\n        \"hB\",\n        \"hb\",\n        \"h\",\n        \"H\"\n    ],\n    \"FI\": [\n        \"H\"\n    ],\n    \"FJ\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"FK\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"FM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"FO\": [\n        \"H\",\n        \"h\"\n    ],\n    \"FR\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GA\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GB\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"GD\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"GE\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"GF\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GG\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"GH\": [\n        \"h\",\n        \"H\"\n    ],\n    \"GI\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"GL\": [\n        \"H\",\n        \"h\"\n    ],\n    \"GM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"GN\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GP\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GQ\": [\n        \"H\",\n        \"hB\",\n        \"h\",\n        \"hb\"\n    ],\n    \"GR\": [\n        \"h\",\n        \"H\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"GT\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"GU\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"GW\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GY\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"HK\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"HN\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"HR\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"HU\": [\n        \"H\",\n        \"h\"\n    ],\n    \"IC\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"ID\": [\n        \"H\"\n    ],\n    \"IE\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"IL\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"IM\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"IN\": [\n        \"h\",\n        \"H\"\n    ],\n    \"IO\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"IQ\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"IR\": [\n        \"hB\",\n        \"H\"\n    ],\n    \"IS\": [\n        \"H\"\n    ],\n    \"IT\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"JE\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"JM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"JO\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"JP\": [\n        \"H\",\n        \"K\",\n        \"h\"\n    ],\n    \"KE\": [\n        \"hB\",\n        \"hb\",\n        \"H\",\n        \"h\"\n    ],\n    \"KG\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"KH\": [\n        \"hB\",\n        \"h\",\n        \"H\",\n        \"hb\"\n    ],\n    \"KI\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"KM\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"KN\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"KP\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"KR\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"KW\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"KY\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"KZ\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"LA\": [\n        \"H\",\n        \"hb\",\n        \"hB\",\n        \"h\"\n    ],\n    \"LB\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"LC\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"LI\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"LK\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"LR\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"LS\": [\n        \"h\",\n        \"H\"\n    ],\n    \"LT\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"LU\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"LV\": [\n        \"H\",\n        \"hB\",\n        \"hb\",\n        \"h\"\n    ],\n    \"LY\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"MA\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"MC\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"MD\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"ME\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"MF\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"MG\": [\n        \"H\",\n        \"h\"\n    ],\n    \"MH\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"MK\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"ML\": [\n        \"H\"\n    ],\n    \"MM\": [\n        \"hB\",\n        \"hb\",\n        \"H\",\n        \"h\"\n    ],\n    \"MN\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"MO\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"MP\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"MQ\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"MR\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"MS\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"MT\": [\n        \"H\",\n        \"h\"\n    ],\n    \"MU\": [\n        \"H\",\n        \"h\"\n    ],\n    \"MV\": [\n        \"H\",\n        \"h\"\n    ],\n    \"MW\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"MX\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"MY\": [\n        \"hb\",\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"MZ\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"NA\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"NC\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"NE\": [\n        \"H\"\n    ],\n    \"NF\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"NG\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"NI\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"NL\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"NO\": [\n        \"H\",\n        \"h\"\n    ],\n    \"NP\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"NR\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"NU\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"NZ\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"OM\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"PA\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"PE\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"PF\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"PG\": [\n        \"h\",\n        \"H\"\n    ],\n    \"PH\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"PK\": [\n        \"h\",\n        \"hB\",\n        \"H\"\n    ],\n    \"PL\": [\n        \"H\",\n        \"h\"\n    ],\n    \"PM\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"PN\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"PR\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"PS\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"PT\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"PW\": [\n        \"h\",\n        \"H\"\n    ],\n    \"PY\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"QA\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"RE\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"RO\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"RS\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"RU\": [\n        \"H\"\n    ],\n    \"RW\": [\n        \"H\",\n        \"h\"\n    ],\n    \"SA\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"SB\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"SC\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"SD\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"SE\": [\n        \"H\"\n    ],\n    \"SG\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"SH\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"SI\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"SJ\": [\n        \"H\"\n    ],\n    \"SK\": [\n        \"H\"\n    ],\n    \"SL\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"SM\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"SN\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"SO\": [\n        \"h\",\n        \"H\"\n    ],\n    \"SR\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"SS\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"ST\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"SV\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"SX\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"SY\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"SZ\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"TA\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"TC\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"TD\": [\n        \"h\",\n        \"H\",\n        \"hB\"\n    ],\n    \"TF\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"TG\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"TH\": [\n        \"H\",\n        \"h\"\n    ],\n    \"TJ\": [\n        \"H\",\n        \"h\"\n    ],\n    \"TL\": [\n        \"H\",\n        \"hB\",\n        \"hb\",\n        \"h\"\n    ],\n    \"TM\": [\n        \"H\",\n        \"h\"\n    ],\n    \"TN\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"TO\": [\n        \"h\",\n        \"H\"\n    ],\n    \"TR\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"TT\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"TW\": [\n        \"hB\",\n        \"hb\",\n        \"h\",\n        \"H\"\n    ],\n    \"TZ\": [\n        \"hB\",\n        \"hb\",\n        \"H\",\n        \"h\"\n    ],\n    \"UA\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"UG\": [\n        \"hB\",\n        \"hb\",\n        \"H\",\n        \"h\"\n    ],\n    \"UM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"US\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"UY\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"UZ\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"VA\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"VC\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"VE\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"VG\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"VI\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"VN\": [\n        \"H\",\n        \"h\"\n    ],\n    \"VU\": [\n        \"h\",\n        \"H\"\n    ],\n    \"WF\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"WS\": [\n        \"h\",\n        \"H\"\n    ],\n    \"XK\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"YE\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"YT\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"ZA\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"ZM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"ZW\": [\n        \"H\",\n        \"h\"\n    ],\n    \"af-ZA\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"ar-001\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"ca-ES\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"en-001\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"en-HK\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"en-IL\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"en-MY\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"es-BR\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"es-ES\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"es-GQ\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"fr-CA\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"gl-ES\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"gu-IN\": [\n        \"hB\",\n        \"hb\",\n        \"h\",\n        \"H\"\n    ],\n    \"hi-IN\": [\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"it-CH\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"it-IT\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"kn-IN\": [\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"ml-IN\": [\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"mr-IN\": [\n        \"hB\",\n        \"hb\",\n        \"h\",\n        \"H\"\n    ],\n    \"pa-IN\": [\n        \"hB\",\n        \"hb\",\n        \"h\",\n        \"H\"\n    ],\n    \"ta-IN\": [\n        \"hB\",\n        \"h\",\n        \"hb\",\n        \"H\"\n    ],\n    \"te-IN\": [\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"zu-ZA\": [\n        \"H\",\n        \"hB\",\n        \"hb\",\n        \"h\"\n    ]\n};\n","var _a;\nimport { __assign } from \"tslib\";\nimport { ErrorKind } from './error';\nimport { SKELETON_TYPE, TYPE, } from './types';\nimport { SPACE_SEPARATOR_REGEX } from './regex.generated';\nimport { parseNumberSkeleton, parseNumberSkeletonFromString, parseDateTimeSkeleton, } from '@formatjs/icu-skeleton-parser';\nimport { getBestPattern } from './date-time-pattern-generator';\nvar SPACE_SEPARATOR_START_REGEX = new RegExp(\"^\".concat(SPACE_SEPARATOR_REGEX.source, \"*\"));\nvar SPACE_SEPARATOR_END_REGEX = new RegExp(\"\".concat(SPACE_SEPARATOR_REGEX.source, \"*$\"));\nfunction createLocation(start, end) {\n    return { start: start, end: end };\n}\n// #region Ponyfills\n// Consolidate these variables up top for easier toggling during debugging\nvar hasNativeStartsWith = !!String.prototype.startsWith && '_a'.startsWith('a', 1);\nvar hasNativeFromCodePoint = !!String.fromCodePoint;\nvar hasNativeFromEntries = !!Object.fromEntries;\nvar hasNativeCodePointAt = !!String.prototype.codePointAt;\nvar hasTrimStart = !!String.prototype.trimStart;\nvar hasTrimEnd = !!String.prototype.trimEnd;\nvar hasNativeIsSafeInteger = !!Number.isSafeInteger;\nvar isSafeInteger = hasNativeIsSafeInteger\n    ? Number.isSafeInteger\n    : function (n) {\n        return (typeof n === 'number' &&\n            isFinite(n) &&\n            Math.floor(n) === n &&\n            Math.abs(n) <= 0x1fffffffffffff);\n    };\n// IE11 does not support y and u.\nvar REGEX_SUPPORTS_U_AND_Y = true;\ntry {\n    var re = RE('([^\\\\p{White_Space}\\\\p{Pattern_Syntax}]*)', 'yu');\n    /**\n     * legacy Edge or Xbox One browser\n     * Unicode flag support: supported\n     * Pattern_Syntax support: not supported\n     * See https://github.com/formatjs/formatjs/issues/2822\n     */\n    REGEX_SUPPORTS_U_AND_Y = ((_a = re.exec('a')) === null || _a === void 0 ? void 0 : _a[0]) === 'a';\n}\ncatch (_) {\n    REGEX_SUPPORTS_U_AND_Y = false;\n}\nvar startsWith = hasNativeStartsWith\n    ? // Native\n        function startsWith(s, search, position) {\n            return s.startsWith(search, position);\n        }\n    : // For IE11\n        function startsWith(s, search, position) {\n            return s.slice(position, position + search.length) === search;\n        };\nvar fromCodePoint = hasNativeFromCodePoint\n    ? String.fromCodePoint\n    : // IE11\n        function fromCodePoint() {\n            var codePoints = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                codePoints[_i] = arguments[_i];\n            }\n            var elements = '';\n            var length = codePoints.length;\n            var i = 0;\n            var code;\n            while (length > i) {\n                code = codePoints[i++];\n                if (code > 0x10ffff)\n                    throw RangeError(code + ' is not a valid code point');\n                elements +=\n                    code < 0x10000\n                        ? String.fromCharCode(code)\n                        : String.fromCharCode(((code -= 0x10000) >> 10) + 0xd800, (code % 0x400) + 0xdc00);\n            }\n            return elements;\n        };\nvar fromEntries = \n// native\nhasNativeFromEntries\n    ? Object.fromEntries\n    : // Ponyfill\n        function fromEntries(entries) {\n            var obj = {};\n            for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {\n                var _a = entries_1[_i], k = _a[0], v = _a[1];\n                obj[k] = v;\n            }\n            return obj;\n        };\nvar codePointAt = hasNativeCodePointAt\n    ? // Native\n        function codePointAt(s, index) {\n            return s.codePointAt(index);\n        }\n    : // IE 11\n        function codePointAt(s, index) {\n            var size = s.length;\n            if (index < 0 || index >= size) {\n                return undefined;\n            }\n            var first = s.charCodeAt(index);\n            var second;\n            return first < 0xd800 ||\n                first > 0xdbff ||\n                index + 1 === size ||\n                (second = s.charCodeAt(index + 1)) < 0xdc00 ||\n                second > 0xdfff\n                ? first\n                : ((first - 0xd800) << 10) + (second - 0xdc00) + 0x10000;\n        };\nvar trimStart = hasTrimStart\n    ? // Native\n        function trimStart(s) {\n            return s.trimStart();\n        }\n    : // Ponyfill\n        function trimStart(s) {\n            return s.replace(SPACE_SEPARATOR_START_REGEX, '');\n        };\nvar trimEnd = hasTrimEnd\n    ? // Native\n        function trimEnd(s) {\n            return s.trimEnd();\n        }\n    : // Ponyfill\n        function trimEnd(s) {\n            return s.replace(SPACE_SEPARATOR_END_REGEX, '');\n        };\n// Prevent minifier to translate new RegExp to literal form that might cause syntax error on IE11.\nfunction RE(s, flag) {\n    return new RegExp(s, flag);\n}\n// #endregion\nvar matchIdentifierAtIndex;\nif (REGEX_SUPPORTS_U_AND_Y) {\n    // Native\n    var IDENTIFIER_PREFIX_RE_1 = RE('([^\\\\p{White_Space}\\\\p{Pattern_Syntax}]*)', 'yu');\n    matchIdentifierAtIndex = function matchIdentifierAtIndex(s, index) {\n        var _a;\n        IDENTIFIER_PREFIX_RE_1.lastIndex = index;\n        var match = IDENTIFIER_PREFIX_RE_1.exec(s);\n        return (_a = match[1]) !== null && _a !== void 0 ? _a : '';\n    };\n}\nelse {\n    // IE11\n    matchIdentifierAtIndex = function matchIdentifierAtIndex(s, index) {\n        var match = [];\n        while (true) {\n            var c = codePointAt(s, index);\n            if (c === undefined || _isWhiteSpace(c) || _isPatternSyntax(c)) {\n                break;\n            }\n            match.push(c);\n            index += c >= 0x10000 ? 2 : 1;\n        }\n        return fromCodePoint.apply(void 0, match);\n    };\n}\nvar Parser = /** @class */ (function () {\n    function Parser(message, options) {\n        if (options === void 0) { options = {}; }\n        this.message = message;\n        this.position = { offset: 0, line: 1, column: 1 };\n        this.ignoreTag = !!options.ignoreTag;\n        this.locale = options.locale;\n        this.requiresOtherClause = !!options.requiresOtherClause;\n        this.shouldParseSkeletons = !!options.shouldParseSkeletons;\n    }\n    Parser.prototype.parse = function () {\n        if (this.offset() !== 0) {\n            throw Error('parser can only be used once');\n        }\n        return this.parseMessage(0, '', false);\n    };\n    Parser.prototype.parseMessage = function (nestingLevel, parentArgType, expectingCloseTag) {\n        var elements = [];\n        while (!this.isEOF()) {\n            var char = this.char();\n            if (char === 123 /* `{` */) {\n                var result = this.parseArgument(nestingLevel, expectingCloseTag);\n                if (result.err) {\n                    return result;\n                }\n                elements.push(result.val);\n            }\n            else if (char === 125 /* `}` */ && nestingLevel > 0) {\n                break;\n            }\n            else if (char === 35 /* `#` */ &&\n                (parentArgType === 'plural' || parentArgType === 'selectordinal')) {\n                var position = this.clonePosition();\n                this.bump();\n                elements.push({\n                    type: TYPE.pound,\n                    location: createLocation(position, this.clonePosition()),\n                });\n            }\n            else if (char === 60 /* `<` */ &&\n                !this.ignoreTag &&\n                this.peek() === 47 // char code for '/'\n            ) {\n                if (expectingCloseTag) {\n                    break;\n                }\n                else {\n                    return this.error(ErrorKind.UNMATCHED_CLOSING_TAG, createLocation(this.clonePosition(), this.clonePosition()));\n                }\n            }\n            else if (char === 60 /* `<` */ &&\n                !this.ignoreTag &&\n                _isAlpha(this.peek() || 0)) {\n                var result = this.parseTag(nestingLevel, parentArgType);\n                if (result.err) {\n                    return result;\n                }\n                elements.push(result.val);\n            }\n            else {\n                var result = this.parseLiteral(nestingLevel, parentArgType);\n                if (result.err) {\n                    return result;\n                }\n                elements.push(result.val);\n            }\n        }\n        return { val: elements, err: null };\n    };\n    /**\n     * A tag name must start with an ASCII lower/upper case letter. The grammar is based on the\n     * [custom element name][] except that a dash is NOT always mandatory and uppercase letters\n     * are accepted:\n     *\n     * ```\n     * tag ::= \"<\" tagName (whitespace)* \"/>\" | \"<\" tagName (whitespace)* \">\" message \"</\" tagName (whitespace)* \">\"\n     * tagName ::= [a-z] (PENChar)*\n     * PENChar ::=\n     *     \"-\" | \".\" | [0-9] | \"_\" | [a-z] | [A-Z] | #xB7 | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x37D] |\n     *     [#x37F-#x1FFF] | [#x200C-#x200D] | [#x203F-#x2040] | [#x2070-#x218F] | [#x2C00-#x2FEF] |\n     *     [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n     * ```\n     *\n     * [custom element name]: https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name\n     * NOTE: We're a bit more lax here since HTML technically does not allow uppercase HTML element but we do\n     * since other tag-based engines like React allow it\n     */\n    Parser.prototype.parseTag = function (nestingLevel, parentArgType) {\n        var startPosition = this.clonePosition();\n        this.bump(); // `<`\n        var tagName = this.parseTagName();\n        this.bumpSpace();\n        if (this.bumpIf('/>')) {\n            // Self closing tag\n            return {\n                val: {\n                    type: TYPE.literal,\n                    value: \"<\".concat(tagName, \"/>\"),\n                    location: createLocation(startPosition, this.clonePosition()),\n                },\n                err: null,\n            };\n        }\n        else if (this.bumpIf('>')) {\n            var childrenResult = this.parseMessage(nestingLevel + 1, parentArgType, true);\n            if (childrenResult.err) {\n                return childrenResult;\n            }\n            var children = childrenResult.val;\n            // Expecting a close tag\n            var endTagStartPosition = this.clonePosition();\n            if (this.bumpIf('</')) {\n                if (this.isEOF() || !_isAlpha(this.char())) {\n                    return this.error(ErrorKind.INVALID_TAG, createLocation(endTagStartPosition, this.clonePosition()));\n                }\n                var closingTagNameStartPosition = this.clonePosition();\n                var closingTagName = this.parseTagName();\n                if (tagName !== closingTagName) {\n                    return this.error(ErrorKind.UNMATCHED_CLOSING_TAG, createLocation(closingTagNameStartPosition, this.clonePosition()));\n                }\n                this.bumpSpace();\n                if (!this.bumpIf('>')) {\n                    return this.error(ErrorKind.INVALID_TAG, createLocation(endTagStartPosition, this.clonePosition()));\n                }\n                return {\n                    val: {\n                        type: TYPE.tag,\n                        value: tagName,\n                        children: children,\n                        location: createLocation(startPosition, this.clonePosition()),\n                    },\n                    err: null,\n                };\n            }\n            else {\n                return this.error(ErrorKind.UNCLOSED_TAG, createLocation(startPosition, this.clonePosition()));\n            }\n        }\n        else {\n            return this.error(ErrorKind.INVALID_TAG, createLocation(startPosition, this.clonePosition()));\n        }\n    };\n    /**\n     * This method assumes that the caller has peeked ahead for the first tag character.\n     */\n    Parser.prototype.parseTagName = function () {\n        var startOffset = this.offset();\n        this.bump(); // the first tag name character\n        while (!this.isEOF() && _isPotentialElementNameChar(this.char())) {\n            this.bump();\n        }\n        return this.message.slice(startOffset, this.offset());\n    };\n    Parser.prototype.parseLiteral = function (nestingLevel, parentArgType) {\n        var start = this.clonePosition();\n        var value = '';\n        while (true) {\n            var parseQuoteResult = this.tryParseQuote(parentArgType);\n            if (parseQuoteResult) {\n                value += parseQuoteResult;\n                continue;\n            }\n            var parseUnquotedResult = this.tryParseUnquoted(nestingLevel, parentArgType);\n            if (parseUnquotedResult) {\n                value += parseUnquotedResult;\n                continue;\n            }\n            var parseLeftAngleResult = this.tryParseLeftAngleBracket();\n            if (parseLeftAngleResult) {\n                value += parseLeftAngleResult;\n                continue;\n            }\n            break;\n        }\n        var location = createLocation(start, this.clonePosition());\n        return {\n            val: { type: TYPE.literal, value: value, location: location },\n            err: null,\n        };\n    };\n    Parser.prototype.tryParseLeftAngleBracket = function () {\n        if (!this.isEOF() &&\n            this.char() === 60 /* `<` */ &&\n            (this.ignoreTag ||\n                // If at the opening tag or closing tag position, bail.\n                !_isAlphaOrSlash(this.peek() || 0))) {\n            this.bump(); // `<`\n            return '<';\n        }\n        return null;\n    };\n    /**\n     * Starting with ICU 4.8, an ASCII apostrophe only starts quoted text if it immediately precedes\n     * a character that requires quoting (that is, \"only where needed\"), and works the same in\n     * nested messages as on the top level of the pattern. The new behavior is otherwise compatible.\n     */\n    Parser.prototype.tryParseQuote = function (parentArgType) {\n        if (this.isEOF() || this.char() !== 39 /* `'` */) {\n            return null;\n        }\n        // Parse escaped char following the apostrophe, or early return if there is no escaped char.\n        // Check if is valid escaped character\n        switch (this.peek()) {\n            case 39 /* `'` */:\n                // double quote, should return as a single quote.\n                this.bump();\n                this.bump();\n                return \"'\";\n            // '{', '<', '>', '}'\n            case 123:\n            case 60:\n            case 62:\n            case 125:\n                break;\n            case 35: // '#'\n                if (parentArgType === 'plural' || parentArgType === 'selectordinal') {\n                    break;\n                }\n                return null;\n            default:\n                return null;\n        }\n        this.bump(); // apostrophe\n        var codePoints = [this.char()]; // escaped char\n        this.bump();\n        // read chars until the optional closing apostrophe is found\n        while (!this.isEOF()) {\n            var ch = this.char();\n            if (ch === 39 /* `'` */) {\n                if (this.peek() === 39 /* `'` */) {\n                    codePoints.push(39);\n                    // Bump one more time because we need to skip 2 characters.\n                    this.bump();\n                }\n                else {\n                    // Optional closing apostrophe.\n                    this.bump();\n                    break;\n                }\n            }\n            else {\n                codePoints.push(ch);\n            }\n            this.bump();\n        }\n        return fromCodePoint.apply(void 0, codePoints);\n    };\n    Parser.prototype.tryParseUnquoted = function (nestingLevel, parentArgType) {\n        if (this.isEOF()) {\n            return null;\n        }\n        var ch = this.char();\n        if (ch === 60 /* `<` */ ||\n            ch === 123 /* `{` */ ||\n            (ch === 35 /* `#` */ &&\n                (parentArgType === 'plural' || parentArgType === 'selectordinal')) ||\n            (ch === 125 /* `}` */ && nestingLevel > 0)) {\n            return null;\n        }\n        else {\n            this.bump();\n            return fromCodePoint(ch);\n        }\n    };\n    Parser.prototype.parseArgument = function (nestingLevel, expectingCloseTag) {\n        var openingBracePosition = this.clonePosition();\n        this.bump(); // `{`\n        this.bumpSpace();\n        if (this.isEOF()) {\n            return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        if (this.char() === 125 /* `}` */) {\n            this.bump();\n            return this.error(ErrorKind.EMPTY_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        // argument name\n        var value = this.parseIdentifierIfPossible().value;\n        if (!value) {\n            return this.error(ErrorKind.MALFORMED_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        this.bumpSpace();\n        if (this.isEOF()) {\n            return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        switch (this.char()) {\n            // Simple argument: `{name}`\n            case 125 /* `}` */: {\n                this.bump(); // `}`\n                return {\n                    val: {\n                        type: TYPE.argument,\n                        // value does not include the opening and closing braces.\n                        value: value,\n                        location: createLocation(openingBracePosition, this.clonePosition()),\n                    },\n                    err: null,\n                };\n            }\n            // Argument with options: `{name, format, ...}`\n            case 44 /* `,` */: {\n                this.bump(); // `,`\n                this.bumpSpace();\n                if (this.isEOF()) {\n                    return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n                }\n                return this.parseArgumentOptions(nestingLevel, expectingCloseTag, value, openingBracePosition);\n            }\n            default:\n                return this.error(ErrorKind.MALFORMED_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));\n        }\n    };\n    /**\n     * Advance the parser until the end of the identifier, if it is currently on\n     * an identifier character. Return an empty string otherwise.\n     */\n    Parser.prototype.parseIdentifierIfPossible = function () {\n        var startingPosition = this.clonePosition();\n        var startOffset = this.offset();\n        var value = matchIdentifierAtIndex(this.message, startOffset);\n        var endOffset = startOffset + value.length;\n        this.bumpTo(endOffset);\n        var endPosition = this.clonePosition();\n        var location = createLocation(startingPosition, endPosition);\n        return { value: value, location: location };\n    };\n    Parser.prototype.parseArgumentOptions = function (nestingLevel, expectingCloseTag, value, openingBracePosition) {\n        var _a;\n        // Parse this range:\n        // {name, type, style}\n        //        ^---^\n        var typeStartPosition = this.clonePosition();\n        var argType = this.parseIdentifierIfPossible().value;\n        var typeEndPosition = this.clonePosition();\n        switch (argType) {\n            case '':\n                // Expecting a style string number, date, time, plural, selectordinal, or select.\n                return this.error(ErrorKind.EXPECT_ARGUMENT_TYPE, createLocation(typeStartPosition, typeEndPosition));\n            case 'number':\n            case 'date':\n            case 'time': {\n                // Parse this range:\n                // {name, number, style}\n                //              ^-------^\n                this.bumpSpace();\n                var styleAndLocation = null;\n                if (this.bumpIf(',')) {\n                    this.bumpSpace();\n                    var styleStartPosition = this.clonePosition();\n                    var result = this.parseSimpleArgStyleIfPossible();\n                    if (result.err) {\n                        return result;\n                    }\n                    var style = trimEnd(result.val);\n                    if (style.length === 0) {\n                        return this.error(ErrorKind.EXPECT_ARGUMENT_STYLE, createLocation(this.clonePosition(), this.clonePosition()));\n                    }\n                    var styleLocation = createLocation(styleStartPosition, this.clonePosition());\n                    styleAndLocation = { style: style, styleLocation: styleLocation };\n                }\n                var argCloseResult = this.tryParseArgumentClose(openingBracePosition);\n                if (argCloseResult.err) {\n                    return argCloseResult;\n                }\n                var location_1 = createLocation(openingBracePosition, this.clonePosition());\n                // Extract style or skeleton\n                if (styleAndLocation && startsWith(styleAndLocation === null || styleAndLocation === void 0 ? void 0 : styleAndLocation.style, '::', 0)) {\n                    // Skeleton starts with `::`.\n                    var skeleton = trimStart(styleAndLocation.style.slice(2));\n                    if (argType === 'number') {\n                        var result = this.parseNumberSkeletonFromString(skeleton, styleAndLocation.styleLocation);\n                        if (result.err) {\n                            return result;\n                        }\n                        return {\n                            val: { type: TYPE.number, value: value, location: location_1, style: result.val },\n                            err: null,\n                        };\n                    }\n                    else {\n                        if (skeleton.length === 0) {\n                            return this.error(ErrorKind.EXPECT_DATE_TIME_SKELETON, location_1);\n                        }\n                        var dateTimePattern = skeleton;\n                        // Get \"best match\" pattern only if locale is passed, if not, let it\n                        // pass as-is where `parseDateTimeSkeleton()` will throw an error\n                        // for unsupported patterns.\n                        if (this.locale) {\n                            dateTimePattern = getBestPattern(skeleton, this.locale);\n                        }\n                        var style = {\n                            type: SKELETON_TYPE.dateTime,\n                            pattern: dateTimePattern,\n                            location: styleAndLocation.styleLocation,\n                            parsedOptions: this.shouldParseSkeletons\n                                ? parseDateTimeSkeleton(dateTimePattern)\n                                : {},\n                        };\n                        var type = argType === 'date' ? TYPE.date : TYPE.time;\n                        return {\n                            val: { type: type, value: value, location: location_1, style: style },\n                            err: null,\n                        };\n                    }\n                }\n                // Regular style or no style.\n                return {\n                    val: {\n                        type: argType === 'number'\n                            ? TYPE.number\n                            : argType === 'date'\n                                ? TYPE.date\n                                : TYPE.time,\n                        value: value,\n                        location: location_1,\n                        style: (_a = styleAndLocation === null || styleAndLocation === void 0 ? void 0 : styleAndLocation.style) !== null && _a !== void 0 ? _a : null,\n                    },\n                    err: null,\n                };\n            }\n            case 'plural':\n            case 'selectordinal':\n            case 'select': {\n                // Parse this range:\n                // {name, plural, options}\n                //              ^---------^\n                var typeEndPosition_1 = this.clonePosition();\n                this.bumpSpace();\n                if (!this.bumpIf(',')) {\n                    return this.error(ErrorKind.EXPECT_SELECT_ARGUMENT_OPTIONS, createLocation(typeEndPosition_1, __assign({}, typeEndPosition_1)));\n                }\n                this.bumpSpace();\n                // Parse offset:\n                // {name, plural, offset:1, options}\n                //                ^-----^\n                //\n                // or the first option:\n                //\n                // {name, plural, one {...} other {...}}\n                //                ^--^\n                var identifierAndLocation = this.parseIdentifierIfPossible();\n                var pluralOffset = 0;\n                if (argType !== 'select' && identifierAndLocation.value === 'offset') {\n                    if (!this.bumpIf(':')) {\n                        return this.error(ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE, createLocation(this.clonePosition(), this.clonePosition()));\n                    }\n                    this.bumpSpace();\n                    var result = this.tryParseDecimalInteger(ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE, ErrorKind.INVALID_PLURAL_ARGUMENT_OFFSET_VALUE);\n                    if (result.err) {\n                        return result;\n                    }\n                    // Parse another identifier for option parsing\n                    this.bumpSpace();\n                    identifierAndLocation = this.parseIdentifierIfPossible();\n                    pluralOffset = result.val;\n                }\n                var optionsResult = this.tryParsePluralOrSelectOptions(nestingLevel, argType, expectingCloseTag, identifierAndLocation);\n                if (optionsResult.err) {\n                    return optionsResult;\n                }\n                var argCloseResult = this.tryParseArgumentClose(openingBracePosition);\n                if (argCloseResult.err) {\n                    return argCloseResult;\n                }\n                var location_2 = createLocation(openingBracePosition, this.clonePosition());\n                if (argType === 'select') {\n                    return {\n                        val: {\n                            type: TYPE.select,\n                            value: value,\n                            options: fromEntries(optionsResult.val),\n                            location: location_2,\n                        },\n                        err: null,\n                    };\n                }\n                else {\n                    return {\n                        val: {\n                            type: TYPE.plural,\n                            value: value,\n                            options: fromEntries(optionsResult.val),\n                            offset: pluralOffset,\n                            pluralType: argType === 'plural' ? 'cardinal' : 'ordinal',\n                            location: location_2,\n                        },\n                        err: null,\n                    };\n                }\n            }\n            default:\n                return this.error(ErrorKind.INVALID_ARGUMENT_TYPE, createLocation(typeStartPosition, typeEndPosition));\n        }\n    };\n    Parser.prototype.tryParseArgumentClose = function (openingBracePosition) {\n        // Parse: {value, number, ::currency/GBP }\n        //\n        if (this.isEOF() || this.char() !== 125 /* `}` */) {\n            return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        this.bump(); // `}`\n        return { val: true, err: null };\n    };\n    /**\n     * See: https://github.com/unicode-org/icu/blob/af7ed1f6d2298013dc303628438ec4abe1f16479/icu4c/source/common/messagepattern.cpp#L659\n     */\n    Parser.prototype.parseSimpleArgStyleIfPossible = function () {\n        var nestedBraces = 0;\n        var startPosition = this.clonePosition();\n        while (!this.isEOF()) {\n            var ch = this.char();\n            switch (ch) {\n                case 39 /* `'` */: {\n                    // Treat apostrophe as quoting but include it in the style part.\n                    // Find the end of the quoted literal text.\n                    this.bump();\n                    var apostrophePosition = this.clonePosition();\n                    if (!this.bumpUntil(\"'\")) {\n                        return this.error(ErrorKind.UNCLOSED_QUOTE_IN_ARGUMENT_STYLE, createLocation(apostrophePosition, this.clonePosition()));\n                    }\n                    this.bump();\n                    break;\n                }\n                case 123 /* `{` */: {\n                    nestedBraces += 1;\n                    this.bump();\n                    break;\n                }\n                case 125 /* `}` */: {\n                    if (nestedBraces > 0) {\n                        nestedBraces -= 1;\n                    }\n                    else {\n                        return {\n                            val: this.message.slice(startPosition.offset, this.offset()),\n                            err: null,\n                        };\n                    }\n                    break;\n                }\n                default:\n                    this.bump();\n                    break;\n            }\n        }\n        return {\n            val: this.message.slice(startPosition.offset, this.offset()),\n            err: null,\n        };\n    };\n    Parser.prototype.parseNumberSkeletonFromString = function (skeleton, location) {\n        var tokens = [];\n        try {\n            tokens = parseNumberSkeletonFromString(skeleton);\n        }\n        catch (e) {\n            return this.error(ErrorKind.INVALID_NUMBER_SKELETON, location);\n        }\n        return {\n            val: {\n                type: SKELETON_TYPE.number,\n                tokens: tokens,\n                location: location,\n                parsedOptions: this.shouldParseSkeletons\n                    ? parseNumberSkeleton(tokens)\n                    : {},\n            },\n            err: null,\n        };\n    };\n    /**\n     * @param nesting_level The current nesting level of messages.\n     *     This can be positive when parsing message fragment in select or plural argument options.\n     * @param parent_arg_type The parent argument's type.\n     * @param parsed_first_identifier If provided, this is the first identifier-like selector of\n     *     the argument. It is a by-product of a previous parsing attempt.\n     * @param expecting_close_tag If true, this message is directly or indirectly nested inside\n     *     between a pair of opening and closing tags. The nested message will not parse beyond\n     *     the closing tag boundary.\n     */\n    Parser.prototype.tryParsePluralOrSelectOptions = function (nestingLevel, parentArgType, expectCloseTag, parsedFirstIdentifier) {\n        var _a;\n        var hasOtherClause = false;\n        var options = [];\n        var parsedSelectors = new Set();\n        var selector = parsedFirstIdentifier.value, selectorLocation = parsedFirstIdentifier.location;\n        // Parse:\n        // one {one apple}\n        // ^--^\n        while (true) {\n            if (selector.length === 0) {\n                var startPosition = this.clonePosition();\n                if (parentArgType !== 'select' && this.bumpIf('=')) {\n                    // Try parse `={number}` selector\n                    var result = this.tryParseDecimalInteger(ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR, ErrorKind.INVALID_PLURAL_ARGUMENT_SELECTOR);\n                    if (result.err) {\n                        return result;\n                    }\n                    selectorLocation = createLocation(startPosition, this.clonePosition());\n                    selector = this.message.slice(startPosition.offset, this.offset());\n                }\n                else {\n                    break;\n                }\n            }\n            // Duplicate selector clauses\n            if (parsedSelectors.has(selector)) {\n                return this.error(parentArgType === 'select'\n                    ? ErrorKind.DUPLICATE_SELECT_ARGUMENT_SELECTOR\n                    : ErrorKind.DUPLICATE_PLURAL_ARGUMENT_SELECTOR, selectorLocation);\n            }\n            if (selector === 'other') {\n                hasOtherClause = true;\n            }\n            // Parse:\n            // one {one apple}\n            //     ^----------^\n            this.bumpSpace();\n            var openingBracePosition = this.clonePosition();\n            if (!this.bumpIf('{')) {\n                return this.error(parentArgType === 'select'\n                    ? ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT\n                    : ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT, createLocation(this.clonePosition(), this.clonePosition()));\n            }\n            var fragmentResult = this.parseMessage(nestingLevel + 1, parentArgType, expectCloseTag);\n            if (fragmentResult.err) {\n                return fragmentResult;\n            }\n            var argCloseResult = this.tryParseArgumentClose(openingBracePosition);\n            if (argCloseResult.err) {\n                return argCloseResult;\n            }\n            options.push([\n                selector,\n                {\n                    value: fragmentResult.val,\n                    location: createLocation(openingBracePosition, this.clonePosition()),\n                },\n            ]);\n            // Keep track of the existing selectors\n            parsedSelectors.add(selector);\n            // Prep next selector clause.\n            this.bumpSpace();\n            (_a = this.parseIdentifierIfPossible(), selector = _a.value, selectorLocation = _a.location);\n        }\n        if (options.length === 0) {\n            return this.error(parentArgType === 'select'\n                ? ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR\n                : ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR, createLocation(this.clonePosition(), this.clonePosition()));\n        }\n        if (this.requiresOtherClause && !hasOtherClause) {\n            return this.error(ErrorKind.MISSING_OTHER_CLAUSE, createLocation(this.clonePosition(), this.clonePosition()));\n        }\n        return { val: options, err: null };\n    };\n    Parser.prototype.tryParseDecimalInteger = function (expectNumberError, invalidNumberError) {\n        var sign = 1;\n        var startingPosition = this.clonePosition();\n        if (this.bumpIf('+')) {\n        }\n        else if (this.bumpIf('-')) {\n            sign = -1;\n        }\n        var hasDigits = false;\n        var decimal = 0;\n        while (!this.isEOF()) {\n            var ch = this.char();\n            if (ch >= 48 /* `0` */ && ch <= 57 /* `9` */) {\n                hasDigits = true;\n                decimal = decimal * 10 + (ch - 48);\n                this.bump();\n            }\n            else {\n                break;\n            }\n        }\n        var location = createLocation(startingPosition, this.clonePosition());\n        if (!hasDigits) {\n            return this.error(expectNumberError, location);\n        }\n        decimal *= sign;\n        if (!isSafeInteger(decimal)) {\n            return this.error(invalidNumberError, location);\n        }\n        return { val: decimal, err: null };\n    };\n    Parser.prototype.offset = function () {\n        return this.position.offset;\n    };\n    Parser.prototype.isEOF = function () {\n        return this.offset() === this.message.length;\n    };\n    Parser.prototype.clonePosition = function () {\n        // This is much faster than `Object.assign` or spread.\n        return {\n            offset: this.position.offset,\n            line: this.position.line,\n            column: this.position.column,\n        };\n    };\n    /**\n     * Return the code point at the current position of the parser.\n     * Throws if the index is out of bound.\n     */\n    Parser.prototype.char = function () {\n        var offset = this.position.offset;\n        if (offset >= this.message.length) {\n            throw Error('out of bound');\n        }\n        var code = codePointAt(this.message, offset);\n        if (code === undefined) {\n            throw Error(\"Offset \".concat(offset, \" is at invalid UTF-16 code unit boundary\"));\n        }\n        return code;\n    };\n    Parser.prototype.error = function (kind, location) {\n        return {\n            val: null,\n            err: {\n                kind: kind,\n                message: this.message,\n                location: location,\n            },\n        };\n    };\n    /** Bump the parser to the next UTF-16 code unit. */\n    Parser.prototype.bump = function () {\n        if (this.isEOF()) {\n            return;\n        }\n        var code = this.char();\n        if (code === 10 /* '\\n' */) {\n            this.position.line += 1;\n            this.position.column = 1;\n            this.position.offset += 1;\n        }\n        else {\n            this.position.column += 1;\n            // 0 ~ 0x10000 -> unicode BMP, otherwise skip the surrogate pair.\n            this.position.offset += code < 0x10000 ? 1 : 2;\n        }\n    };\n    /**\n     * If the substring starting at the current position of the parser has\n     * the given prefix, then bump the parser to the character immediately\n     * following the prefix and return true. Otherwise, don't bump the parser\n     * and return false.\n     */\n    Parser.prototype.bumpIf = function (prefix) {\n        if (startsWith(this.message, prefix, this.offset())) {\n            for (var i = 0; i < prefix.length; i++) {\n                this.bump();\n            }\n            return true;\n        }\n        return false;\n    };\n    /**\n     * Bump the parser until the pattern character is found and return `true`.\n     * Otherwise bump to the end of the file and return `false`.\n     */\n    Parser.prototype.bumpUntil = function (pattern) {\n        var currentOffset = this.offset();\n        var index = this.message.indexOf(pattern, currentOffset);\n        if (index >= 0) {\n            this.bumpTo(index);\n            return true;\n        }\n        else {\n            this.bumpTo(this.message.length);\n            return false;\n        }\n    };\n    /**\n     * Bump the parser to the target offset.\n     * If target offset is beyond the end of the input, bump the parser to the end of the input.\n     */\n    Parser.prototype.bumpTo = function (targetOffset) {\n        if (this.offset() > targetOffset) {\n            throw Error(\"targetOffset \".concat(targetOffset, \" must be greater than or equal to the current offset \").concat(this.offset()));\n        }\n        targetOffset = Math.min(targetOffset, this.message.length);\n        while (true) {\n            var offset = this.offset();\n            if (offset === targetOffset) {\n                break;\n            }\n            if (offset > targetOffset) {\n                throw Error(\"targetOffset \".concat(targetOffset, \" is at invalid UTF-16 code unit boundary\"));\n            }\n            this.bump();\n            if (this.isEOF()) {\n                break;\n            }\n        }\n    };\n    /** advance the parser through all whitespace to the next non-whitespace code unit. */\n    Parser.prototype.bumpSpace = function () {\n        while (!this.isEOF() && _isWhiteSpace(this.char())) {\n            this.bump();\n        }\n    };\n    /**\n     * Peek at the *next* Unicode codepoint in the input without advancing the parser.\n     * If the input has been exhausted, then this returns null.\n     */\n    Parser.prototype.peek = function () {\n        if (this.isEOF()) {\n            return null;\n        }\n        var code = this.char();\n        var offset = this.offset();\n        var nextCode = this.message.charCodeAt(offset + (code >= 0x10000 ? 2 : 1));\n        return nextCode !== null && nextCode !== void 0 ? nextCode : null;\n    };\n    return Parser;\n}());\nexport { Parser };\n/**\n * This check if codepoint is alphabet (lower & uppercase)\n * @param codepoint\n * @returns\n */\nfunction _isAlpha(codepoint) {\n    return ((codepoint >= 97 && codepoint <= 122) ||\n        (codepoint >= 65 && codepoint <= 90));\n}\nfunction _isAlphaOrSlash(codepoint) {\n    return _isAlpha(codepoint) || codepoint === 47; /* '/' */\n}\n/** See `parseTag` function docs. */\nfunction _isPotentialElementNameChar(c) {\n    return (c === 45 /* '-' */ ||\n        c === 46 /* '.' */ ||\n        (c >= 48 && c <= 57) /* 0..9 */ ||\n        c === 95 /* '_' */ ||\n        (c >= 97 && c <= 122) /** a..z */ ||\n        (c >= 65 && c <= 90) /* A..Z */ ||\n        c == 0xb7 ||\n        (c >= 0xc0 && c <= 0xd6) ||\n        (c >= 0xd8 && c <= 0xf6) ||\n        (c >= 0xf8 && c <= 0x37d) ||\n        (c >= 0x37f && c <= 0x1fff) ||\n        (c >= 0x200c && c <= 0x200d) ||\n        (c >= 0x203f && c <= 0x2040) ||\n        (c >= 0x2070 && c <= 0x218f) ||\n        (c >= 0x2c00 && c <= 0x2fef) ||\n        (c >= 0x3001 && c <= 0xd7ff) ||\n        (c >= 0xf900 && c <= 0xfdcf) ||\n        (c >= 0xfdf0 && c <= 0xfffd) ||\n        (c >= 0x10000 && c <= 0xeffff));\n}\n/**\n * Code point equivalent of regex `\\p{White_Space}`.\n * From: https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt\n */\nfunction _isWhiteSpace(c) {\n    return ((c >= 0x0009 && c <= 0x000d) ||\n        c === 0x0020 ||\n        c === 0x0085 ||\n        (c >= 0x200e && c <= 0x200f) ||\n        c === 0x2028 ||\n        c === 0x2029);\n}\n/**\n * Code point equivalent of regex `\\p{Pattern_Syntax}`.\n * See https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt\n */\nfunction _isPatternSyntax(c) {\n    return ((c >= 0x0021 && c <= 0x0023) ||\n        c === 0x0024 ||\n        (c >= 0x0025 && c <= 0x0027) ||\n        c === 0x0028 ||\n        c === 0x0029 ||\n        c === 0x002a ||\n        c === 0x002b ||\n        c === 0x002c ||\n        c === 0x002d ||\n        (c >= 0x002e && c <= 0x002f) ||\n        (c >= 0x003a && c <= 0x003b) ||\n        (c >= 0x003c && c <= 0x003e) ||\n        (c >= 0x003f && c <= 0x0040) ||\n        c === 0x005b ||\n        c === 0x005c ||\n        c === 0x005d ||\n        c === 0x005e ||\n        c === 0x0060 ||\n        c === 0x007b ||\n        c === 0x007c ||\n        c === 0x007d ||\n        c === 0x007e ||\n        c === 0x00a1 ||\n        (c >= 0x00a2 && c <= 0x00a5) ||\n        c === 0x00a6 ||\n        c === 0x00a7 ||\n        c === 0x00a9 ||\n        c === 0x00ab ||\n        c === 0x00ac ||\n        c === 0x00ae ||\n        c === 0x00b0 ||\n        c === 0x00b1 ||\n        c === 0x00b6 ||\n        c === 0x00bb ||\n        c === 0x00bf ||\n        c === 0x00d7 ||\n        c === 0x00f7 ||\n        (c >= 0x2010 && c <= 0x2015) ||\n        (c >= 0x2016 && c <= 0x2017) ||\n        c === 0x2018 ||\n        c === 0x2019 ||\n        c === 0x201a ||\n        (c >= 0x201b && c <= 0x201c) ||\n        c === 0x201d ||\n        c === 0x201e ||\n        c === 0x201f ||\n        (c >= 0x2020 && c <= 0x2027) ||\n        (c >= 0x2030 && c <= 0x2038) ||\n        c === 0x2039 ||\n        c === 0x203a ||\n        (c >= 0x203b && c <= 0x203e) ||\n        (c >= 0x2041 && c <= 0x2043) ||\n        c === 0x2044 ||\n        c === 0x2045 ||\n        c === 0x2046 ||\n        (c >= 0x2047 && c <= 0x2051) ||\n        c === 0x2052 ||\n        c === 0x2053 ||\n        (c >= 0x2055 && c <= 0x205e) ||\n        (c >= 0x2190 && c <= 0x2194) ||\n        (c >= 0x2195 && c <= 0x2199) ||\n        (c >= 0x219a && c <= 0x219b) ||\n        (c >= 0x219c && c <= 0x219f) ||\n        c === 0x21a0 ||\n        (c >= 0x21a1 && c <= 0x21a2) ||\n        c === 0x21a3 ||\n        (c >= 0x21a4 && c <= 0x21a5) ||\n        c === 0x21a6 ||\n        (c >= 0x21a7 && c <= 0x21ad) ||\n        c === 0x21ae ||\n        (c >= 0x21af && c <= 0x21cd) ||\n        (c >= 0x21ce && c <= 0x21cf) ||\n        (c >= 0x21d0 && c <= 0x21d1) ||\n        c === 0x21d2 ||\n        c === 0x21d3 ||\n        c === 0x21d4 ||\n        (c >= 0x21d5 && c <= 0x21f3) ||\n        (c >= 0x21f4 && c <= 0x22ff) ||\n        (c >= 0x2300 && c <= 0x2307) ||\n        c === 0x2308 ||\n        c === 0x2309 ||\n        c === 0x230a ||\n        c === 0x230b ||\n        (c >= 0x230c && c <= 0x231f) ||\n        (c >= 0x2320 && c <= 0x2321) ||\n        (c >= 0x2322 && c <= 0x2328) ||\n        c === 0x2329 ||\n        c === 0x232a ||\n        (c >= 0x232b && c <= 0x237b) ||\n        c === 0x237c ||\n        (c >= 0x237d && c <= 0x239a) ||\n        (c >= 0x239b && c <= 0x23b3) ||\n        (c >= 0x23b4 && c <= 0x23db) ||\n        (c >= 0x23dc && c <= 0x23e1) ||\n        (c >= 0x23e2 && c <= 0x2426) ||\n        (c >= 0x2427 && c <= 0x243f) ||\n        (c >= 0x2440 && c <= 0x244a) ||\n        (c >= 0x244b && c <= 0x245f) ||\n        (c >= 0x2500 && c <= 0x25b6) ||\n        c === 0x25b7 ||\n        (c >= 0x25b8 && c <= 0x25c0) ||\n        c === 0x25c1 ||\n        (c >= 0x25c2 && c <= 0x25f7) ||\n        (c >= 0x25f8 && c <= 0x25ff) ||\n        (c >= 0x2600 && c <= 0x266e) ||\n        c === 0x266f ||\n        (c >= 0x2670 && c <= 0x2767) ||\n        c === 0x2768 ||\n        c === 0x2769 ||\n        c === 0x276a ||\n        c === 0x276b ||\n        c === 0x276c ||\n        c === 0x276d ||\n        c === 0x276e ||\n        c === 0x276f ||\n        c === 0x2770 ||\n        c === 0x2771 ||\n        c === 0x2772 ||\n        c === 0x2773 ||\n        c === 0x2774 ||\n        c === 0x2775 ||\n        (c >= 0x2794 && c <= 0x27bf) ||\n        (c >= 0x27c0 && c <= 0x27c4) ||\n        c === 0x27c5 ||\n        c === 0x27c6 ||\n        (c >= 0x27c7 && c <= 0x27e5) ||\n        c === 0x27e6 ||\n        c === 0x27e7 ||\n        c === 0x27e8 ||\n        c === 0x27e9 ||\n        c === 0x27ea ||\n        c === 0x27eb ||\n        c === 0x27ec ||\n        c === 0x27ed ||\n        c === 0x27ee ||\n        c === 0x27ef ||\n        (c >= 0x27f0 && c <= 0x27ff) ||\n        (c >= 0x2800 && c <= 0x28ff) ||\n        (c >= 0x2900 && c <= 0x2982) ||\n        c === 0x2983 ||\n        c === 0x2984 ||\n        c === 0x2985 ||\n        c === 0x2986 ||\n        c === 0x2987 ||\n        c === 0x2988 ||\n        c === 0x2989 ||\n        c === 0x298a ||\n        c === 0x298b ||\n        c === 0x298c ||\n        c === 0x298d ||\n        c === 0x298e ||\n        c === 0x298f ||\n        c === 0x2990 ||\n        c === 0x2991 ||\n        c === 0x2992 ||\n        c === 0x2993 ||\n        c === 0x2994 ||\n        c === 0x2995 ||\n        c === 0x2996 ||\n        c === 0x2997 ||\n        c === 0x2998 ||\n        (c >= 0x2999 && c <= 0x29d7) ||\n        c === 0x29d8 ||\n        c === 0x29d9 ||\n        c === 0x29da ||\n        c === 0x29db ||\n        (c >= 0x29dc && c <= 0x29fb) ||\n        c === 0x29fc ||\n        c === 0x29fd ||\n        (c >= 0x29fe && c <= 0x2aff) ||\n        (c >= 0x2b00 && c <= 0x2b2f) ||\n        (c >= 0x2b30 && c <= 0x2b44) ||\n        (c >= 0x2b45 && c <= 0x2b46) ||\n        (c >= 0x2b47 && c <= 0x2b4c) ||\n        (c >= 0x2b4d && c <= 0x2b73) ||\n        (c >= 0x2b74 && c <= 0x2b75) ||\n        (c >= 0x2b76 && c <= 0x2b95) ||\n        c === 0x2b96 ||\n        (c >= 0x2b97 && c <= 0x2bff) ||\n        (c >= 0x2e00 && c <= 0x2e01) ||\n        c === 0x2e02 ||\n        c === 0x2e03 ||\n        c === 0x2e04 ||\n        c === 0x2e05 ||\n        (c >= 0x2e06 && c <= 0x2e08) ||\n        c === 0x2e09 ||\n        c === 0x2e0a ||\n        c === 0x2e0b ||\n        c === 0x2e0c ||\n        c === 0x2e0d ||\n        (c >= 0x2e0e && c <= 0x2e16) ||\n        c === 0x2e17 ||\n        (c >= 0x2e18 && c <= 0x2e19) ||\n        c === 0x2e1a ||\n        c === 0x2e1b ||\n        c === 0x2e1c ||\n        c === 0x2e1d ||\n        (c >= 0x2e1e && c <= 0x2e1f) ||\n        c === 0x2e20 ||\n        c === 0x2e21 ||\n        c === 0x2e22 ||\n        c === 0x2e23 ||\n        c === 0x2e24 ||\n        c === 0x2e25 ||\n        c === 0x2e26 ||\n        c === 0x2e27 ||\n        c === 0x2e28 ||\n        c === 0x2e29 ||\n        (c >= 0x2e2a && c <= 0x2e2e) ||\n        c === 0x2e2f ||\n        (c >= 0x2e30 && c <= 0x2e39) ||\n        (c >= 0x2e3a && c <= 0x2e3b) ||\n        (c >= 0x2e3c && c <= 0x2e3f) ||\n        c === 0x2e40 ||\n        c === 0x2e41 ||\n        c === 0x2e42 ||\n        (c >= 0x2e43 && c <= 0x2e4f) ||\n        (c >= 0x2e50 && c <= 0x2e51) ||\n        c === 0x2e52 ||\n        (c >= 0x2e53 && c <= 0x2e7f) ||\n        (c >= 0x3001 && c <= 0x3003) ||\n        c === 0x3008 ||\n        c === 0x3009 ||\n        c === 0x300a ||\n        c === 0x300b ||\n        c === 0x300c ||\n        c === 0x300d ||\n        c === 0x300e ||\n        c === 0x300f ||\n        c === 0x3010 ||\n        c === 0x3011 ||\n        (c >= 0x3012 && c <= 0x3013) ||\n        c === 0x3014 ||\n        c === 0x3015 ||\n        c === 0x3016 ||\n        c === 0x3017 ||\n        c === 0x3018 ||\n        c === 0x3019 ||\n        c === 0x301a ||\n        c === 0x301b ||\n        c === 0x301c ||\n        c === 0x301d ||\n        (c >= 0x301e && c <= 0x301f) ||\n        c === 0x3020 ||\n        c === 0x3030 ||\n        c === 0xfd3e ||\n        c === 0xfd3f ||\n        (c >= 0xfe45 && c <= 0xfe46));\n}\n","import { timeData } from './time-data.generated';\n/**\n * Returns the best matching date time pattern if a date time skeleton\n * pattern is provided with a locale. Follows the Unicode specification:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#table-mapping-requested-time-skeletons-to-patterns\n * @param skeleton date time skeleton pattern that possibly includes j, J or C\n * @param locale\n */\nexport function getBestPattern(skeleton, locale) {\n    var skeletonCopy = '';\n    for (var patternPos = 0; patternPos < skeleton.length; patternPos++) {\n        var patternChar = skeleton.charAt(patternPos);\n        if (patternChar === 'j') {\n            var extraLength = 0;\n            while (patternPos + 1 < skeleton.length &&\n                skeleton.charAt(patternPos + 1) === patternChar) {\n                extraLength++;\n                patternPos++;\n            }\n            var hourLen = 1 + (extraLength & 1);\n            var dayPeriodLen = extraLength < 2 ? 1 : 3 + (extraLength >> 1);\n            var dayPeriodChar = 'a';\n            var hourChar = getDefaultHourSymbolFromLocale(locale);\n            if (hourChar == 'H' || hourChar == 'k') {\n                dayPeriodLen = 0;\n            }\n            while (dayPeriodLen-- > 0) {\n                skeletonCopy += dayPeriodChar;\n            }\n            while (hourLen-- > 0) {\n                skeletonCopy = hourChar + skeletonCopy;\n            }\n        }\n        else if (patternChar === 'J') {\n            skeletonCopy += 'H';\n        }\n        else {\n            skeletonCopy += patternChar;\n        }\n    }\n    return skeletonCopy;\n}\n/**\n * Maps the [hour cycle type](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle)\n * of the given `locale` to the corresponding time pattern.\n * @param locale\n */\nfunction getDefaultHourSymbolFromLocale(locale) {\n    var hourCycle = locale.hourCycle;\n    if (hourCycle === undefined &&\n        // @ts-ignore hourCycle(s) is not identified yet\n        locale.hourCycles &&\n        // @ts-ignore\n        locale.hourCycles.length) {\n        // @ts-ignore\n        hourCycle = locale.hourCycles[0];\n    }\n    if (hourCycle) {\n        switch (hourCycle) {\n            case 'h24':\n                return 'k';\n            case 'h23':\n                return 'H';\n            case 'h12':\n                return 'h';\n            case 'h11':\n                return 'K';\n            default:\n                throw new Error('Invalid hourCycle');\n        }\n    }\n    // TODO: Once hourCycle is fully supported remove the following with data generation\n    var languageTag = locale.language;\n    var regionTag;\n    if (languageTag !== 'root') {\n        regionTag = locale.maximize().region;\n    }\n    var hourCycles = timeData[regionTag || ''] ||\n        timeData[languageTag || ''] ||\n        timeData[\"\".concat(languageTag, \"-001\")] ||\n        timeData['001'];\n    return hourCycles[0];\n}\n","import { __extends } from \"tslib\";\nexport var ErrorCode;\n(function (ErrorCode) {\n    // When we have a placeholder but no value to format\n    ErrorCode[\"MISSING_VALUE\"] = \"MISSING_VALUE\";\n    // When value supplied is invalid\n    ErrorCode[\"INVALID_VALUE\"] = \"INVALID_VALUE\";\n    // When we need specific Intl API but it's not available\n    ErrorCode[\"MISSING_INTL_API\"] = \"MISSING_INTL_API\";\n})(ErrorCode || (ErrorCode = {}));\nvar FormatError = /** @class */ (function (_super) {\n    __extends(FormatError, _super);\n    function FormatError(msg, code, originalMessage) {\n        var _this = _super.call(this, msg) || this;\n        _this.code = code;\n        _this.originalMessage = originalMessage;\n        return _this;\n    }\n    FormatError.prototype.toString = function () {\n        return \"[formatjs Error: \".concat(this.code, \"] \").concat(this.message);\n    };\n    return FormatError;\n}(Error));\nexport { FormatError };\nvar InvalidValueError = /** @class */ (function (_super) {\n    __extends(InvalidValueError, _super);\n    function InvalidValueError(variableId, value, options, originalMessage) {\n        return _super.call(this, \"Invalid values for \\\"\".concat(variableId, \"\\\": \\\"\").concat(value, \"\\\". Options are \\\"\").concat(Object.keys(options).join('\", \"'), \"\\\"\"), ErrorCode.INVALID_VALUE, originalMessage) || this;\n    }\n    return InvalidValueError;\n}(FormatError));\nexport { InvalidValueError };\nvar InvalidValueTypeError = /** @class */ (function (_super) {\n    __extends(InvalidValueTypeError, _super);\n    function InvalidValueTypeError(value, type, originalMessage) {\n        return _super.call(this, \"Value for \\\"\".concat(value, \"\\\" must be of type \").concat(type), ErrorCode.INVALID_VALUE, originalMessage) || this;\n    }\n    return InvalidValueTypeError;\n}(FormatError));\nexport { InvalidValueTypeError };\nvar MissingValueError = /** @class */ (function (_super) {\n    __extends(MissingValueError, _super);\n    function MissingValueError(variableId, originalMessage) {\n        return _super.call(this, \"The intl string context variable \\\"\".concat(variableId, \"\\\" was not provided to the string \\\"\").concat(originalMessage, \"\\\"\"), ErrorCode.MISSING_VALUE, originalMessage) || this;\n    }\n    return MissingValueError;\n}(FormatError));\nexport { MissingValueError };\n","import { __assign } from \"tslib\";\nimport { ErrorKind } from './error';\nimport { Parser } from './parser';\nimport { isDateElement, isDateTimeSkeleton, isNumberElement, isNumberSkeleton, isPluralElement, isSelectElement, isTagElement, isTimeElement, } from './types';\nfunction pruneLocation(els) {\n    els.forEach(function (el) {\n        delete el.location;\n        if (isSelectElement(el) || isPluralElement(el)) {\n            for (var k in el.options) {\n                delete el.options[k].location;\n                pruneLocation(el.options[k].value);\n            }\n        }\n        else if (isNumberElement(el) && isNumberSkeleton(el.style)) {\n            delete el.style.location;\n        }\n        else if ((isDateElement(el) || isTimeElement(el)) &&\n            isDateTimeSkeleton(el.style)) {\n            delete el.style.location;\n        }\n        else if (isTagElement(el)) {\n            pruneLocation(el.children);\n        }\n    });\n}\nexport function parse(message, opts) {\n    if (opts === void 0) { opts = {}; }\n    opts = __assign({ shouldParseSkeletons: true, requiresOtherClause: true }, opts);\n    var result = new Parser(message, opts).parse();\n    if (result.err) {\n        var error = SyntaxError(ErrorKind[result.err.kind]);\n        // @ts-expect-error Assign to error object\n        error.location = result.err.location;\n        // @ts-expect-error Assign to error object\n        error.originalMessage = result.err.message;\n        throw error;\n    }\n    if (!(opts === null || opts === void 0 ? void 0 : opts.captureLocation)) {\n        pruneLocation(result.val);\n    }\n    return result.val;\n}\nexport * from './types';\n// only for testing\nexport var _Parser = Parser;\n","import { isArgumentElement, isDateElement, isDateTimeSkeleton, isLiteralElement, isNumberElement, isNumberSkeleton, isPluralElement, isPoundElement, isSelectElement, isTagElement, isTimeElement, } from '@formatjs/icu-messageformat-parser';\nimport { ErrorCode, FormatError, InvalidValueError, InvalidValueTypeError, MissingValueError, } from './error';\nexport var PART_TYPE;\n(function (PART_TYPE) {\n    PART_TYPE[PART_TYPE[\"literal\"] = 0] = \"literal\";\n    PART_TYPE[PART_TYPE[\"object\"] = 1] = \"object\";\n})(PART_TYPE || (PART_TYPE = {}));\nfunction mergeLiteral(parts) {\n    if (parts.length < 2) {\n        return parts;\n    }\n    return parts.reduce(function (all, part) {\n        var lastPart = all[all.length - 1];\n        if (!lastPart ||\n            lastPart.type !== PART_TYPE.literal ||\n            part.type !== PART_TYPE.literal) {\n            all.push(part);\n        }\n        else {\n            lastPart.value += part.value;\n        }\n        return all;\n    }, []);\n}\nexport function isFormatXMLElementFn(el) {\n    return typeof el === 'function';\n}\n// TODO(skeleton): add skeleton support\nexport function formatToParts(els, locales, formatters, formats, values, currentPluralValue, \n// For debugging\noriginalMessage) {\n    // Hot path for straight simple msg translations\n    if (els.length === 1 && isLiteralElement(els[0])) {\n        return [\n            {\n                type: PART_TYPE.literal,\n                value: els[0].value,\n            },\n        ];\n    }\n    var result = [];\n    for (var _i = 0, els_1 = els; _i < els_1.length; _i++) {\n        var el = els_1[_i];\n        // Exit early for string parts.\n        if (isLiteralElement(el)) {\n            result.push({\n                type: PART_TYPE.literal,\n                value: el.value,\n            });\n            continue;\n        }\n        // TODO: should this part be literal type?\n        // Replace `#` in plural rules with the actual numeric value.\n        if (isPoundElement(el)) {\n            if (typeof currentPluralValue === 'number') {\n                result.push({\n                    type: PART_TYPE.literal,\n                    value: formatters.getNumberFormat(locales).format(currentPluralValue),\n                });\n            }\n            continue;\n        }\n        var varName = el.value;\n        // Enforce that all required values are provided by the caller.\n        if (!(values && varName in values)) {\n            throw new MissingValueError(varName, originalMessage);\n        }\n        var value = values[varName];\n        if (isArgumentElement(el)) {\n            if (!value || typeof value === 'string' || typeof value === 'number') {\n                value =\n                    typeof value === 'string' || typeof value === 'number'\n                        ? String(value)\n                        : '';\n            }\n            result.push({\n                type: typeof value === 'string' ? PART_TYPE.literal : PART_TYPE.object,\n                value: value,\n            });\n            continue;\n        }\n        // Recursively format plural and select parts' option — which can be a\n        // nested pattern structure. The choosing of the option to use is\n        // abstracted-by and delegated-to the part helper object.\n        if (isDateElement(el)) {\n            var style = typeof el.style === 'string'\n                ? formats.date[el.style]\n                : isDateTimeSkeleton(el.style)\n                    ? el.style.parsedOptions\n                    : undefined;\n            result.push({\n                type: PART_TYPE.literal,\n                value: formatters\n                    .getDateTimeFormat(locales, style)\n                    .format(value),\n            });\n            continue;\n        }\n        if (isTimeElement(el)) {\n            var style = typeof el.style === 'string'\n                ? formats.time[el.style]\n                : isDateTimeSkeleton(el.style)\n                    ? el.style.parsedOptions\n                    : formats.time.medium;\n            result.push({\n                type: PART_TYPE.literal,\n                value: formatters\n                    .getDateTimeFormat(locales, style)\n                    .format(value),\n            });\n            continue;\n        }\n        if (isNumberElement(el)) {\n            var style = typeof el.style === 'string'\n                ? formats.number[el.style]\n                : isNumberSkeleton(el.style)\n                    ? el.style.parsedOptions\n                    : undefined;\n            if (style && style.scale) {\n                value =\n                    value *\n                        (style.scale || 1);\n            }\n            result.push({\n                type: PART_TYPE.literal,\n                value: formatters\n                    .getNumberFormat(locales, style)\n                    .format(value),\n            });\n            continue;\n        }\n        if (isTagElement(el)) {\n            var children = el.children, value_1 = el.value;\n            var formatFn = values[value_1];\n            if (!isFormatXMLElementFn(formatFn)) {\n                throw new InvalidValueTypeError(value_1, 'function', originalMessage);\n            }\n            var parts = formatToParts(children, locales, formatters, formats, values, currentPluralValue);\n            var chunks = formatFn(parts.map(function (p) { return p.value; }));\n            if (!Array.isArray(chunks)) {\n                chunks = [chunks];\n            }\n            result.push.apply(result, chunks.map(function (c) {\n                return {\n                    type: typeof c === 'string' ? PART_TYPE.literal : PART_TYPE.object,\n                    value: c,\n                };\n            }));\n        }\n        if (isSelectElement(el)) {\n            var opt = el.options[value] || el.options.other;\n            if (!opt) {\n                throw new InvalidValueError(el.value, value, Object.keys(el.options), originalMessage);\n            }\n            result.push.apply(result, formatToParts(opt.value, locales, formatters, formats, values));\n            continue;\n        }\n        if (isPluralElement(el)) {\n            var opt = el.options[\"=\".concat(value)];\n            if (!opt) {\n                if (!Intl.PluralRules) {\n                    throw new FormatError(\"Intl.PluralRules is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-pluralrules\\\"\\n\", ErrorCode.MISSING_INTL_API, originalMessage);\n                }\n                var rule = formatters\n                    .getPluralRules(locales, { type: el.pluralType })\n                    .select(value - (el.offset || 0));\n                opt = el.options[rule] || el.options.other;\n            }\n            if (!opt) {\n                throw new InvalidValueError(el.value, value, Object.keys(el.options), originalMessage);\n            }\n            result.push.apply(result, formatToParts(opt.value, locales, formatters, formats, values, value - (el.offset || 0)));\n            continue;\n        }\n    }\n    return mergeLiteral(result);\n}\n","/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\nimport { __assign, __rest, __spreadArray } from \"tslib\";\nimport { memoize, strategies } from '@formatjs/fast-memoize';\nimport { parse, } from '@formatjs/icu-messageformat-parser';\nimport { formatToParts, PART_TYPE, } from './formatters';\n// -- MessageFormat --------------------------------------------------------\nfunction mergeConfig(c1, c2) {\n    if (!c2) {\n        return c1;\n    }\n    return __assign(__assign(__assign({}, (c1 || {})), (c2 || {})), Object.keys(c1).reduce(function (all, k) {\n        all[k] = __assign(__assign({}, c1[k]), (c2[k] || {}));\n        return all;\n    }, {}));\n}\nfunction mergeConfigs(defaultConfig, configs) {\n    if (!configs) {\n        return defaultConfig;\n    }\n    return Object.keys(defaultConfig).reduce(function (all, k) {\n        all[k] = mergeConfig(defaultConfig[k], configs[k]);\n        return all;\n    }, __assign({}, defaultConfig));\n}\nfunction createFastMemoizeCache(store) {\n    return {\n        create: function () {\n            return {\n                get: function (key) {\n                    return store[key];\n                },\n                set: function (key, value) {\n                    store[key] = value;\n                },\n            };\n        },\n    };\n}\nfunction createDefaultFormatters(cache) {\n    if (cache === void 0) { cache = {\n        number: {},\n        dateTime: {},\n        pluralRules: {},\n    }; }\n    return {\n        getNumberFormat: memoize(function () {\n            var _a;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new ((_a = Intl.NumberFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.number),\n            strategy: strategies.variadic,\n        }),\n        getDateTimeFormat: memoize(function () {\n            var _a;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new ((_a = Intl.DateTimeFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.dateTime),\n            strategy: strategies.variadic,\n        }),\n        getPluralRules: memoize(function () {\n            var _a;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new ((_a = Intl.PluralRules).bind.apply(_a, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.pluralRules),\n            strategy: strategies.variadic,\n        }),\n    };\n}\nvar IntlMessageFormat = /** @class */ (function () {\n    function IntlMessageFormat(message, locales, overrideFormats, opts) {\n        if (locales === void 0) { locales = IntlMessageFormat.defaultLocale; }\n        var _this = this;\n        this.formatterCache = {\n            number: {},\n            dateTime: {},\n            pluralRules: {},\n        };\n        this.format = function (values) {\n            var parts = _this.formatToParts(values);\n            // Hot path for straight simple msg translations\n            if (parts.length === 1) {\n                return parts[0].value;\n            }\n            var result = parts.reduce(function (all, part) {\n                if (!all.length ||\n                    part.type !== PART_TYPE.literal ||\n                    typeof all[all.length - 1] !== 'string') {\n                    all.push(part.value);\n                }\n                else {\n                    all[all.length - 1] += part.value;\n                }\n                return all;\n            }, []);\n            if (result.length <= 1) {\n                return result[0] || '';\n            }\n            return result;\n        };\n        this.formatToParts = function (values) {\n            return formatToParts(_this.ast, _this.locales, _this.formatters, _this.formats, values, undefined, _this.message);\n        };\n        this.resolvedOptions = function () {\n            var _a;\n            return ({\n                locale: ((_a = _this.resolvedLocale) === null || _a === void 0 ? void 0 : _a.toString()) ||\n                    Intl.NumberFormat.supportedLocalesOf(_this.locales)[0],\n            });\n        };\n        this.getAst = function () { return _this.ast; };\n        // Defined first because it's used to build the format pattern.\n        this.locales = locales;\n        this.resolvedLocale = IntlMessageFormat.resolveLocale(locales);\n        if (typeof message === 'string') {\n            this.message = message;\n            if (!IntlMessageFormat.__parse) {\n                throw new TypeError('IntlMessageFormat.__parse must be set to process `message` of type `string`');\n            }\n            var _a = opts || {}, formatters = _a.formatters, parseOpts = __rest(_a, [\"formatters\"]);\n            // Parse string messages into an AST.\n            this.ast = IntlMessageFormat.__parse(message, __assign(__assign({}, parseOpts), { locale: this.resolvedLocale }));\n        }\n        else {\n            this.ast = message;\n        }\n        if (!Array.isArray(this.ast)) {\n            throw new TypeError('A message must be provided as a String or AST.');\n        }\n        // Creates a new object with the specified `formats` merged with the default\n        // formats.\n        this.formats = mergeConfigs(IntlMessageFormat.formats, overrideFormats);\n        this.formatters =\n            (opts && opts.formatters) || createDefaultFormatters(this.formatterCache);\n    }\n    Object.defineProperty(IntlMessageFormat, \"defaultLocale\", {\n        get: function () {\n            if (!IntlMessageFormat.memoizedDefaultLocale) {\n                IntlMessageFormat.memoizedDefaultLocale =\n                    new Intl.NumberFormat().resolvedOptions().locale;\n            }\n            return IntlMessageFormat.memoizedDefaultLocale;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    IntlMessageFormat.memoizedDefaultLocale = null;\n    IntlMessageFormat.resolveLocale = function (locales) {\n        if (typeof Intl.Locale === 'undefined') {\n            return;\n        }\n        var supportedLocales = Intl.NumberFormat.supportedLocalesOf(locales);\n        if (supportedLocales.length > 0) {\n            return new Intl.Locale(supportedLocales[0]);\n        }\n        return new Intl.Locale(typeof locales === 'string' ? locales : locales[0]);\n    };\n    IntlMessageFormat.__parse = parse;\n    // Default format options used as the prototype of the `formats` provided to the\n    // constructor. These are used when constructing the internal Intl.NumberFormat\n    // and Intl.DateTimeFormat instances.\n    IntlMessageFormat.formats = {\n        number: {\n            integer: {\n                maximumFractionDigits: 0,\n            },\n            currency: {\n                style: 'currency',\n            },\n            percent: {\n                style: 'percent',\n            },\n        },\n        date: {\n            short: {\n                month: 'numeric',\n                day: 'numeric',\n                year: '2-digit',\n            },\n            medium: {\n                month: 'short',\n                day: 'numeric',\n                year: 'numeric',\n            },\n            long: {\n                month: 'long',\n                day: 'numeric',\n                year: 'numeric',\n            },\n            full: {\n                weekday: 'long',\n                month: 'long',\n                day: 'numeric',\n                year: 'numeric',\n            },\n        },\n        time: {\n            short: {\n                hour: 'numeric',\n                minute: 'numeric',\n            },\n            medium: {\n                hour: 'numeric',\n                minute: 'numeric',\n                second: 'numeric',\n            },\n            long: {\n                hour: 'numeric',\n                minute: 'numeric',\n                second: 'numeric',\n                timeZoneName: 'short',\n            },\n            full: {\n                hour: 'numeric',\n                minute: 'numeric',\n                second: 'numeric',\n                timeZoneName: 'short',\n            },\n        },\n    };\n    return IntlMessageFormat;\n}());\nexport { IntlMessageFormat };\n","import { __extends } from \"tslib\";\nexport var IntlErrorCode;\n(function (IntlErrorCode) {\n    IntlErrorCode[\"FORMAT_ERROR\"] = \"FORMAT_ERROR\";\n    IntlErrorCode[\"UNSUPPORTED_FORMATTER\"] = \"UNSUPPORTED_FORMATTER\";\n    IntlErrorCode[\"INVALID_CONFIG\"] = \"INVALID_CONFIG\";\n    IntlErrorCode[\"MISSING_DATA\"] = \"MISSING_DATA\";\n    IntlErrorCode[\"MISSING_TRANSLATION\"] = \"MISSING_TRANSLATION\";\n})(IntlErrorCode || (IntlErrorCode = {}));\nvar IntlError = /** @class */ (function (_super) {\n    __extends(IntlError, _super);\n    function IntlError(code, message, exception) {\n        var _this = this;\n        var err = exception\n            ? exception instanceof Error\n                ? exception\n                : new Error(String(exception))\n            : undefined;\n        _this = _super.call(this, \"[@formatjs/intl Error \".concat(code, \"] \").concat(message, \"\\n\").concat(err ? \"\\n\".concat(err.message, \"\\n\").concat(err.stack) : '')) || this;\n        _this.code = code;\n        // @ts-ignore just so we don't need to declare dep on @types/node\n        if (typeof Error.captureStackTrace === 'function') {\n            // @ts-ignore just so we don't need to declare dep on @types/node\n            Error.captureStackTrace(_this, IntlError);\n        }\n        return _this;\n    }\n    return IntlError;\n}(Error));\nexport { IntlError };\nvar UnsupportedFormatterError = /** @class */ (function (_super) {\n    __extends(UnsupportedFormatterError, _super);\n    function UnsupportedFormatterError(message, exception) {\n        return _super.call(this, IntlErrorCode.UNSUPPORTED_FORMATTER, message, exception) || this;\n    }\n    return UnsupportedFormatterError;\n}(IntlError));\nexport { UnsupportedFormatterError };\nvar InvalidConfigError = /** @class */ (function (_super) {\n    __extends(InvalidConfigError, _super);\n    function InvalidConfigError(message, exception) {\n        return _super.call(this, IntlErrorCode.INVALID_CONFIG, message, exception) || this;\n    }\n    return InvalidConfigError;\n}(IntlError));\nexport { InvalidConfigError };\nvar MissingDataError = /** @class */ (function (_super) {\n    __extends(MissingDataError, _super);\n    function MissingDataError(message, exception) {\n        return _super.call(this, IntlErrorCode.MISSING_DATA, message, exception) || this;\n    }\n    return MissingDataError;\n}(IntlError));\nexport { MissingDataError };\nvar IntlFormatError = /** @class */ (function (_super) {\n    __extends(IntlFormatError, _super);\n    function IntlFormatError(message, locale, exception) {\n        var _this = _super.call(this, IntlErrorCode.FORMAT_ERROR, \"\".concat(message, \"\\nLocale: \").concat(locale, \"\\n\"), exception) || this;\n        _this.locale = locale;\n        return _this;\n    }\n    return IntlFormatError;\n}(IntlError));\nexport { IntlFormatError };\nvar MessageFormatError = /** @class */ (function (_super) {\n    __extends(MessageFormatError, _super);\n    function MessageFormatError(message, locale, descriptor, exception) {\n        var _this = _super.call(this, \"\".concat(message, \"\\nMessageID: \").concat(descriptor === null || descriptor === void 0 ? void 0 : descriptor.id, \"\\nDefault Message: \").concat(descriptor === null || descriptor === void 0 ? void 0 : descriptor.defaultMessage, \"\\nDescription: \").concat(descriptor === null || descriptor === void 0 ? void 0 : descriptor.description, \"\\n\"), locale, exception) || this;\n        _this.descriptor = descriptor;\n        _this.locale = locale;\n        return _this;\n    }\n    return MessageFormatError;\n}(IntlFormatError));\nexport { MessageFormatError };\nvar MissingTranslationError = /** @class */ (function (_super) {\n    __extends(MissingTranslationError, _super);\n    function MissingTranslationError(descriptor, locale) {\n        var _this = _super.call(this, IntlErrorCode.MISSING_TRANSLATION, \"Missing message: \\\"\".concat(descriptor.id, \"\\\" for locale \\\"\").concat(locale, \"\\\", using \").concat(descriptor.defaultMessage\n            ? \"default message (\".concat(typeof descriptor.defaultMessage === 'string'\n                ? descriptor.defaultMessage\n                : descriptor.defaultMessage\n                    .map(function (e) { var _a; return (_a = e.value) !== null && _a !== void 0 ? _a : JSON.stringify(e); })\n                    .join(), \")\")\n            : 'id', \" as fallback.\")) || this;\n        _this.descriptor = descriptor;\n        return _this;\n    }\n    return MissingTranslationError;\n}(IntlError));\nexport { MissingTranslationError };\n","import { __assign, __spreadArray } from \"tslib\";\nimport { IntlMessageFormat } from 'intl-messageformat';\nimport { memoize, strategies } from '@formatjs/fast-memoize';\nimport { UnsupportedFormatterError } from './error';\nexport function filterProps(props, allowlist, defaults) {\n    if (defaults === void 0) { defaults = {}; }\n    return allowlist.reduce(function (filtered, name) {\n        if (name in props) {\n            filtered[name] = props[name];\n        }\n        else if (name in defaults) {\n            filtered[name] = defaults[name];\n        }\n        return filtered;\n    }, {});\n}\nvar defaultErrorHandler = function (error) {\n    // @ts-ignore just so we don't need to declare dep on @types/node\n    if (process.env.NODE_ENV !== 'production') {\n        console.error(error);\n    }\n};\nvar defaultWarnHandler = function (warning) {\n    // @ts-ignore just so we don't need to declare dep on @types/node\n    if (process.env.NODE_ENV !== 'production') {\n        console.warn(warning);\n    }\n};\nexport var DEFAULT_INTL_CONFIG = {\n    formats: {},\n    messages: {},\n    timeZone: undefined,\n    defaultLocale: 'en',\n    defaultFormats: {},\n    fallbackOnEmptyString: true,\n    onError: defaultErrorHandler,\n    onWarn: defaultWarnHandler,\n};\nexport function createIntlCache() {\n    return {\n        dateTime: {},\n        number: {},\n        message: {},\n        relativeTime: {},\n        pluralRules: {},\n        list: {},\n        displayNames: {},\n    };\n}\nfunction createFastMemoizeCache(store) {\n    return {\n        create: function () {\n            return {\n                get: function (key) {\n                    return store[key];\n                },\n                set: function (key, value) {\n                    store[key] = value;\n                },\n            };\n        },\n    };\n}\n/**\n * Create intl formatters and populate cache\n * @param cache explicit cache to prevent leaking memory\n */\nexport function createFormatters(cache) {\n    if (cache === void 0) { cache = createIntlCache(); }\n    var RelativeTimeFormat = Intl.RelativeTimeFormat;\n    var ListFormat = Intl.ListFormat;\n    var DisplayNames = Intl.DisplayNames;\n    var getDateTimeFormat = memoize(function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return new ((_a = Intl.DateTimeFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n    }, {\n        cache: createFastMemoizeCache(cache.dateTime),\n        strategy: strategies.variadic,\n    });\n    var getNumberFormat = memoize(function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return new ((_a = Intl.NumberFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n    }, {\n        cache: createFastMemoizeCache(cache.number),\n        strategy: strategies.variadic,\n    });\n    var getPluralRules = memoize(function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return new ((_a = Intl.PluralRules).bind.apply(_a, __spreadArray([void 0], args, false)))();\n    }, {\n        cache: createFastMemoizeCache(cache.pluralRules),\n        strategy: strategies.variadic,\n    });\n    return {\n        getDateTimeFormat: getDateTimeFormat,\n        getNumberFormat: getNumberFormat,\n        getMessageFormat: memoize(function (message, locales, overrideFormats, opts) {\n            return new IntlMessageFormat(message, locales, overrideFormats, __assign({ formatters: {\n                    getNumberFormat: getNumberFormat,\n                    getDateTimeFormat: getDateTimeFormat,\n                    getPluralRules: getPluralRules,\n                } }, (opts || {})));\n        }, {\n            cache: createFastMemoizeCache(cache.message),\n            strategy: strategies.variadic,\n        }),\n        getRelativeTimeFormat: memoize(function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new (RelativeTimeFormat.bind.apply(RelativeTimeFormat, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.relativeTime),\n            strategy: strategies.variadic,\n        }),\n        getPluralRules: getPluralRules,\n        getListFormat: memoize(function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new (ListFormat.bind.apply(ListFormat, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.list),\n            strategy: strategies.variadic,\n        }),\n        getDisplayNames: memoize(function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new (DisplayNames.bind.apply(DisplayNames, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.displayNames),\n            strategy: strategies.variadic,\n        }),\n    };\n}\nexport function getNamedFormat(formats, type, name, onError) {\n    var formatType = formats && formats[type];\n    var format;\n    if (formatType) {\n        format = formatType[name];\n    }\n    if (format) {\n        return format;\n    }\n    onError(new UnsupportedFormatterError(\"No \".concat(type, \" format named: \").concat(name)));\n}\n","import { __assign } from \"tslib\";\nimport { invariant } from '@formatjs/ecma402-abstract';\nimport { IntlMessageFormat, } from 'intl-messageformat';\nimport { MissingTranslationError, MessageFormatError } from './error';\nimport { TYPE } from '@formatjs/icu-messageformat-parser';\nfunction setTimeZoneInOptions(opts, timeZone) {\n    return Object.keys(opts).reduce(function (all, k) {\n        all[k] = __assign({ timeZone: timeZone }, opts[k]);\n        return all;\n    }, {});\n}\nfunction deepMergeOptions(opts1, opts2) {\n    var keys = Object.keys(__assign(__assign({}, opts1), opts2));\n    return keys.reduce(function (all, k) {\n        all[k] = __assign(__assign({}, (opts1[k] || {})), (opts2[k] || {}));\n        return all;\n    }, {});\n}\nfunction deepMergeFormatsAndSetTimeZone(f1, timeZone) {\n    if (!timeZone) {\n        return f1;\n    }\n    var mfFormats = IntlMessageFormat.formats;\n    return __assign(__assign(__assign({}, mfFormats), f1), { date: deepMergeOptions(setTimeZoneInOptions(mfFormats.date, timeZone), setTimeZoneInOptions(f1.date || {}, timeZone)), time: deepMergeOptions(setTimeZoneInOptions(mfFormats.time, timeZone), setTimeZoneInOptions(f1.time || {}, timeZone)) });\n}\nexport var formatMessage = function (_a, state, messageDescriptor, values, opts) {\n    var locale = _a.locale, formats = _a.formats, messages = _a.messages, defaultLocale = _a.defaultLocale, defaultFormats = _a.defaultFormats, fallbackOnEmptyString = _a.fallbackOnEmptyString, onError = _a.onError, timeZone = _a.timeZone, defaultRichTextElements = _a.defaultRichTextElements;\n    if (messageDescriptor === void 0) { messageDescriptor = { id: '' }; }\n    var msgId = messageDescriptor.id, defaultMessage = messageDescriptor.defaultMessage;\n    // `id` is a required field of a Message Descriptor.\n    invariant(!!msgId, \"[@formatjs/intl] An `id` must be provided to format a message. You can either:\\n1. Configure your build toolchain with [babel-plugin-formatjs](https://formatjs.io/docs/tooling/babel-plugin)\\nor [@formatjs/ts-transformer](https://formatjs.io/docs/tooling/ts-transformer) OR\\n2. Configure your `eslint` config to include [eslint-plugin-formatjs](https://formatjs.io/docs/tooling/linter#enforce-id)\\nto autofix this issue\");\n    var id = String(msgId);\n    var message = \n    // In case messages is Object.create(null)\n    // e.g import('foo.json') from webpack)\n    // See https://github.com/formatjs/formatjs/issues/1914\n    messages &&\n        Object.prototype.hasOwnProperty.call(messages, id) &&\n        messages[id];\n    // IMPORTANT: Hot path if `message` is AST with a single literal node\n    if (Array.isArray(message) &&\n        message.length === 1 &&\n        message[0].type === TYPE.literal) {\n        return message[0].value;\n    }\n    // IMPORTANT: Hot path straight lookup for performance\n    if (!values &&\n        message &&\n        typeof message === 'string' &&\n        !defaultRichTextElements) {\n        return message.replace(/'\\{(.*?)\\}'/gi, \"{$1}\");\n    }\n    values = __assign(__assign({}, defaultRichTextElements), (values || {}));\n    formats = deepMergeFormatsAndSetTimeZone(formats, timeZone);\n    defaultFormats = deepMergeFormatsAndSetTimeZone(defaultFormats, timeZone);\n    if (!message) {\n        if (fallbackOnEmptyString === false && message === '') {\n            return message;\n        }\n        if (!defaultMessage ||\n            (locale && locale.toLowerCase() !== defaultLocale.toLowerCase())) {\n            // This prevents warnings from littering the console in development\n            // when no `messages` are passed into the <IntlProvider> for the\n            // default locale.\n            onError(new MissingTranslationError(messageDescriptor, locale));\n        }\n        if (defaultMessage) {\n            try {\n                var formatter = state.getMessageFormat(defaultMessage, defaultLocale, defaultFormats, opts);\n                return formatter.format(values);\n            }\n            catch (e) {\n                onError(new MessageFormatError(\"Error formatting default message for: \\\"\".concat(id, \"\\\", rendering default message verbatim\"), locale, messageDescriptor, e));\n                return typeof defaultMessage === 'string' ? defaultMessage : id;\n            }\n        }\n        return id;\n    }\n    // We have the translated message\n    try {\n        var formatter = state.getMessageFormat(message, locale, formats, __assign({ formatters: state }, (opts || {})));\n        return formatter.format(values);\n    }\n    catch (e) {\n        onError(new MessageFormatError(\"Error formatting message: \\\"\".concat(id, \"\\\", using \").concat(defaultMessage ? 'default message' : 'id', \" as fallback.\"), locale, messageDescriptor, e));\n    }\n    if (defaultMessage) {\n        try {\n            var formatter = state.getMessageFormat(defaultMessage, defaultLocale, defaultFormats, opts);\n            return formatter.format(values);\n        }\n        catch (e) {\n            onError(new MessageFormatError(\"Error formatting the default message for: \\\"\".concat(id, \"\\\", rendering message verbatim\"), locale, messageDescriptor, e));\n        }\n    }\n    if (typeof message === 'string') {\n        return message;\n    }\n    if (typeof defaultMessage === 'string') {\n        return defaultMessage;\n    }\n    return id;\n};\n","import { __spreadArray } from \"tslib\";\nimport { memoize, strategies } from '@formatjs/fast-memoize';\n/**\n * Cannot do Math.log(x) / Math.log(10) bc if IEEE floating point issue\n * @param x number\n */\nexport function getMagnitude(x) {\n    // Cannot count string length via Number.toString because it may use scientific notation\n    // for very small or very large numbers.\n    return Math.floor(Math.log(x) * Math.LOG10E);\n}\nexport function repeat(s, times) {\n    if (typeof s.repeat === 'function') {\n        return s.repeat(times);\n    }\n    var arr = new Array(times);\n    for (var i = 0; i < arr.length; i++) {\n        arr[i] = s;\n    }\n    return arr.join('');\n}\nexport function setInternalSlot(map, pl, field, value) {\n    if (!map.get(pl)) {\n        map.set(pl, Object.create(null));\n    }\n    var slots = map.get(pl);\n    slots[field] = value;\n}\nexport function setMultiInternalSlots(map, pl, props) {\n    for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\n        var k = _a[_i];\n        setInternalSlot(map, pl, k, props[k]);\n    }\n}\nexport function getInternalSlot(map, pl, field) {\n    return getMultiInternalSlots(map, pl, field)[field];\n}\nexport function getMultiInternalSlots(map, pl) {\n    var fields = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        fields[_i - 2] = arguments[_i];\n    }\n    var slots = map.get(pl);\n    if (!slots) {\n        throw new TypeError(\"\".concat(pl, \" InternalSlot has not been initialized\"));\n    }\n    return fields.reduce(function (all, f) {\n        all[f] = slots[f];\n        return all;\n    }, Object.create(null));\n}\nexport function isLiteralPart(patternPart) {\n    return patternPart.type === 'literal';\n}\n/*\n  17 ECMAScript Standard Built-in Objects:\n    Every built-in Function object, including constructors, that is not\n    identified as an anonymous function has a name property whose value\n    is a String.\n\n    Unless otherwise specified, the name property of a built-in Function\n    object, if it exists, has the attributes { [[Writable]]: false,\n    [[Enumerable]]: false, [[Configurable]]: true }.\n*/\nexport function defineProperty(target, name, _a) {\n    var value = _a.value;\n    Object.defineProperty(target, name, {\n        configurable: true,\n        enumerable: false,\n        writable: true,\n        value: value,\n    });\n}\n/**\n * 7.3.5 CreateDataProperty\n * @param target\n * @param name\n * @param value\n */\nexport function createDataProperty(target, name, value) {\n    Object.defineProperty(target, name, {\n        configurable: true,\n        enumerable: true,\n        writable: true,\n        value: value,\n    });\n}\nexport var UNICODE_EXTENSION_SEQUENCE_REGEX = /-u(?:-[0-9a-z]{2,8})+/gi;\nexport function invariant(condition, message, Err) {\n    if (Err === void 0) { Err = Error; }\n    if (!condition) {\n        throw new Err(message);\n    }\n}\nexport var createMemoizedNumberFormat = memoize(function () {\n    var _a;\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    return new ((_a = Intl.NumberFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n}, {\n    strategy: strategies.variadic,\n});\nexport var createMemoizedDateTimeFormat = memoize(function () {\n    var _a;\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    return new ((_a = Intl.DateTimeFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n}, {\n    strategy: strategies.variadic,\n});\nexport var createMemoizedPluralRules = memoize(function () {\n    var _a;\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    return new ((_a = Intl.PluralRules).bind.apply(_a, __spreadArray([void 0], args, false)))();\n}, {\n    strategy: strategies.variadic,\n});\nexport var createMemoizedLocale = memoize(function () {\n    var _a;\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    return new ((_a = Intl.Locale).bind.apply(_a, __spreadArray([void 0], args, false)))();\n}, {\n    strategy: strategies.variadic,\n});\nexport var createMemoizedListFormat = memoize(function () {\n    var _a;\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    return new ((_a = Intl.ListFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n}, {\n    strategy: strategies.variadic,\n});\n","import { __assign } from \"tslib\";\nimport { filterProps, getNamedFormat } from './utils';\nimport { IntlFormatError } from './error';\nvar DATE_TIME_FORMAT_OPTIONS = [\n    'formatMatcher',\n    'timeZone',\n    'hour12',\n    'weekday',\n    'era',\n    'year',\n    'month',\n    'day',\n    'hour',\n    'minute',\n    'second',\n    'timeZoneName',\n    'hourCycle',\n    'dateStyle',\n    'timeStyle',\n    'calendar',\n    // 'dayPeriod',\n    'numberingSystem',\n    'fractionalSecondDigits',\n];\nexport function getFormatter(_a, type, getDateTimeFormat, options) {\n    var locale = _a.locale, formats = _a.formats, onError = _a.onError, timeZone = _a.timeZone;\n    if (options === void 0) { options = {}; }\n    var format = options.format;\n    var defaults = __assign(__assign({}, (timeZone && { timeZone: timeZone })), (format && getNamedFormat(formats, type, format, onError)));\n    var filteredOptions = filterProps(options, DATE_TIME_FORMAT_OPTIONS, defaults);\n    if (type === 'time' &&\n        !filteredOptions.hour &&\n        !filteredOptions.minute &&\n        !filteredOptions.second &&\n        !filteredOptions.timeStyle &&\n        !filteredOptions.dateStyle) {\n        // Add default formatting options if hour, minute, or second isn't defined.\n        filteredOptions = __assign(__assign({}, filteredOptions), { hour: 'numeric', minute: 'numeric' });\n    }\n    return getDateTimeFormat(locale, filteredOptions);\n}\nexport function formatDate(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'date', getDateTimeFormat, options).format(date);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting date.', config.locale, e));\n    }\n    return String(date);\n}\nexport function formatTime(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'time', getDateTimeFormat, options).format(date);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting time.', config.locale, e));\n    }\n    return String(date);\n}\nexport function formatDateTimeRange(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var from = _a[0], to = _a[1], _b = _a[2], options = _b === void 0 ? {} : _b;\n    var timeZone = config.timeZone, locale = config.locale, onError = config.onError;\n    var filteredOptions = filterProps(options, DATE_TIME_FORMAT_OPTIONS, timeZone ? { timeZone: timeZone } : {});\n    try {\n        return getDateTimeFormat(locale, filteredOptions).formatRange(from, to);\n    }\n    catch (e) {\n        onError(new IntlFormatError('Error formatting date time range.', config.locale, e));\n    }\n    return String(from);\n}\nexport function formatDateToParts(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'date', getDateTimeFormat, options).formatToParts(date); // TODO: remove this when https://github.com/microsoft/TypeScript/pull/50402 is merged\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting date.', config.locale, e));\n    }\n    return [];\n}\nexport function formatTimeToParts(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'time', getDateTimeFormat, options).formatToParts(date); // TODO: remove this when https://github.com/microsoft/TypeScript/pull/50402 is merged\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting time.', config.locale, e));\n    }\n    return [];\n}\n","import { filterProps } from './utils';\nimport { FormatError, ErrorCode } from 'intl-messageformat';\nimport { IntlFormatError } from './error';\nvar DISPLAY_NAMES_OPTONS = [\n    'style',\n    'type',\n    'fallback',\n    'languageDisplay',\n];\nexport function formatDisplayName(_a, getDisplayNames, value, options) {\n    var locale = _a.locale, onError = _a.onError;\n    var DisplayNames = Intl.DisplayNames;\n    if (!DisplayNames) {\n        onError(new FormatError(\"Intl.DisplayNames is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-displaynames\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    var filteredOptions = filterProps(options, DISPLAY_NAMES_OPTONS);\n    try {\n        return getDisplayNames(locale, filteredOptions).of(value);\n    }\n    catch (e) {\n        onError(new IntlFormatError('Error formatting display name.', locale, e));\n    }\n}\n","import { __assign } from \"tslib\";\nimport { filterProps } from './utils';\nimport { FormatError, ErrorCode } from 'intl-messageformat';\nimport { IntlFormatError } from './error';\nvar LIST_FORMAT_OPTIONS = [\n    'type',\n    'style',\n];\nvar now = Date.now();\nfunction generateToken(i) {\n    return \"\".concat(now, \"_\").concat(i, \"_\").concat(now);\n}\nexport function formatList(opts, getListFormat, values, options) {\n    if (options === void 0) { options = {}; }\n    var results = formatListToParts(opts, getListFormat, values, options).reduce(function (all, el) {\n        var val = el.value;\n        if (typeof val !== 'string') {\n            all.push(val);\n        }\n        else if (typeof all[all.length - 1] === 'string') {\n            all[all.length - 1] += val;\n        }\n        else {\n            all.push(val);\n        }\n        return all;\n    }, []);\n    return results.length === 1 ? results[0] : results.length === 0 ? '' : results;\n}\nexport function formatListToParts(_a, getListFormat, values, options) {\n    var locale = _a.locale, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    var ListFormat = Intl.ListFormat;\n    if (!ListFormat) {\n        onError(new FormatError(\"Intl.ListFormat is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-listformat\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    var filteredOptions = filterProps(options, LIST_FORMAT_OPTIONS);\n    try {\n        var richValues_1 = {};\n        var serializedValues = values.map(function (v, i) {\n            if (typeof v === 'object') {\n                var id = generateToken(i);\n                richValues_1[id] = v;\n                return id;\n            }\n            return String(v);\n        });\n        return getListFormat(locale, filteredOptions)\n            .formatToParts(serializedValues)\n            .map(function (part) {\n            return part.type === 'literal'\n                ? part\n                : __assign(__assign({}, part), { value: richValues_1[part.value] || part.value });\n        });\n    }\n    catch (e) {\n        onError(new IntlFormatError('Error formatting list.', locale, e));\n    }\n    // @ts-ignore\n    return values;\n}\n","import { filterProps } from './utils';\nimport { IntlFormatError } from './error';\nimport { ErrorCode, FormatError } from 'intl-messageformat';\nvar PLURAL_FORMAT_OPTIONS = ['type'];\nexport function formatPlural(_a, getPluralRules, value, options) {\n    var locale = _a.locale, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    if (!Intl.PluralRules) {\n        onError(new FormatError(\"Intl.PluralRules is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-pluralrules\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    var filteredOptions = filterProps(options, PLURAL_FORMAT_OPTIONS);\n    try {\n        return getPluralRules(locale, filteredOptions).select(value);\n    }\n    catch (e) {\n        onError(new IntlFormatError('Error formatting plural.', locale, e));\n    }\n    return 'other';\n}\n","import { getNamedFormat, filterProps } from './utils';\nimport { FormatError, ErrorCode } from 'intl-messageformat';\nimport { IntlFormatError } from './error';\nvar RELATIVE_TIME_FORMAT_OPTIONS = ['numeric', 'style'];\nfunction getFormatter(_a, getRelativeTimeFormat, options) {\n    var locale = _a.locale, formats = _a.formats, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    var format = options.format;\n    var defaults = (!!format && getNamedFormat(formats, 'relative', format, onError)) || {};\n    var filteredOptions = filterProps(options, RELATIVE_TIME_FORMAT_OPTIONS, defaults);\n    return getRelativeTimeFormat(locale, filteredOptions);\n}\nexport function formatRelativeTime(config, getRelativeTimeFormat, value, unit, options) {\n    if (options === void 0) { options = {}; }\n    if (!unit) {\n        unit = 'second';\n    }\n    var RelativeTimeFormat = Intl.RelativeTimeFormat;\n    if (!RelativeTimeFormat) {\n        config.onError(new FormatError(\"Intl.RelativeTimeFormat is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-relativetimeformat\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    try {\n        return getFormatter(config, getRelativeTimeFormat, options).format(value, unit);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting relative time.', config.locale, e));\n    }\n    return String(value);\n}\n","import { IntlFormatError } from './error';\nimport { filterProps, getNamedFormat } from './utils';\nvar NUMBER_FORMAT_OPTIONS = [\n    'style',\n    'currency',\n    'unit',\n    'unitDisplay',\n    'useGrouping',\n    'minimumIntegerDigits',\n    'minimumFractionDigits',\n    'maximumFractionDigits',\n    'minimumSignificantDigits',\n    'maximumSignificantDigits',\n    // ES2020 NumberFormat\n    'compactDisplay',\n    'currencyDisplay',\n    'currencySign',\n    'notation',\n    'signDisplay',\n    'unit',\n    'unitDisplay',\n    'numberingSystem',\n    // ES2023 NumberFormat\n    'trailingZeroDisplay',\n    'roundingPriority',\n    'roundingIncrement',\n    'roundingMode',\n];\nexport function getFormatter(_a, getNumberFormat, options) {\n    var locale = _a.locale, formats = _a.formats, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    var format = options.format;\n    var defaults = ((format &&\n        getNamedFormat(formats, 'number', format, onError)) ||\n        {});\n    var filteredOptions = filterProps(options, NUMBER_FORMAT_OPTIONS, defaults);\n    return getNumberFormat(locale, filteredOptions);\n}\nexport function formatNumber(config, getNumberFormat, value, options) {\n    if (options === void 0) { options = {}; }\n    try {\n        return getFormatter(config, getNumberFormat, options).format(value);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting number.', config.locale, e));\n    }\n    return String(value);\n}\nexport function formatNumberToParts(config, getNumberFormat, value, options) {\n    if (options === void 0) { options = {}; }\n    try {\n        return getFormatter(config, getNumberFormat, options).formatToParts(value);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting number.', config.locale, e));\n    }\n    return [];\n}\n","import { __assign } from \"tslib\";\nimport { createFormatters, DEFAULT_INTL_CONFIG } from './utils';\nimport { InvalidConfigError, MissingDataError } from './error';\nimport { formatNumber, formatNumberToParts } from './number';\nimport { formatRelativeTime } from './relativeTime';\nimport { formatDate, formatDateToParts, formatTime, formatTimeToParts, formatDateTimeRange, } from './dateTime';\nimport { formatPlural } from './plural';\nimport { formatMessage } from './message';\nimport { formatList, formatListToParts } from './list';\nimport { formatDisplayName } from './displayName';\nfunction messagesContainString(messages) {\n    var firstMessage = messages ? messages[Object.keys(messages)[0]] : undefined;\n    return typeof firstMessage === 'string';\n}\nfunction verifyConfigMessages(config) {\n    if (config.onWarn &&\n        config.defaultRichTextElements &&\n        messagesContainString(config.messages || {})) {\n        config.onWarn(\"[@formatjs/intl] \\\"defaultRichTextElements\\\" was specified but \\\"message\\\" was not pre-compiled. \\nPlease consider using \\\"@formatjs/cli\\\" to pre-compile your messages for performance.\\nFor more details see https://formatjs.io/docs/getting-started/message-distribution\");\n    }\n}\n/**\n * Create intl object\n * @param config intl config\n * @param cache cache for formatter instances to prevent memory leak\n */\nexport function createIntl(config, cache) {\n    var formatters = createFormatters(cache);\n    var resolvedConfig = __assign(__assign({}, DEFAULT_INTL_CONFIG), config);\n    var locale = resolvedConfig.locale, defaultLocale = resolvedConfig.defaultLocale, onError = resolvedConfig.onError;\n    if (!locale) {\n        if (onError) {\n            onError(new InvalidConfigError(\"\\\"locale\\\" was not configured, using \\\"\".concat(defaultLocale, \"\\\" as fallback. See https://formatjs.io/docs/react-intl/api#intlshape for more details\")));\n        }\n        // Since there's no registered locale data for `locale`, this will\n        // fallback to the `defaultLocale` to make sure things can render.\n        // The `messages` are overridden to the `defaultProps` empty object\n        // to maintain referential equality across re-renders. It's assumed\n        // each <FormattedMessage> contains a `defaultMessage` prop.\n        resolvedConfig.locale = resolvedConfig.defaultLocale || 'en';\n    }\n    else if (!Intl.NumberFormat.supportedLocalesOf(locale).length && onError) {\n        onError(new MissingDataError(\"Missing locale data for locale: \\\"\".concat(locale, \"\\\" in Intl.NumberFormat. Using default locale: \\\"\").concat(defaultLocale, \"\\\" as fallback. See https://formatjs.io/docs/react-intl#runtime-requirements for more details\")));\n    }\n    else if (!Intl.DateTimeFormat.supportedLocalesOf(locale).length &&\n        onError) {\n        onError(new MissingDataError(\"Missing locale data for locale: \\\"\".concat(locale, \"\\\" in Intl.DateTimeFormat. Using default locale: \\\"\").concat(defaultLocale, \"\\\" as fallback. See https://formatjs.io/docs/react-intl#runtime-requirements for more details\")));\n    }\n    verifyConfigMessages(resolvedConfig);\n    return __assign(__assign({}, resolvedConfig), { formatters: formatters, formatNumber: formatNumber.bind(null, resolvedConfig, formatters.getNumberFormat), formatNumberToParts: formatNumberToParts.bind(null, resolvedConfig, formatters.getNumberFormat), formatRelativeTime: formatRelativeTime.bind(null, resolvedConfig, formatters.getRelativeTimeFormat), formatDate: formatDate.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatDateToParts: formatDateToParts.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatTime: formatTime.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatDateTimeRange: formatDateTimeRange.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatTimeToParts: formatTimeToParts.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatPlural: formatPlural.bind(null, resolvedConfig, formatters.getPluralRules), \n        // @ts-expect-error TODO: will get to this later\n        formatMessage: formatMessage.bind(null, resolvedConfig, formatters), \n        // @ts-expect-error TODO: will get to this later\n        $t: formatMessage.bind(null, resolvedConfig, formatters), formatList: formatList.bind(null, resolvedConfig, formatters.getListFormat), formatListToParts: formatListToParts.bind(null, resolvedConfig, formatters.getListFormat), formatDisplayName: formatDisplayName.bind(null, resolvedConfig, formatters.getDisplayNames) });\n}\n","export * from './src/types';\nexport function defineMessages(msgs) {\n    return msgs;\n}\nexport function defineMessage(msg) {\n    return msg;\n}\nexport { createIntlCache, filterProps, DEFAULT_INTL_CONFIG, createFormatters, getNamedFormat, } from './src/utils';\nexport * from './src/error';\nexport { formatMessage } from './src/message';\nexport { formatDate, formatDateToParts, formatTime, formatTimeToParts, } from './src/dateTime';\nexport { formatDisplayName } from './src/displayName';\nexport { formatList } from './src/list';\nexport { formatPlural } from './src/plural';\nexport { formatRelativeTime } from './src/relativeTime';\nexport { formatNumber, formatNumberToParts } from './src/number';\nexport { createIntl } from './src/create-intl';\n",null,null,"// Diacritics.js\n// \n// Started as something to be an equivalent of the Google Java Library diacritics library for JavaScript.\n// Found this: http://jsperf.com/diacritics/6 and converted it into a reusable module.\n// \n// @author Nijiko Yonskai\n// @license MIT\n// @copyright Nijikokun 2013 <nijikokun@gmail.com>\n(function (name, definition) {\n  if (typeof module != 'undefined' && module.exports) module.exports = definition()\n  else if (typeof define == 'function' && define.amd) define(definition)\n  else this[name] = definition()\n})('Diacritics', function () {\n  // Create public object\n  var output = {\n    map: {}\n  };\n\n  // Create private reference map.\n  var reference = [\n    {'base':' ',    'letters':'\\u00A0'},\n    {'base':'A',    'letters':'\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F'},\n    {'base':'AA',   'letters':'\\uA732'},\n    {'base':'AE',   'letters':'\\u00C6\\u01FC\\u01E2'},\n    {'base':'AO',   'letters':'\\uA734'},\n    {'base':'AU',   'letters':'\\uA736'},\n    {'base':'AV',   'letters':'\\uA738\\uA73A'},\n    {'base':'AY',   'letters':'\\uA73C'},\n    {'base':'B',    'letters':'\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181'},\n    {'base':'C',    'letters':'\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E'},\n    {'base':'D',    'letters':'\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779'},\n    {'base':'DZ',   'letters':'\\u01F1\\u01C4'},\n    {'base':'Dz',   'letters':'\\u01F2\\u01C5'},\n    {'base':'E',    'letters':'\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E'},\n    {'base':'F',    'letters':'\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B'},\n    {'base':'G',    'letters':'\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E'},\n    {'base':'H',    'letters':'\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D'},\n    {'base':'I',    'letters':'\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197'},\n    {'base':'J',    'letters':'\\u004A\\u24BF\\uFF2A\\u0134\\u0248'},\n    {'base':'K',    'letters':'\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2'},\n    {'base':'L',    'letters':'\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780'},\n    {'base':'LJ',   'letters':'\\u01C7'},\n    {'base':'Lj',   'letters':'\\u01C8'},\n    {'base':'M',    'letters':'\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C'},\n    {'base':'N',    'letters':'\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4'},\n    {'base':'NJ',   'letters':'\\u01CA'},\n    {'base':'Nj',   'letters':'\\u01CB'},\n    {'base':'O',    'letters':'\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C'},\n    {'base':'OI',   'letters':'\\u01A2'},\n    {'base':'OO',   'letters':'\\uA74E'},\n    {'base':'OU',   'letters':'\\u0222'},\n    {'base':'P',    'letters':'\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754'},\n    {'base':'Q',    'letters':'\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A'},\n    {'base':'R',    'letters':'\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782'},\n    {'base':'S',    'letters':'\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784'},\n    {'base':'T',    'letters':'\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786'},\n    {'base':'Th',   'letters':'\\u00DE'},\n    {'base':'TZ',   'letters':'\\uA728'},\n    {'base':'U',    'letters':'\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244'},\n    {'base':'V',    'letters':'\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245'},\n    {'base':'VY',   'letters':'\\uA760'},\n    {'base':'W',    'letters':'\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72'},\n    {'base':'X',    'letters':'\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C'},\n    {'base':'Y',    'letters':'\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE'},\n    {'base':'Z',    'letters':'\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762'},\n    {'base':'a',    'letters':'\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250\\u0251'},\n    {'base':'aa',   'letters':'\\uA733'},\n    {'base':'ae',   'letters':'\\u00E6\\u01FD\\u01E3'},\n    {'base':'ao',   'letters':'\\uA735'},\n    {'base':'au',   'letters':'\\uA737'},\n    {'base':'av',   'letters':'\\uA739\\uA73B'},\n    {'base':'ay',   'letters':'\\uA73D'},\n    {'base':'b',    'letters':'\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253'},\n    {'base':'c',    'letters':'\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184'},\n    {'base':'d',    'letters':'\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A'},\n    {'base':'dz',   'letters':'\\u01F3\\u01C6'},\n    {'base':'e',    'letters':'\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD'},\n    {'base':'f',    'letters':'\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C'},\n    {'base':'ff',   'letters':'\\uFB00'},\n    {'base':'fi',   'letters':'\\uFB01'},\n    {'base':'fl',   'letters':'\\uFB02'},\n    {'base':'ffi',  'letters':'\\uFB03'},\n    {'base':'ffl',  'letters':'\\uFB04'},\n    {'base':'g',    'letters':'\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F'},\n    {'base':'h',    'letters':'\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265'},\n    {'base':'hv',   'letters':'\\u0195'},\n    {'base':'i',    'letters':'\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131'},\n    {'base':'j',    'letters':'\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249'},\n    {'base':'k',    'letters':'\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3'},\n    {'base':'l',    'letters':'\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747'},\n    {'base':'lj',   'letters':'\\u01C9'},\n    {'base':'m',    'letters':'\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F'},\n    {'base':'n',    'letters':'\\x6E\\xF1\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5\\u043B\\u0509'},\n    {'base':'nj',   'letters':'\\u01CC'},\n    {'base':'o',    'letters':'\\u07C0\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275'},\n    {'base':'oe',   'letters':'\\u0152\\u0153'},\n    {'base':'oi',   'letters':'\\u01A3'},\n    {'base':'ou',   'letters':'\\u0223'},\n    {'base':'oo',   'letters':'\\uA74F'},\n    {'base':'p',    'letters':'\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755'},\n    {'base':'q',    'letters':'\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759'},\n    {'base':'r',    'letters':'\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783'},\n    {'base':'s',    'letters':'\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B'},\n    {'base':'ss',   'letters':'\\xDF'},\n    {'base':'t',    'letters':'\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787'},\n    {'base':'th',   'letters':'\\u00FE'},\n    {'base':'tz',   'letters':'\\uA729'},\n    {'base':'u',    'letters': '\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289'},\n    {'base':'v',    'letters':'\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C'},\n    {'base':'vy',   'letters':'\\uA761'},\n    {'base':'w',    'letters':'\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73'},\n    {'base':'x',    'letters':'\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D'},\n    {'base':'y',    'letters':'\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF'},\n    {'base':'z',    'letters':'\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763'}\n  ];\n\n  // Generate reference mapping\n  for (var i = 0, refLength = reference.length; i < refLength; i++){\n    var letters = reference[i].letters.split(\"\");\n\n    for (var j = 0, letLength = letters.length; j < letLength; j++){\n      output.map[letters[j]] = reference[i].base;\n    }\n  }\n\n  /**\n   * Clean accents (diacritics) from string.\n   * \n   * @param  {String} input String to be cleaned of diacritics.\n   * @return {String}\n   */\n  output.clean = function (input) {\n    if (!input || !input.length || input.length < 1) {\n      return \"\";\n    }\n\n    var string = \"\";\n    var letters = input.split(\"\");\n    var index = 0;\n    var length = letters.length;\n    var letter;\n\n    for (; index < length; index++) {\n      letter = letters[index];\n      string += letter in output.map ? output.map[letter] : letter;\n    }\n\n    return string;\n  };\n\n  return output;\n});","interface ScrollDeltas {\n  deltaX: number;\n  deltaY: number;\n}\ninterface ScrollInformation {\n  element: Element;\n  scrollLeft: number;\n  scrollTop: number;\n}\n\n/**\n * Mode that expresses the deltas in pixels.\n */\nexport const DOM_DELTA_PIXEL = 0;\n/**\n * Mode that expresses the deltas in lines.\n *\n * This only happens in Firefox for Windows.\n *\n * Reference: https://stackoverflow.com/a/37474225\n */\nexport const DOM_DELTA_LINE = 1;\n/**\n * Mode that expresses the deltas in pages.\n *\n * This only happens in Firefox for Windows with\n * a custom OS setting activated.\n *\n * Reference: https://stackoverflow.com/a/37474225\n */\nexport const DOM_DELTA_PAGE = 2;\n\n/**\n * Number of lines per page considered for\n * DOM_DELTA_PAGE.\n *\n */\nexport const LINES_PER_PAGE = 3;\n\nlet scrollLineHeight: number | undefined = undefined;\n\nexport function getScrollDeltas({\n  deltaX = 0,\n  deltaY = 0,\n  deltaMode = DOM_DELTA_PIXEL,\n}): ScrollDeltas {\n  if (deltaMode !== DOM_DELTA_PIXEL) {\n    if (deltaMode === DOM_DELTA_PAGE) {\n      deltaX *= LINES_PER_PAGE;\n      deltaY *= LINES_PER_PAGE;\n    }\n    const scrollLineHeight = getScrollLineHeight();\n    if (scrollLineHeight !== undefined) {\n      deltaX *= scrollLineHeight;\n      deltaY *= scrollLineHeight;\n    }\n  }\n\n  return { deltaX, deltaY };\n}\n\nexport function getScrollLineHeight(): number | undefined {\n  if (scrollLineHeight === undefined) {\n    const iframe = document.createElement('iframe');\n    iframe.src = '#';\n    iframe.style.position = 'absolute';\n    iframe.style.visibility = 'hidden';\n    iframe.style.width = '0px';\n    iframe.style.height = '0px';\n    iframe.style.border = 'none';\n    document.body.appendChild(iframe);\n    const iframeDocument = (iframe.contentWindow as Window).document;\n    iframeDocument.open();\n    iframeDocument.write(\n      '<!doctype html><html><head></head><body><span>X</span></body></html>',\n    );\n    iframeDocument.close();\n    const body = iframeDocument.body;\n    scrollLineHeight = (body.firstElementChild as HTMLElement).offsetHeight;\n    document.body.removeChild(iframe);\n  }\n  return scrollLineHeight;\n}\n\nexport function getAvailableScroll(element: Element, container: Element) {\n  const availableScroll = {\n    deltaXNegative: 0,\n    deltaXPositive: 0,\n    deltaYNegative: 0,\n    deltaYPositive: 0,\n  };\n\n  let scrollLeftMax, scrollTopMax;\n  while (container.contains(element) || container === element) {\n    scrollLeftMax = element.scrollWidth - element.clientWidth;\n    scrollTopMax = element.scrollHeight - element.clientHeight;\n\n    availableScroll.deltaXNegative += -element.scrollLeft;\n    availableScroll.deltaXPositive += scrollLeftMax - element.scrollLeft;\n    availableScroll.deltaYNegative += -element.scrollTop;\n    availableScroll.deltaYPositive += scrollTopMax - element.scrollTop;\n    const parent = element.parentNode;\n    if (parent === null) break;\n    element = parent as Element;\n  }\n\n  return availableScroll;\n}\n\n/**\n * Calculates the scroll distribution for `element` inside` container.\n */\nfunction calculateScrollDistribution(\n  deltaX: number,\n  deltaY: number,\n  element: Element,\n  container: Element,\n  accumulator: ScrollInformation[] = [],\n): ScrollInformation[] {\n  const scrollInformation: ScrollInformation = {\n    element,\n    scrollLeft: 0,\n    scrollTop: 0,\n  };\n  const scrollLeftMax = element.scrollWidth - element.clientWidth;\n  const scrollTopMax = element.scrollHeight - element.clientHeight;\n\n  const availableScroll = {\n    deltaXNegative: -element.scrollLeft,\n    deltaXPositive: scrollLeftMax - element.scrollLeft,\n    deltaYNegative: -element.scrollTop,\n    deltaYPositive: scrollTopMax - element.scrollTop,\n  };\n\n  const elementStyle = window.getComputedStyle(element);\n\n  if (elementStyle.overflowX !== 'hidden') {\n    // The `deltaX` can be larger than the available scroll for the element, thus overshooting.\n    // The result of that is that it scrolls the element as far as possible. We don't need to\n    // calculate exactly because we reduce the amount of desired scroll for the\n    // parent elements by the correct amount below.\n    scrollInformation.scrollLeft = element.scrollLeft + deltaX;\n    if (deltaX > availableScroll.deltaXPositive) {\n      deltaX = deltaX - availableScroll.deltaXPositive;\n    } else if (deltaX < availableScroll.deltaXNegative) {\n      deltaX = deltaX - availableScroll.deltaXNegative;\n    } else {\n      deltaX = 0;\n    }\n  }\n\n  if (elementStyle.overflowY !== 'hidden') {\n    scrollInformation.scrollTop = element.scrollTop + deltaY;\n    if (deltaY > availableScroll.deltaYPositive) {\n      deltaY = deltaY - availableScroll.deltaYPositive;\n    } else if (deltaY < availableScroll.deltaYNegative) {\n      deltaY = deltaY - availableScroll.deltaYNegative;\n    } else {\n      deltaY = 0;\n    }\n  }\n\n  if (element !== container && (deltaX || deltaY)) {\n    return calculateScrollDistribution(\n      deltaX,\n      deltaY,\n      element.parentNode as Element,\n      container,\n      accumulator.concat([scrollInformation]),\n    );\n  }\n\n  return accumulator.concat([scrollInformation]);\n}\n\n// Recursively walks up scroll containers until the delta is distributed or we\n// run out of elements in the allowed-to-scroll container.\nexport function distributeScroll(\n  deltaX: number,\n  deltaY: number,\n  element: Element,\n  container: Element,\n) {\n  const scrollInfos = calculateScrollDistribution(\n    deltaX,\n    deltaY,\n    element,\n    container,\n  );\n  let info;\n\n  for (let i = 0; i < scrollInfos.length; i++) {\n    info = scrollInfos[i];\n    if (info) {\n      info.element.scrollLeft = info.scrollLeft;\n      info.element.scrollTop = info.scrollTop;\n    }\n  }\n}\n","import { action } from '@ember/object';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { getScrollParent } from '../utils/calculate-position.ts';\nimport {\n  distributeScroll,\n  getAvailableScroll,\n  getScrollDeltas,\n} from '../utils/scroll-helpers.ts';\nimport hasMoved from '../utils/has-moved.ts';\nimport { isTesting } from '@embroider/macros';\nimport { modifier } from 'ember-modifier';\nimport { element } from 'ember-element-helper';\nimport { or } from 'ember-truth-helpers';\nimport style from 'ember-style-modifier';\nimport { on } from '@ember/modifier';\nimport { fn } from '@ember/helper';\nimport { hash } from '@ember/helper';\nimport type {\n  Dropdown,\n  TRootEventType,\n  HorizontalPosition,\n  VerticalPosition,\n} from '../types.ts';\n\nexport interface BasicDropdownContentSignature {\n  Element: HTMLElement;\n  Args: {\n    animationEnabled?: boolean;\n    transitioningInClass?: string;\n    transitionedInClass?: string;\n    transitioningOutClass?: string;\n    isTouchDevice?: boolean;\n    destination?: string;\n    destinationElement?: HTMLElement | null;\n    dropdown?: Dropdown;\n    renderInPlace?: boolean;\n    preventScroll?: boolean | undefined;\n    rootEventType?: TRootEventType;\n    top?: string | undefined;\n    left?: string | undefined;\n    right?: string | undefined;\n    width?: string | undefined;\n    height?: string | undefined;\n    otherStyles?: Record<string, string | number | undefined>;\n    hPosition?: HorizontalPosition | null;\n    vPosition?: VerticalPosition | null;\n    dir?: string;\n    defaultClass?: string;\n    overlay?: boolean;\n    htmlTag?: keyof HTMLElementTagNameMap | undefined;\n    onFocusIn?: (dropdown?: Dropdown, event?: FocusEvent) => void;\n    onFocusOut?: (dropdown?: Dropdown, event?: FocusEvent) => void;\n    onMouseEnter?: (dropdown?: Dropdown, event?: MouseEvent) => void;\n    onMouseLeave?: (dropdown?: Dropdown, event?: MouseEvent) => void;\n    shouldReposition?: (\n      mutations: MutationRecord[],\n      dropdown?: Dropdown,\n    ) => boolean;\n  };\n  Blocks: {\n    default: [];\n  };\n}\n\ntype RootMouseDownHandler = (ev: MouseEvent | TouchEvent) => void;\n\nexport default class BasicDropdownContent extends Component<BasicDropdownContentSignature> {\n  transitioningInClass =\n    this.args.transitioningInClass || 'ember-basic-dropdown--transitioning-in';\n  transitionedInClass =\n    this.args.transitionedInClass || 'ember-basic-dropdown--transitioned-in';\n  transitioningOutClass =\n    this.args.transitioningOutClass ||\n    'ember-basic-dropdown--transitioning-out';\n  isTouchDevice =\n    this.args.isTouchDevice || Boolean(!!window && 'ontouchstart' in window);\n  dropdownId = `ember-basic-dropdown-content-${this.args.dropdown?.uniqueId}`;\n  private touchMoveEvent: TouchEvent | undefined;\n  private handleRootMouseDown?: RootMouseDownHandler;\n  private scrollableAncestors: Element[] = [];\n  private mutationObserver: MutationObserver | undefined;\n  private rootElement: HTMLElement | undefined;\n  @tracked private _contentWormhole?: Element;\n  @tracked animationClass = this.transitioningInClass;\n\n  get destinationElement(): Element | null {\n    if (this.args.destinationElement) {\n      return this.args.destinationElement;\n    }\n\n    if (!this.args.destination) {\n      return null;\n    }\n\n    const element = document.getElementById(this.args.destination);\n\n    if (element) {\n      return element;\n    }\n\n    if (this._contentWormhole) {\n      return (\n        this._contentWormhole.getRootNode() as HTMLElement\n      )?.querySelector('#' + this.args.destination);\n    }\n\n    return null;\n  }\n\n  get animationEnabled(): boolean {\n    const { animationEnabled: animationEnabledArg = true } = this.args;\n\n    return animationEnabledArg && !isTesting();\n  }\n\n  get positionStyles(): Record<string, string> {\n    const style: Record<string, string> = {};\n    if (this.args.top !== undefined) {\n      style['top'] = this.args.top;\n    }\n    if (this.args.left !== undefined) {\n      style['left'] = this.args.left;\n    }\n    if (this.args.right !== undefined) {\n      style['right'] = this.args.right;\n    }\n    if (this.args.width !== undefined) {\n      style['width'] = this.args.width;\n    }\n    if (this.args.height !== undefined) {\n      style['height'] = this.args.height;\n    }\n    return style;\n  }\n\n  /**\n   * Allows similair behaviour to `ember-composable-helpers`' `optional` helper.\n   * Avoids adding extra dependencies.\n   * Can be removed when the template `V1` compatability event handlers are removed.\n   *\n   * @see https://github.com/cibernox/ember-basic-dropdown/issues/498\n   * @memberof BasicDropdownContent\n   */\n  noop(): void {}\n\n  registerDropdownContentWormhole = modifier(\n    (dropdownContentWormhole: Element) => {\n      this._contentWormhole = dropdownContentWormhole;\n    },\n  );\n\n  respondToEvents = modifier(\n    (dropdownElement: Element): (() => void) => {\n      if (this.args.dropdown?.actions?.registerDropdownElement) {\n        this.args.dropdown.actions.registerDropdownElement(\n          dropdownElement as HTMLElement,\n        );\n      }\n\n      const selector = `[data-ebd-id=${this.args.dropdown?.uniqueId}-trigger]`;\n      let triggerElement: HTMLElement | null = null;\n      if (\n        typeof this.args.dropdown?.actions?.getTriggerElement === 'function'\n      ) {\n        triggerElement = this.args.dropdown?.actions?.getTriggerElement();\n      }\n      if (!triggerElement) {\n        triggerElement = document.querySelector(selector) as HTMLElement;\n      }\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      this.handleRootMouseDown = (e: MouseEvent | TouchEvent): any => {\n        const target = (e.composedPath?.()[0] || e.target) as Element;\n        if (target === null) return;\n        if (\n          hasMoved(e as TouchEvent, this.touchMoveEvent) ||\n          dropdownElement.contains(target) ||\n          (triggerElement && triggerElement.contains(target))\n        ) {\n          this.touchMoveEvent = undefined;\n          return;\n        }\n\n        if (dropdownIsValidParent(triggerElement, target, this.dropdownId)) {\n          this.touchMoveEvent = undefined;\n          return;\n        }\n\n        if (this.args.dropdown?.actions?.close) {\n          this.args.dropdown.actions.close(e, true);\n        }\n      };\n      document.addEventListener(\n        this.args.rootEventType || 'click',\n        this.handleRootMouseDown,\n        true,\n      );\n\n      // We need to register closing event on shadow dom element, otherwise all clicks inside a shadow dom are not closing the dropdown\n      // In additional store the rootElement for outside clicks (ensure that we do removeEventListener on correct element)\n      if (\n        this._contentWormhole &&\n        this._contentWormhole.getRootNode() instanceof ShadowRoot\n      ) {\n        this.rootElement = this._contentWormhole.getRootNode() as HTMLElement;\n      } else {\n        this.rootElement = undefined;\n      }\n\n      if (this.rootElement) {\n        this.rootElement.addEventListener(\n          this.args.rootEventType || 'click',\n          this.handleRootMouseDown,\n          true,\n        );\n      }\n\n      window.addEventListener('resize', this.repositionBound);\n      window.addEventListener('orientationchange', this.repositionBound);\n\n      if (this.isTouchDevice) {\n        document.addEventListener(\n          'touchstart',\n          this.touchStartHandlerBound,\n          true,\n        );\n        document.addEventListener('touchend', this.handleRootMouseDown, true);\n\n        if (this.rootElement) {\n          this.rootElement.addEventListener(\n            'touchstart',\n            this.touchStartHandlerBound,\n            true,\n          );\n          this.rootElement.addEventListener(\n            'touchend',\n            this.handleRootMouseDown,\n            true,\n          );\n        }\n      }\n      if (\n        triggerElement !== null &&\n        !(triggerElement.getRootNode() instanceof ShadowRoot)\n      ) {\n        this.scrollableAncestors = getScrollableAncestors(triggerElement);\n      }\n      this.addScrollHandling(dropdownElement);\n      return () => {\n        this.removeGlobalEvents();\n        this.removeScrollHandling();\n        this.scrollableAncestors = [];\n\n        document.removeEventListener(\n          this.args.rootEventType || 'click',\n          this.handleRootMouseDown as RootMouseDownHandler,\n          true,\n        );\n\n        if (this.rootElement) {\n          this.rootElement.removeEventListener(\n            this.args.rootEventType || 'click',\n            this.handleRootMouseDown as RootMouseDownHandler,\n            true,\n          );\n        }\n\n        if (this.isTouchDevice) {\n          document.removeEventListener(\n            'touchstart',\n            this.touchStartHandlerBound,\n            true,\n          );\n          document.removeEventListener(\n            'touchend',\n            this.handleRootMouseDown as RootMouseDownHandler,\n            true,\n          );\n\n          if (this.rootElement) {\n            this.rootElement.removeEventListener(\n              'touchstart',\n              this.touchStartHandlerBound,\n              true,\n            );\n            this.rootElement.removeEventListener(\n              'touchend',\n              this.handleRootMouseDown as RootMouseDownHandler,\n              true,\n            );\n          }\n        }\n      };\n    },\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    { eager: false },\n  );\n\n  initiallyReposition = modifier(\n    () => {\n      // Escape autotracking frame and avoid backtracking re-render\n      void Promise.resolve().then(() => {\n        this.args.dropdown?.actions.reposition();\n      });\n    },\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    { eager: false },\n  );\n\n  animateInAndOut = modifier(\n    (dropdownElement: Element): (() => void) => {\n      if (!this.animationEnabled) return () => {};\n      waitForAnimations(dropdownElement, () => {\n        this.animationClass = this.transitionedInClass;\n      });\n      return () => {\n        if (!this.animationEnabled) return;\n        let parentElement =\n          dropdownElement.parentElement ?? this.destinationElement;\n        if (parentElement === null) return;\n        if (this.args.renderInPlace) {\n          parentElement = parentElement.parentElement;\n        }\n        if (parentElement === null) return;\n        const clone = dropdownElement.cloneNode(true) as Element;\n        clone.id = `${clone.id}--clone`;\n        clone.classList.remove(...this.transitioningInClass.split(' '));\n        clone.classList.add(...this.transitioningOutClass.split(' '));\n        parentElement.appendChild(clone);\n        this.animationClass = this.transitioningInClass;\n        waitForAnimations(clone, function () {\n          (parentElement as HTMLElement).removeChild(clone);\n        });\n      };\n    },\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    { eager: false },\n  );\n\n  observeMutations = modifier(\n    (dropdownElement: Element): (() => void) => {\n      this.mutationObserver = new MutationObserver((mutations) => {\n        let shouldReposition = mutations.some(\n          (record: MutationRecord) =>\n            containsRelevantMutation(record.addedNodes) ||\n            containsRelevantMutation(record.removedNodes),\n        );\n\n        if (shouldReposition && this.args.shouldReposition) {\n          shouldReposition = this.args.shouldReposition(\n            mutations,\n            this.args.dropdown,\n          );\n        }\n\n        if (shouldReposition) {\n          this.reposition();\n        }\n      });\n      this.mutationObserver.observe(dropdownElement, {\n        childList: true,\n        subtree: true,\n      });\n      return () => {\n        if (this.mutationObserver !== undefined) {\n          this.mutationObserver.disconnect();\n          this.mutationObserver = undefined;\n        }\n      };\n    },\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    { eager: false },\n  );\n\n  @action\n  touchStartHandler(): void {\n    document.addEventListener('touchmove', this.touchMoveHandlerBound, true);\n\n    if (\n      this._contentWormhole &&\n      this._contentWormhole.getRootNode() instanceof ShadowRoot\n    ) {\n      const rootElement = this._contentWormhole.getRootNode() as HTMLElement;\n      rootElement.addEventListener(\n        'touchmove',\n        this.touchMoveHandlerBound,\n        true,\n      );\n    }\n  }\n\n  @action\n  touchMoveHandler(e: TouchEvent): void {\n    this.touchMoveEvent = e;\n    document.removeEventListener('touchmove', this.touchMoveHandlerBound, true);\n\n    if (\n      this._contentWormhole &&\n      this._contentWormhole.getRootNode() instanceof ShadowRoot\n    ) {\n      const rootElement = this._contentWormhole.getRootNode() as HTMLElement;\n      rootElement.removeEventListener(\n        'touchmove',\n        this.touchMoveHandlerBound,\n        true,\n      );\n    }\n  }\n\n  @action\n  reposition(): void {\n    if (!this.args.dropdown) {\n      return;\n    }\n\n    this.args.dropdown.actions.reposition();\n  }\n\n  @action\n  removeGlobalEvents(): void {\n    window.removeEventListener('resize', this.repositionBound);\n    window.removeEventListener('orientationchange', this.repositionBound);\n  }\n\n  touchMoveHandlerBound = (e: TouchEvent) => this.touchMoveHandler(e);\n  repositionBound = () => this.reposition();\n  touchStartHandlerBound = () => this.touchStartHandler();\n\n  // Methods\n  addScrollHandling(dropdownElement: Element): void {\n    if (this.args.preventScroll === true) {\n      const wheelHandler = (event: WheelEvent) => {\n        const target = (event.composedPath?.()[0] || event.target) as Element;\n        if (target === null) return;\n        if (\n          dropdownElement.contains(target) ||\n          dropdownElement === event.target\n        ) {\n          // Discover the amount of scrollable canvas that is within the dropdown.\n          const availableScroll = getAvailableScroll(target, dropdownElement);\n\n          // Calculate what the event's desired change to that scrollable canvas is.\n          let { deltaX, deltaY } = getScrollDeltas(event);\n\n          // If the consequence of the wheel action would result in scrolling beyond\n          // the scrollable canvas of the dropdown, call preventDefault() and clamp\n          // the value of the delta to the available scroll size.\n          if (deltaX < availableScroll.deltaXNegative) {\n            deltaX = availableScroll.deltaXNegative;\n            event.preventDefault();\n          } else if (deltaX > availableScroll.deltaXPositive) {\n            deltaX = availableScroll.deltaXPositive;\n            event.preventDefault();\n          } else if (deltaY < availableScroll.deltaYNegative) {\n            deltaY = availableScroll.deltaYNegative;\n            event.preventDefault();\n          } else if (deltaY > availableScroll.deltaYPositive) {\n            deltaY = availableScroll.deltaYPositive;\n            event.preventDefault();\n          }\n\n          // Add back in the default behavior for the two good states that the above\n          // `preventDefault()` code will break.\n          // - Two-axis scrolling on a one-axis scroll container\n          // - The last relevant wheel event if the scroll is overshooting\n\n          // Also, don't attempt to do this if both of `deltaX` or `deltaY` are 0.\n          if (event.defaultPrevented && (deltaX || deltaY)) {\n            distributeScroll(deltaX, deltaY, target, dropdownElement);\n          }\n        } else {\n          // Scrolling outside of the dropdown is prohibited.\n          event.preventDefault();\n        }\n      };\n      document.addEventListener('wheel', wheelHandler, {\n        capture: true,\n        passive: false,\n      });\n\n      if (\n        this._contentWormhole &&\n        this._contentWormhole.getRootNode() instanceof ShadowRoot\n      ) {\n        const rootElement = this._contentWormhole.getRootNode() as HTMLElement;\n        rootElement.addEventListener('wheel', wheelHandler, {\n          capture: true,\n          passive: false,\n        });\n      }\n\n      this.removeScrollHandling = () => {\n        document.removeEventListener('wheel', wheelHandler, { capture: true });\n\n        if (\n          this._contentWormhole &&\n          this._contentWormhole.getRootNode() instanceof ShadowRoot\n        ) {\n          const rootElement =\n            this._contentWormhole.getRootNode() as HTMLElement;\n          rootElement.removeEventListener('wheel', wheelHandler, {\n            capture: true,\n          });\n        }\n      };\n    } else {\n      this.addScrollEvents();\n      this.removeScrollHandling = this.removeScrollEvents.bind(this);\n    }\n  }\n\n  // Assigned at runtime to ensure that changes to the `preventScroll` property\n  // don't result in not cleaning up after ourselves.\n  removeScrollHandling(): void {}\n\n  // These two functions wire up scroll handling if `preventScroll` is false.\n  // These trigger reposition of the dropdown.\n  addScrollEvents(): void {\n    window.addEventListener('scroll', this.repositionBound);\n    this.scrollableAncestors.forEach((el) => {\n      el.addEventListener('scroll', this.repositionBound);\n    });\n  }\n\n  removeScrollEvents(): void {\n    window.removeEventListener('scroll', this.repositionBound);\n    this.scrollableAncestors.forEach((el) => {\n      el.removeEventListener('scroll', this.repositionBound);\n    });\n  }\n\n  <template>\n    {{#if @dropdown.isOpen}}\n      <div\n        class=\"ember-basic-dropdown-content-wormhole-origin\"\n        {{this.registerDropdownContentWormhole}}\n      >\n        {{#if @renderInPlace}}\n          {{#if @overlay}}\n            <div class=\"ember-basic-dropdown-overlay\"></div>\n          {{/if}}\n\n          {{#let (element (or @htmlTag \"div\")) as |OptionalTag|}}\n            <OptionalTag\n              id={{this.dropdownId}}\n              class=\"ember-basic-dropdown-content ember-basic-dropdown-content--{{@hPosition}}\n                ember-basic-dropdown-content--{{@vPosition}}\n                {{this.animationClass}}{{if\n                  @renderInPlace\n                  ' ember-basic-dropdown-content--in-place'\n                }}\n                {{@defaultClass}}\"\n              dir={{@dir}}\n              ...attributes\n              {{style @otherStyles this.positionStyles}}\n              {{this.respondToEvents}}\n              {{this.initiallyReposition}}\n              {{this.observeMutations}}\n              {{this.animateInAndOut}}\n              {{on \"focusin\" (fn (or @onFocusIn this.noop) @dropdown)}}\n              {{on \"focusout\" (fn (or @onFocusOut this.noop) @dropdown)}}\n              {{on \"mouseenter\" (fn (or @onMouseEnter this.noop) @dropdown)}}\n              {{on \"mouseleave\" (fn (or @onMouseLeave this.noop) @dropdown)}}\n              {{! V1 compatibility - See #498 }}\n            >\n              {{yield}}\n            </OptionalTag>\n          {{/let}}\n        {{else if this.destinationElement}}\n          {{#in-element this.destinationElement insertBefore=null}}\n            {{#if @overlay}}\n              <div class=\"ember-basic-dropdown-overlay\"></div>\n            {{/if}}\n\n            {{#let (element (or @htmlTag \"div\")) as |OptionalTag|}}\n              <OptionalTag\n                id={{this.dropdownId}}\n                class=\"ember-basic-dropdown-content ember-basic-dropdown-content--{{@hPosition}}\n                  ember-basic-dropdown-content--{{@vPosition}}\n                  {{this.animationClass}}{{if\n                    @renderInPlace\n                    ' ember-basic-dropdown-content--in-place'\n                  }}\n                  {{@defaultClass}}\"\n                dir={{@dir}}\n                ...attributes\n                {{style @otherStyles this.positionStyles}}\n                {{this.respondToEvents}}\n                {{this.initiallyReposition}}\n                {{this.observeMutations}}\n                {{this.animateInAndOut}}\n                {{on \"focusin\" (fn (or @onFocusIn this.noop) @dropdown)}}\n                {{on \"focusout\" (fn (or @onFocusOut this.noop) @dropdown)}}\n                {{on \"mouseenter\" (fn (or @onMouseEnter this.noop) @dropdown)}}\n                {{on \"mouseleave\" (fn (or @onMouseLeave this.noop) @dropdown)}}\n                {{! V1 compatibility - See #498 }}\n              >\n                {{yield}}\n              </OptionalTag>\n            {{/let}}\n          {{/in-element}}\n        {{/if}}\n      </div>\n    {{else}}\n      <div\n        id={{this.dropdownId}}\n        class=\"ember-basic-dropdown-content-placeholder\"\n        {{style (hash display=\"none\")}}\n      ></div>\n    {{/if}}\n  </template>\n}\n\nfunction containsRelevantMutation(nodeList: NodeList): boolean {\n  for (let i = 0; i < nodeList.length; i++) {\n    const node = nodeList[i];\n    if (\n      node !== undefined &&\n      node.nodeName !== '#comment' &&\n      !(node.nodeName === '#text' && node.nodeValue === '')\n    ) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// All ancestors with scroll (except the BODY, which is treated differently)\nfunction getScrollableAncestors(triggerElement: Element): Element[] {\n  const scrollableAncestors = [];\n  if (triggerElement) {\n    const parent = triggerElement.parentNode;\n    if (parent !== null) {\n      let nextScrollable: Element | undefined = getScrollParent(\n        parent as Element,\n      );\n      while (\n        nextScrollable &&\n        nextScrollable.tagName.toUpperCase() !== 'BODY' &&\n        nextScrollable.tagName.toUpperCase() !== 'HTML'\n      ) {\n        scrollableAncestors.push(nextScrollable);\n        const nextParent = nextScrollable.parentNode;\n        if (nextParent === null) {\n          nextScrollable = undefined;\n        } else {\n          nextScrollable = getScrollParent(nextParent as Element);\n        }\n      }\n    }\n  }\n  return scrollableAncestors;\n}\n\nfunction closestContent(el: Element): Element | null {\n  while (\n    el &&\n    (!el.classList || !el.classList.contains('ember-basic-dropdown-content'))\n  ) {\n    if (el.parentElement === null) return null;\n    el = el.parentElement;\n  }\n  return el;\n}\n\nfunction waitForAnimations(element: Element, callback: () => void): void {\n  window.requestAnimationFrame(function () {\n    const computedStyle = window.getComputedStyle(element);\n    if (\n      computedStyle.animationName !== 'none' &&\n      computedStyle.animationPlayState === 'running'\n    ) {\n      const eventCallback = function () {\n        element.removeEventListener('animationend', eventCallback);\n        callback();\n      };\n      element.addEventListener('animationend', eventCallback);\n    } else {\n      callback();\n    }\n  });\n}\n\n/**\n * Evaluates if the given element is in a dropdown or any of its parent dropdowns.\n *\n * @param {any} owner\n * @param {HTMLElement} el\n * @param {String} dropdownId\n */\nfunction dropdownIsValidParent(\n  triggerElement: HTMLElement | null,\n  el: Element,\n  dropdownId: string,\n): boolean {\n  const closestDropdown = closestContent(el);\n  if (closestDropdown === null) {\n    return false;\n  } else {\n    const closestAttrId = closestDropdown.getAttribute('id') ?? '';\n    const selector = `[aria-controls=${closestAttrId}]`;\n    const trigger =\n      document.querySelector(selector) ??\n      (triggerElement?.getRootNode() as HTMLElement)?.querySelector(selector);\n    if (trigger === null) return false;\n    const parentDropdown = closestContent(trigger);\n    if (parentDropdown === null) return false;\n    const parentAttrId = parentDropdown.getAttribute('id') ?? '';\n    return (\n      (parentDropdown && parentAttrId === dropdownId) ||\n      dropdownIsValidParent(triggerElement, parentDropdown, dropdownId)\n    );\n  }\n}\n","import Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { element } from 'ember-element-helper';\nimport { or } from 'ember-truth-helpers';\nimport { concat } from '@ember/helper';\nimport basicDropdownTriggerModifier from '../modifiers/basic-dropdown-trigger.ts';\nimport { on } from '@ember/modifier';\nimport { fn } from '@ember/helper';\nimport type { Dropdown } from './basic-dropdown';\nimport type { HorizontalPosition, VerticalPosition } from '../types.ts';\n\nexport interface BasicDropdownTriggerSignature {\n  Element: HTMLElement | HTMLButtonElement;\n  Args: {\n    dropdown?: Dropdown;\n    eventType?: 'click' | 'mousedown';\n    stopPropagation?: boolean;\n    vPosition?: VerticalPosition | null;\n    hPosition?: HorizontalPosition | null;\n    defaultClass?: string;\n    renderInPlace?: boolean;\n    htmlTag?: keyof HTMLElementTagNameMap | undefined;\n    onBlur?: (dropdown?: Dropdown, event?: FocusEvent) => void;\n    onClick?: (dropdown?: Dropdown, event?: MouseEvent) => void;\n    onFocus?: (dropdown?: Dropdown, event?: FocusEvent) => void;\n    onFocusIn?: (dropdown?: Dropdown, event?: FocusEvent) => void;\n    onFocusOut?: (dropdown?: Dropdown, event?: FocusEvent) => void;\n    onKeyDown?: (dropdown?: Dropdown, event?: KeyboardEvent) => void;\n    onMouseDown?: (dropdown?: Dropdown, event?: MouseEvent) => void;\n    onMouseEnter?: (dropdown?: Dropdown, event?: MouseEvent) => void;\n    onMouseLeave?: (dropdown?: Dropdown, event?: MouseEvent) => void;\n    onTouchEnd?: (dropdown?: Dropdown, event?: TouchEvent) => void;\n  };\n  Blocks: {\n    default: [];\n  };\n}\n\nexport default class BasicDropdownTrigger extends Component<BasicDropdownTriggerSignature> {\n  // Actions\n  /**\n   * Allows similar behavior to `ember-composable-helpers`' `optional` helper.\n   * Avoids adding extra dependencies.\n   * Can be removed when the template `V1` compatibility event handlers are removed.\n   *\n   * @see https://github.com/cibernox/ember-basic-dropdown/issues/498\n   * @memberof BasicDropdownContent\n   */\n  noop(): void {}\n\n  @action\n  disableDocumentTextSelect(disable: boolean) {\n    if (disable) {\n      document.body.classList.add('ember-basic-dropdown-text-select-disabled');\n    } else {\n      document.body.classList.remove(\n        'ember-basic-dropdown-text-select-disabled',\n      );\n    }\n  }\n\n  <template>\n    {{#if @dropdown}}\n      {{#let (element (or @htmlTag \"div\")) as |OptionalTag|}}\n        {{! template-lint-disable no-pointer-down-event-binding }}\n        <OptionalTag\n          class=\"ember-basic-dropdown-trigger\n            {{if @renderInPlace ' ember-basic-dropdown-trigger--in-place'}}\n            {{if\n              @hPosition\n              (concat ' ember-basic-dropdown-trigger--' @hPosition)\n            }}\n            {{if\n              @vPosition\n              (concat ' ember-basic-dropdown-trigger--' @vPosition)\n            }}\n            {{@defaultClass}}\"\n          {{basicDropdownTriggerModifier\n            dropdown=@dropdown\n            eventType=@eventType\n            stopPropagation=@stopPropagation\n          }}\n          tabindex={{unless @dropdown.disabled \"0\"}}\n          ...attributes\n          {{on \"mousedown\" (fn this.disableDocumentTextSelect true)}}\n          {{on \"mouseup\" (fn this.disableDocumentTextSelect false)}}\n          {{! V1 compatibility - See #498 }}\n          {{on \"keydown\" (fn (or @onKeyDown this.noop) @dropdown)}}\n          {{on \"mousedown\" (fn (or @onMouseDown this.noop) @dropdown)}}\n          {{on \"touchend\" (fn (or @onTouchEnd this.noop) @dropdown)}}\n          {{on \"click\" (fn (or @onClick this.noop) @dropdown)}}\n          {{on \"mouseenter\" (fn (or @onMouseEnter this.noop) @dropdown)}}\n          {{on \"mouseleave\" (fn (or @onMouseLeave this.noop) @dropdown)}}\n          {{on \"focus\" (fn (or @onFocus this.noop) @dropdown)}}\n          {{on \"blur\" (fn (or @onBlur this.noop) @dropdown)}}\n          {{on \"focusin\" (fn (or @onFocusIn this.noop) @dropdown)}}\n          {{on \"focusout\" (fn (or @onFocusOut this.noop) @dropdown)}}\n        >\n          {{yield}}\n        </OptionalTag>\n      {{/let}}\n    {{/if}}\n  </template>\n}\n","import Component from '@glimmer/component';\nimport { getOwner } from '@ember/application';\nimport { config as utilConfig, _configSet, type Config } from '../config.ts';\nimport { deprecate } from '@ember/debug';\n\nexport interface BasicDropdownWormholeSignature {\n  Element: HTMLElement;\n}\n\nexport default class BasicDropdownWormholeComponent extends Component<BasicDropdownWormholeSignature> {\n  get getDestinationId(): string {\n    let config = utilConfig;\n\n    if (!_configSet) {\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n      const configEnvironment = getOwner(this).resolveRegistration(\n        'config:environment',\n      ) as {\n        'ember-basic-dropdown'?: Config;\n      };\n\n      if (configEnvironment['ember-basic-dropdown']) {\n        const legacyConfigString = JSON.stringify(\n          configEnvironment['ember-basic-dropdown'],\n        );\n        deprecate(\n          `You have configured \\`ember-basic-dropdown\\` in \\`ember-cli-build.js\\`. Remove that configuration and instead use \\`import { setConfig } from 'ember-basic-dropdown/config'; setConfig(${legacyConfigString});`,\n          false,\n          {\n            for: 'ember-basic-dropdown',\n            id: 'ember-basic-dropdown.config-environment',\n            since: {\n              enabled: '8.9',\n              available: '8.9',\n            },\n            until: '9.0.0',\n          },\n        );\n\n        config = configEnvironment['ember-basic-dropdown'];\n      }\n    }\n\n    return config.destination || 'ember-basic-dropdown-wormhole';\n  }\n\n  <template>\n    <div id={{this.getDestinationId}} ...attributes></div>\n  </template>\n}\n","import Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\nimport calculatePosition from '../utils/calculate-position.ts';\nimport type {\n  CalculatePosition,\n  CalculatePositionResult,\n  HorizontalPosition,\n  VerticalPosition,\n} from '../utils/calculate-position.ts';\nimport { getOwner } from '@ember/application';\nimport type Owner from '@ember/owner';\nimport { schedule } from '@ember/runloop';\nimport type { ComponentLike } from '@glint/template';\nimport type { BasicDropdownTriggerSignature } from './basic-dropdown-trigger.ts';\nimport type { BasicDropdownContentSignature } from './basic-dropdown-content.ts';\nimport { ensureSafeComponent } from '@embroider/util';\nimport { hash } from '@ember/helper';\nimport BasicDropdownTrigger from './basic-dropdown-trigger.gts';\nimport BasicDropdownContent from './basic-dropdown-content.gts';\nimport { or } from 'ember-truth-helpers';\nimport type {\n  Dropdown,\n  DropdownActions,\n  RepositionChanges,\n  TRootEventType,\n} from '../types.ts';\nimport { deprecate } from '@ember/debug';\nimport { isTesting } from '@embroider/macros';\nimport { config as utilConfig, _configSet, type Config } from '../config.ts';\n\n// To avoid breaking the current types export we need this\nexport type { Dropdown, DropdownActions, TRootEventType };\n\nconst UNINITIALIZED = {};\nconst IGNORED_STYLES = ['top', 'left', 'right', 'width', 'height'];\n\nexport interface BasicDropdownDefaultBlock {\n  uniqueId: string;\n  disabled: boolean;\n  isOpen: boolean;\n  actions: DropdownActions;\n  Trigger: ComponentLike<BasicDropdownTriggerSignature>;\n  Content: ComponentLike<BasicDropdownContentSignature>;\n}\n\nexport interface BasicDropdownSignature {\n  Element: HTMLElement;\n  Args: BasicDropdownArgs;\n  Blocks: {\n    default: [BasicDropdownDefaultBlock];\n  };\n}\n\nexport interface BasicDropdownArgs {\n  initiallyOpened?: boolean;\n  renderInPlace?: boolean;\n  verticalPosition?: VerticalPosition;\n  horizontalPosition?: HorizontalPosition;\n  destination?: string;\n  destinationElement?: HTMLElement;\n  disabled?: boolean;\n  dropdownId?: string;\n  rootEventType?: TRootEventType;\n  preventScroll?: boolean;\n  matchTriggerWidth?: boolean;\n  triggerHtmlTag?: keyof HTMLElementTagNameMap;\n  contentHtmlTag?: keyof HTMLElementTagNameMap;\n  onInit?: (dropdown: Dropdown) => void;\n  registerAPI?: (dropdown: Dropdown | null) => void;\n  onOpen?: (dropdown: Dropdown, e?: Event) => boolean | void;\n  onClose?: (dropdown: Dropdown, e?: Event) => boolean | void;\n  triggerComponent?:\n    | string\n    | ComponentLike<BasicDropdownTriggerSignature>\n    | undefined;\n  contentComponent?:\n    | string\n    | ComponentLike<BasicDropdownContentSignature>\n    | undefined;\n  calculatePosition?: CalculatePosition;\n}\n\nexport default class BasicDropdown extends Component<BasicDropdownSignature> {\n  @tracked hPosition: HorizontalPosition | null = null;\n  @tracked vPosition: VerticalPosition | null = null;\n  @tracked top: string | undefined;\n  @tracked left: string | undefined;\n  @tracked right: string | undefined;\n  @tracked width: string | undefined;\n  @tracked height: string | undefined;\n  @tracked otherStyles: Record<string, string | number | undefined> = {};\n  @tracked isOpen = this.args.initiallyOpened || false;\n  @tracked renderInPlace =\n    this.args.renderInPlace !== undefined ? this.args.renderInPlace : false;\n  private previousVerticalPosition?: VerticalPosition | undefined;\n  private previousHorizontalPosition?: HorizontalPosition | undefined;\n  private triggerElement: HTMLElement | null = null;\n  private dropdownElement: HTMLElement | null = null;\n\n  private _uid = guidFor(this);\n  private _dropdownId: string =\n    this.args.dropdownId || `ember-basic-dropdown-content-${this._uid}`;\n  private _previousDisabled = UNINITIALIZED;\n  private _actions: DropdownActions = {\n    open: this.open.bind(this),\n    close: this.close.bind(this),\n    toggle: this.toggle.bind(this),\n    reposition: this.reposition.bind(this),\n    registerTriggerElement: this.registerTriggerElement.bind(this),\n    registerDropdownElement: this.registerDropdownElement.bind(this),\n    getTriggerElement: () => this.triggerElement,\n  };\n\n  private get horizontalPosition() {\n    return this.args.horizontalPosition || 'auto'; // auto-right | right | center | left\n  }\n\n  private get verticalPosition() {\n    return this.args.verticalPosition || 'auto'; // above | below\n  }\n\n  get destination(): string {\n    return this.args.destination || this._getDestinationId();\n  }\n\n  get destinationElement(): HTMLElement | null {\n    if (this.args.destinationElement) {\n      return this.args.destinationElement;\n    }\n\n    const element = document.getElementById(this.destination);\n\n    if (element) {\n      return element;\n    }\n\n    if (\n      this.triggerElement &&\n      this.triggerElement.getRootNode() instanceof ShadowRoot\n    ) {\n      return (this.triggerElement.getRootNode() as HTMLElement)?.querySelector(\n        `#${this.destination}`,\n      );\n    }\n\n    return null;\n  }\n\n  get disabled(): boolean {\n    const newVal = this.args.disabled || false;\n    if (\n      this._previousDisabled !== UNINITIALIZED &&\n      this._previousDisabled !== newVal\n    ) {\n      // eslint-disable-next-line ember/no-runloop\n      schedule('actions', () => {\n        if (newVal && this.publicAPI.isOpen) {\n          // eslint-disable-next-line ember/no-side-effects\n          this.isOpen = false;\n        }\n        if (this.args.registerAPI) {\n          this.args.registerAPI(this.publicAPI);\n        }\n      });\n    }\n    // eslint-disable-next-line ember/no-side-effects\n    this._previousDisabled = newVal;\n    return newVal;\n  }\n\n  get publicAPI(): Dropdown {\n    return {\n      uniqueId: this._uid,\n      isOpen: this.isOpen,\n      disabled: this.disabled,\n      actions: this._actions,\n    };\n  }\n\n  // Lifecycle hooks\n  constructor(owner: Owner, args: BasicDropdownArgs) {\n    super(owner, args);\n    if (this.args.onInit) {\n      this.args.onInit(this.publicAPI);\n    }\n    if (this.args.registerAPI) {\n      this.args.registerAPI(this.publicAPI);\n    }\n\n    if (this.args.dropdownId !== undefined) {\n      deprecate(\n        'You have passed `@dropdownId` into `ember-basic-dropdown`. This property does not work correctly without custom modifiers and is undocumented. Remove this parameter and use the `uniqueId` property from the public API instead.',\n        false,\n        {\n          for: 'ember-basic-dropdown',\n          id: 'ember-basic-dropdown.deprecate-arg-dropdown-id',\n          since: {\n            enabled: '8.8',\n            available: '8.8',\n          },\n          until: '9.0.0',\n        },\n      );\n    }\n  }\n\n  override willDestroy(): void {\n    super.willDestroy();\n    if (this.args.registerAPI) {\n      this.args.registerAPI(null);\n    }\n  }\n\n  // Actions\n  @action\n  open(e?: Event): void {\n    if (this.isDestroyed) {\n      return;\n    }\n    if (this.publicAPI.disabled || this.publicAPI.isOpen) {\n      return;\n    }\n    if (this.args.onOpen && this.args.onOpen(this.publicAPI, e) === false) {\n      return;\n    }\n    this.isOpen = true;\n    if (this.args.registerAPI) {\n      this.args.registerAPI(this.publicAPI);\n    }\n    const trigger = this._getTriggerElement();\n    if (trigger) {\n      const parent = trigger.parentElement;\n      if (parent) {\n        parent.setAttribute('aria-owns', this._dropdownId);\n      }\n    }\n  }\n\n  @action\n  close(e?: Event, skipFocus?: boolean): void {\n    if (this.isDestroyed) {\n      return;\n    }\n    if (this.publicAPI.disabled || !this.publicAPI.isOpen) {\n      return;\n    }\n    if (this.args.onClose && this.args.onClose(this.publicAPI, e) === false) {\n      return;\n    }\n    if (this.isDestroyed) {\n      return; // To check that the `onClose` didn't destroy the dropdown\n    }\n    this.hPosition = this.vPosition = null;\n    this.top = this.left = this.right = this.width = this.height = undefined;\n    this.previousVerticalPosition = this.previousHorizontalPosition = undefined;\n    this.isOpen = false;\n    if (this.args.registerAPI) {\n      this.args.registerAPI(this.publicAPI);\n    }\n    const trigger = this._getTriggerElement();\n    if (!trigger) {\n      return;\n    }\n    const parent = trigger.parentElement;\n    if (parent) {\n      parent.removeAttribute('aria-owns');\n    }\n    if (skipFocus) {\n      return;\n    }\n    if (trigger.tabIndex > -1) {\n      trigger.focus();\n    }\n  }\n\n  @action\n  toggle(e?: Event): void {\n    if (this.publicAPI.isOpen) {\n      this.close(e);\n    } else {\n      this.open(e);\n    }\n  }\n\n  @action\n  reposition(): undefined | RepositionChanges {\n    if (!this.publicAPI.isOpen) {\n      return;\n    }\n    const dropdownElement = this._getDropdownElement();\n    const triggerElement = this._getTriggerElement();\n    if (!dropdownElement || !triggerElement || !this.destinationElement) {\n      return;\n    }\n\n    const {\n      horizontalPosition,\n      verticalPosition,\n      previousHorizontalPosition,\n      previousVerticalPosition,\n    } = this;\n    const { renderInPlace = false, matchTriggerWidth = false } = this.args;\n    const calculatePositionFn =\n      this.args.calculatePosition || calculatePosition;\n    const positionData = calculatePositionFn(\n      triggerElement,\n      dropdownElement,\n      this.destinationElement,\n      {\n        horizontalPosition,\n        verticalPosition,\n        previousHorizontalPosition,\n        previousVerticalPosition,\n        renderInPlace,\n        matchTriggerWidth,\n        dropdown: this,\n      },\n    );\n    return this.applyReposition(triggerElement, dropdownElement, positionData);\n  }\n\n  @action\n  registerTriggerElement(element: HTMLElement): void {\n    this.triggerElement = element;\n  }\n\n  @action\n  registerDropdownElement(element: HTMLElement): void {\n    this.dropdownElement = element;\n  }\n\n  applyReposition(\n    _trigger: Element,\n    dropdown: HTMLElement,\n    positions: CalculatePositionResult,\n  ): RepositionChanges {\n    const changes: RepositionChanges = {\n      hPosition: positions.horizontalPosition,\n      vPosition: positions.verticalPosition,\n      otherStyles: Object.assign({}, this.otherStyles),\n    };\n\n    if (positions.style) {\n      if (positions.style.top !== undefined) {\n        changes.top = `${positions.style.top}px`;\n      }\n      // The component can be aligned from the right or from the left, but not from both.\n      if (positions.style.left !== undefined) {\n        changes.left = `${positions.style.left}px`;\n        changes.right = undefined;\n        // Since we set the first run manually we may need to unset the `right` property.\n        if (positions.style.right !== undefined) {\n          positions.style.right = undefined;\n        }\n      } else if (positions.style.right !== undefined) {\n        changes.right = `${positions.style.right}px`;\n        changes.left = undefined;\n      }\n      if (positions.style.width !== undefined) {\n        changes.width = `${positions.style.width}px`;\n      }\n      if (positions.style.height !== undefined) {\n        changes.height = `${positions.style.height}px`;\n      }\n      if (this.top === undefined) {\n        // Bypass Ember on the first reposition only to avoid flickering.\n        for (const prop in positions.style) {\n          if (positions.style[prop] !== undefined) {\n            if (typeof positions.style[prop] === 'number') {\n              dropdown.style.setProperty(prop, `${positions.style[prop]}px`);\n            } else {\n              dropdown.style.setProperty(prop, `${positions.style[prop]}`);\n            }\n          }\n        }\n      }\n    }\n    for (const prop in positions.style) {\n      if (!IGNORED_STYLES.includes(prop)) {\n        changes.otherStyles[prop] = positions.style[prop];\n      }\n    }\n\n    this.hPosition = changes.hPosition;\n    this.vPosition = changes.vPosition;\n    this.top = changes.top;\n    this.left = changes.left;\n    this.right = changes.right;\n    this.width = changes.width;\n    this.height = changes.height;\n    this.otherStyles = changes.otherStyles;\n    this.previousHorizontalPosition = positions.horizontalPosition;\n    this.previousVerticalPosition = positions.verticalPosition;\n    return changes;\n  }\n\n  _getDestinationId(): string {\n    let config = utilConfig;\n\n    if (!_configSet) {\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n      const configEnvironment = getOwner(this).resolveRegistration(\n        'config:environment',\n      ) as {\n        APP: {\n          rootElement: string;\n        };\n        'ember-basic-dropdown': Config;\n      };\n\n      if (configEnvironment['ember-basic-dropdown']) {\n        const legacyConfigString = JSON.stringify(\n          configEnvironment['ember-basic-dropdown'],\n        );\n        deprecate(\n          `You have configured \\`ember-basic-dropdown\\` in \\`ember-cli-build.js\\`. Remove that configuration and instead use \\`import { setConfig } from 'ember-basic-dropdown/config'; setConfig(${legacyConfigString});`,\n          false,\n          {\n            for: 'ember-basic-dropdown',\n            id: 'ember-basic-dropdown.config-environment',\n            since: {\n              enabled: '8.9',\n              available: '8.9',\n            },\n            until: '9.0.0',\n          },\n        );\n\n        config = configEnvironment['ember-basic-dropdown'];\n      }\n\n      if (configEnvironment['APP']?.rootElement) {\n        deprecate(\n          `ember-basic-dropdown received the \\`APP.rootElement\\` value from \\`ember-cli-build.js\\`. You now need to pass this value using \\`import { setConfig } from 'ember-basic-dropdown/config'; setConfig({rootElement: config.APP['rootElement']});`,\n          false,\n          {\n            for: 'ember-basic-dropdown',\n            id: 'ember-basic-dropdown.config-environment',\n            since: {\n              enabled: '8.9',\n              available: '8.9',\n            },\n            until: '9.0.0',\n          },\n        );\n\n        config.rootElement = configEnvironment['APP']?.rootElement;\n      }\n    }\n\n    if (isTesting()) {\n      // document doesn't exist in fastboot apps, for this reason we need this check\n      if (typeof document === 'undefined') {\n        return 'ember-basic-dropdown-wormhole';\n      }\n\n      // check if destination exists in tests:\n      if (config.destination) {\n        const destination = config.destination;\n        if (document.getElementById(destination) !== null) {\n          return destination;\n        }\n      }\n\n      // check if default element exists in tests:\n      if (document.getElementById('ember-basic-dropdown-wormhole') !== null) {\n        return 'ember-basic-dropdown-wormhole';\n      }\n\n      // fall back to rootElement as destination\n      const rootElement = config.rootElement;\n      return (\n        (rootElement ? document.querySelector(rootElement)?.id : undefined) ??\n        'ember-basic-dropdown-wormhole'\n      );\n    }\n\n    return config.destination || 'ember-basic-dropdown-wormhole';\n  }\n\n  _getDropdownElement(): HTMLElement | null {\n    if (this.dropdownElement) {\n      return this.dropdownElement;\n    }\n\n    return document.querySelector(`[id=\"${this._dropdownId}\"]`);\n  }\n\n  _getTriggerElement(): HTMLElement | null {\n    if (this.triggerElement) {\n      return this.triggerElement;\n    }\n\n    return document.querySelector(\n      `[data-ebd-id=${this.publicAPI.uniqueId}-trigger]`,\n    );\n  }\n\n  get triggerComponent(): ComponentLike<BasicDropdownTriggerSignature> {\n    if (this.args.triggerComponent) {\n      return ensureSafeComponent(\n        this.args.triggerComponent,\n        this,\n      ) as ComponentLike<BasicDropdownTriggerSignature>;\n    }\n\n    return BasicDropdownTrigger as ComponentLike<BasicDropdownTriggerSignature>;\n  }\n\n  get contentComponent(): ComponentLike<BasicDropdownContentSignature> {\n    if (this.args.contentComponent) {\n      return ensureSafeComponent(\n        this.args.contentComponent,\n        this,\n      ) as ComponentLike<BasicDropdownContentSignature>;\n    }\n\n    return BasicDropdownContent as ComponentLike<BasicDropdownContentSignature>;\n  }\n\n  <template>\n    {{#let\n      (hash\n        uniqueId=this.publicAPI.uniqueId\n        isOpen=this.publicAPI.isOpen\n        disabled=this.publicAPI.disabled\n        actions=this.publicAPI.actions\n        Trigger=(component\n          this.triggerComponent\n          dropdown=this.publicAPI\n          hPosition=this.hPosition\n          renderInPlace=this.renderInPlace\n          vPosition=this.vPosition\n          htmlTag=@triggerHtmlTag\n        )\n        Content=(component\n          this.contentComponent\n          dropdown=this.publicAPI\n          hPosition=this.hPosition\n          renderInPlace=this.renderInPlace\n          preventScroll=@preventScroll\n          rootEventType=(or @rootEventType \"click\")\n          vPosition=this.vPosition\n          htmlTag=@contentHtmlTag\n          destination=this.destination\n          destinationElement=this.destinationElement\n          top=this.top\n          left=this.left\n          right=this.right\n          width=this.width\n          height=this.height\n          otherStyles=this.otherStyles\n        )\n      )\n      as |api|\n    }}\n      {{#if this.renderInPlace}}\n        <div class=\"ember-basic-dropdown\" ...attributes>{{yield api}}</div>\n      {{else}}\n        {{yield api}}\n      {{/if}}\n    {{/let}}\n  </template>\n}\n","export interface Config {\n  destination?: string;\n  rootElement?: string;\n}\n\nlet _config: Config = {};\n\n// This will be removed in next major, don't use this outside the package!\nlet _configSet = false;\n\nexport function setConfig(config: Config) {\n  _config = config;\n  _configSet = true;\n}\n\nexport { _config as config, _configSet };\n","import Modifier from 'ember-modifier';\nimport type { ArgsFor, PositionalArgs, NamedArgs } from 'ember-modifier';\nimport { assert } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { isDestroyed, registerDestructor } from '@ember/destroyable';\nimport hasMoved from '../utils/has-moved.ts';\nimport type Owner from '@ember/owner';\nimport type { Dropdown } from '../types.ts';\n\ninterface Signature {\n  Element: HTMLElement;\n  Args: {\n    Named: {\n      dropdown: Dropdown;\n      eventType?: 'click' | 'mousedown' | undefined;\n      stopPropagation?: boolean | undefined;\n      [named: string]: unknown;\n    };\n    Positional: unknown[];\n  };\n}\n\nexport default class DropdownTriggerModifier extends Modifier<Signature> {\n  didSetup = false;\n\n  triggerElement: HTMLElement | undefined;\n\n  toggleIsBeingHandledByTouchEvents: boolean = false;\n  touchMoveEvent: TouchEvent | undefined;\n\n  dropdown?: Dropdown;\n  desiredEventType!: string;\n  stopPropagation: boolean | undefined;\n\n  constructor(owner: Owner, args: ArgsFor<Signature>) {\n    super(owner, args);\n    registerDestructor(this, cleanup);\n  }\n\n  override modify(\n    element: HTMLElement,\n    positional: PositionalArgs<Signature>,\n    named: NamedArgs<Signature>,\n  ): void {\n    assert('must be provided dropdown object', named.dropdown);\n    this.dropdown = named.dropdown;\n    this.desiredEventType = named.eventType ?? 'click';\n    this.stopPropagation = named.stopPropagation;\n\n    if (!this.didSetup) {\n      this.setup(element);\n      this.didSetup = true;\n    }\n    this.update(element, positional, named);\n  }\n\n  setup(element: HTMLElement) {\n    // Keep a reference to the element for cleanup\n    this.triggerElement = element;\n    if (this.dropdown?.actions?.registerTriggerElement) {\n      this.dropdown.actions.registerTriggerElement(element);\n    }\n\n    if (!element.getAttribute('role')) element.setAttribute('role', 'button');\n\n    element.addEventListener('click', this.handleMouseEventBound);\n    element.addEventListener('mousedown', this.handleMouseEventBound);\n    element.addEventListener('keydown', this.handleKeyDownBound);\n    element.addEventListener('touchstart', this.handleTouchStartBound, {\n      passive: false,\n    });\n    element.addEventListener('touchend', this.handleTouchEndBound);\n  }\n\n  update(\n    element: HTMLElement,\n    _positional: PositionalArgs<Signature>,\n    named: NamedArgs<Signature>,\n  ) {\n    const { dropdown } = named;\n\n    element.setAttribute('data-ebd-id', `${dropdown.uniqueId}-trigger`);\n\n    if (element.getAttribute('aria-owns') === null) {\n      element.setAttribute(\n        'aria-owns',\n        `ember-basic-dropdown-content-${dropdown.uniqueId}`,\n      );\n    }\n\n    if (element.getAttribute('aria-controls') === null) {\n      element.setAttribute(\n        'aria-controls',\n        `ember-basic-dropdown-content-${dropdown.uniqueId}`,\n      );\n    }\n\n    element.setAttribute('aria-expanded', dropdown.isOpen ? 'true' : 'false');\n    element.setAttribute('aria-disabled', dropdown.disabled ? 'true' : 'false');\n  }\n\n  @action\n  handleMouseEvent(e: MouseEvent): void {\n    if (typeof document === 'undefined') return;\n    const { dropdown, desiredEventType, stopPropagation } = this;\n\n    if (isDestroyed(this) || !dropdown || dropdown.disabled) return;\n\n    const eventType = e.type;\n    const notLeftClick = e.button !== 0;\n    if (eventType !== desiredEventType || notLeftClick) return;\n\n    if (stopPropagation) e.stopPropagation();\n\n    if (this.toggleIsBeingHandledByTouchEvents) {\n      // Some devises have both touchscreen & mouse, and they are not mutually exclusive\n      // In those cases the touchdown handler is fired first, and it sets a flag to\n      // short-circuit the mouseup so the component is not opened and immediately closed.\n      this.toggleIsBeingHandledByTouchEvents = false;\n      return;\n    }\n    dropdown.actions.toggle(e);\n  }\n\n  @action\n  handleKeyDown(e: KeyboardEvent): void {\n    const disabled = this.dropdown?.disabled,\n      actions = this.dropdown?.actions;\n\n    if (disabled || !actions) return;\n    if (e.keyCode === 13) {\n      // Enter\n      actions.toggle(e);\n    } else if (e.keyCode === 32) {\n      // Space\n      e.preventDefault(); // prevents the space to trigger a scroll page-next\n      actions.toggle(e);\n    } else if (e.keyCode === 27) {\n      actions.close(e);\n    }\n  }\n\n  @action\n  handleTouchStart(): void {\n    document.addEventListener('touchmove', this.touchMoveHandlerBound);\n    if (this.triggerElement?.getRootNode() instanceof ShadowRoot) {\n      (this.triggerElement?.getRootNode() as HTMLElement).addEventListener(\n        'touchmove',\n        this.touchMoveHandlerBound,\n      );\n    }\n  }\n\n  @action\n  handleTouchEnd(e: TouchEvent): void {\n    this.toggleIsBeingHandledByTouchEvents = true;\n    const disabled = this.dropdown?.disabled,\n      actions = this.dropdown?.actions;\n\n    if ((e && e.defaultPrevented) || disabled || !actions) {\n      return;\n    }\n    if (!hasMoved(e, this.touchMoveEvent)) {\n      actions.toggle(e);\n    }\n    this.touchMoveEvent = undefined;\n    document.removeEventListener('touchmove', this.touchMoveHandlerBound);\n    // This next three lines are stolen from hammertime. This prevents the default\n    // behaviour of the touchend, but synthetically trigger a focus and a (delayed) click\n    // to simulate natural behaviour.\n    const target = (e.composedPath?.()[0] || e.target) as HTMLElement;\n    if (target !== null) {\n      target.focus();\n    }\n    setTimeout(function () {\n      if (!e.target) {\n        return;\n      }\n      try {\n        const event = document.createEvent('MouseEvents');\n        event.initMouseEvent(\n          'click',\n          true,\n          true,\n          window,\n          0,\n          0,\n          0,\n          0,\n          0,\n          false,\n          false,\n          false,\n          false,\n          0,\n          null,\n        );\n        e.target.dispatchEvent(event);\n      } catch {\n        const event = new Event('click');\n        e.target.dispatchEvent(event);\n      }\n    }, 0);\n    e.preventDefault();\n  }\n\n  @action\n  _touchMoveHandler(e: TouchEvent): void {\n    this.touchMoveEvent = e;\n    document.removeEventListener('touchmove', this.touchMoveHandlerBound);\n\n    if (this.triggerElement?.getRootNode() instanceof ShadowRoot) {\n      (this.triggerElement?.getRootNode() as HTMLElement).removeEventListener(\n        'touchmove',\n        this.touchMoveHandlerBound,\n      );\n    }\n  }\n\n  handleMouseEventBound = (e: MouseEvent) => this.handleMouseEvent(e);\n  handleKeyDownBound = (e: KeyboardEvent) => this.handleKeyDown(e);\n  handleTouchStartBound = () => this.handleTouchStart();\n  handleTouchEndBound = (e: TouchEvent) => this.handleTouchEnd(e);\n  touchMoveHandlerBound = (e: TouchEvent) => this._touchMoveHandler(e);\n}\n\nfunction cleanup(instance: DropdownTriggerModifier) {\n  const { triggerElement } = instance;\n  if (triggerElement) {\n    if (typeof document !== 'undefined')\n      document.removeEventListener('touchmove', instance.touchMoveHandlerBound);\n\n    if (triggerElement?.getRootNode() instanceof ShadowRoot) {\n      (triggerElement?.getRootNode() as HTMLElement).removeEventListener(\n        'touchmove',\n        instance.touchMoveHandlerBound,\n      );\n    }\n\n    triggerElement.removeEventListener('click', instance.handleMouseEventBound);\n    triggerElement.removeEventListener(\n      'mousedown',\n      instance.handleMouseEventBound,\n    );\n    triggerElement.removeEventListener('keydown', instance.handleKeyDownBound);\n    triggerElement.removeEventListener(\n      'touchstart',\n      instance.handleTouchStartBound,\n    );\n    triggerElement.removeEventListener(\n      'touchend',\n      instance.handleTouchEndBound,\n    );\n  }\n}\n","import type BasicDropdown from '../components/basic-dropdown.gts';\nimport type { VerticalPosition, HorizontalPosition } from '../types.ts';\n\n// To avoid breaking the current types export we need this\nexport type { VerticalPosition, HorizontalPosition };\n\nexport interface CalculatePositionOptions {\n  horizontalPosition: HorizontalPosition;\n  verticalPosition: VerticalPosition;\n  matchTriggerWidth: boolean;\n  previousHorizontalPosition?: HorizontalPosition | undefined;\n  previousVerticalPosition?: VerticalPosition | undefined;\n  renderInPlace: boolean;\n  dropdown: BasicDropdown;\n}\n\nexport type CalculatePositionResultStyle = {\n  top?: number | undefined;\n  left?: number | undefined;\n  right?: number | undefined;\n  width?: number | undefined;\n  height?: number | undefined;\n  [key: string]: string | number | undefined;\n};\n\nexport type CalculatePositionResult = {\n  horizontalPosition: HorizontalPosition;\n  verticalPosition: VerticalPosition;\n  style: CalculatePositionResultStyle;\n};\n\nexport type CalculatePosition = (\n  trigger: Element,\n  content: HTMLElement,\n  destination: HTMLElement,\n  options: CalculatePositionOptions,\n) => CalculatePositionResult;\n\nexport const calculateWormholedPosition: CalculatePosition = (\n  trigger,\n  content,\n  destination,\n  {\n    horizontalPosition,\n    verticalPosition,\n    matchTriggerWidth,\n    previousHorizontalPosition,\n    previousVerticalPosition,\n  },\n) => {\n  // Collect information about all the involved DOM elements\n  const scroll = { left: window.pageXOffset, top: window.pageYOffset };\n  let { left: triggerLeft, top: triggerTop } = trigger.getBoundingClientRect();\n  const { width: triggerWidth, height: triggerHeight } =\n    trigger.getBoundingClientRect();\n  const { height: dropdownHeight } = content.getBoundingClientRect();\n  let { width: dropdownWidth } = content.getBoundingClientRect();\n  const viewportWidth = document.body.clientWidth || window.innerWidth;\n  const style: CalculatePositionResultStyle = {};\n\n  // Apply containers' offset\n  let anchorElement = destination.parentNode as HTMLElement;\n\n  if (anchorElement instanceof ShadowRoot) {\n    anchorElement = anchorElement.host as HTMLElement;\n  }\n\n  let anchorPosition = window.getComputedStyle(anchorElement).position;\n  while (\n    anchorPosition !== 'relative' &&\n    anchorPosition !== 'absolute' &&\n    anchorElement.tagName.toUpperCase() !== 'BODY' &&\n    !(anchorElement.parentNode instanceof ShadowRoot)\n  ) {\n    anchorElement = anchorElement.parentNode as HTMLElement;\n    anchorPosition = window.getComputedStyle(anchorElement).position;\n  }\n  if (anchorPosition === 'relative' || anchorPosition === 'absolute') {\n    const rect = anchorElement.getBoundingClientRect();\n    triggerLeft = triggerLeft - rect.left;\n    triggerTop = triggerTop - rect.top;\n    const { offsetParent } = anchorElement;\n    if (offsetParent) {\n      triggerLeft -= offsetParent.scrollLeft;\n      triggerTop -= offsetParent.scrollTop;\n    }\n  }\n\n  // Calculate drop down width\n  dropdownWidth = matchTriggerWidth ? triggerWidth : dropdownWidth;\n  if (matchTriggerWidth) {\n    style.width = dropdownWidth;\n  }\n\n  /**\n   * Fixes bug where the dropdown always stays on the same position on the screen when\n   * the <body> is relatively positioned\n   */\n  const isBodyPositionRelative =\n    window.getComputedStyle(document.body).getPropertyValue('position') ===\n    'relative';\n\n  // Calculate horizontal position\n  let triggerLeftWithScroll = triggerLeft;\n\n  if (!isBodyPositionRelative) {\n    triggerLeftWithScroll += scroll.left;\n  }\n\n  if (horizontalPosition === 'auto' || horizontalPosition === 'auto-left') {\n    // Calculate the number of visible horizontal pixels if we were to place the\n    // dropdown on the left and right\n    const leftVisible =\n      Math.min(viewportWidth, triggerLeft + dropdownWidth) -\n      Math.max(0, triggerLeft);\n    const rightVisible =\n      Math.min(viewportWidth, triggerLeft + triggerWidth) -\n      Math.max(0, triggerLeft + triggerWidth - dropdownWidth);\n\n    if (dropdownWidth > leftVisible && rightVisible > leftVisible) {\n      // If the drop down won't fit left-aligned, and there is more space on the\n      // right than on the left, then force right-aligned\n      horizontalPosition = 'right';\n    } else if (dropdownWidth > rightVisible && leftVisible > rightVisible) {\n      // If the drop down won't fit right-aligned, and there is more space on\n      // the left than on the right, then force left-aligned\n      horizontalPosition = 'left';\n    } else {\n      // Keep same position as previous\n      horizontalPosition = previousHorizontalPosition || 'left';\n    }\n  } else if (horizontalPosition === 'auto-right') {\n    // Calculate the number of visible horizontal pixels if we were to place the\n    // dropdown on the left and right\n    const leftVisible =\n      Math.min(viewportWidth, triggerLeft + dropdownWidth) -\n      Math.max(0, triggerLeft);\n    const rightVisible =\n      Math.min(viewportWidth, triggerLeft + triggerWidth) -\n      Math.max(0, triggerLeft + triggerWidth - dropdownWidth);\n\n    if (dropdownWidth > rightVisible && leftVisible > rightVisible) {\n      // If the drop down won't fit right-aligned, and there is more space on the\n      // left than on the right, then force left-aligned\n      horizontalPosition = 'left';\n    } else if (dropdownWidth > leftVisible && rightVisible > leftVisible) {\n      // If the drop down won't fit left-aligned, and there is more space on\n      // the right than on the left, then force right-aligned\n      horizontalPosition = 'right';\n    } else {\n      // Keep same position as previous\n      horizontalPosition = previousHorizontalPosition || 'right';\n    }\n  }\n  if (horizontalPosition === 'right') {\n    style.right = viewportWidth - (triggerLeftWithScroll + triggerWidth);\n  } else if (horizontalPosition === 'center') {\n    style.left = triggerLeftWithScroll + (triggerWidth - dropdownWidth) / 2;\n  } else {\n    style.left = triggerLeftWithScroll;\n  }\n\n  // Calculate vertical position\n  let triggerTopWithScroll = triggerTop;\n\n  if (!isBodyPositionRelative) {\n    triggerTopWithScroll += scroll.top;\n  }\n\n  if (verticalPosition === 'above') {\n    style.top = triggerTopWithScroll - dropdownHeight;\n  } else if (verticalPosition === 'below') {\n    style.top = triggerTopWithScroll + triggerHeight;\n  } else {\n    const viewportBottom = scroll.top + window.innerHeight;\n    const enoughRoomBelow =\n      triggerTopWithScroll + triggerHeight + dropdownHeight < viewportBottom;\n    const enoughRoomAbove = triggerTop > dropdownHeight;\n\n    if (!enoughRoomBelow && !enoughRoomAbove) {\n      verticalPosition = 'below';\n    } else if (\n      previousVerticalPosition === 'below' &&\n      !enoughRoomBelow &&\n      enoughRoomAbove\n    ) {\n      verticalPosition = 'above';\n    } else if (\n      previousVerticalPosition === 'above' &&\n      !enoughRoomAbove &&\n      enoughRoomBelow\n    ) {\n      verticalPosition = 'below';\n    } else if (!previousVerticalPosition) {\n      verticalPosition = enoughRoomBelow ? 'below' : 'above';\n    } else {\n      verticalPosition = previousVerticalPosition;\n    }\n    style.top =\n      triggerTopWithScroll +\n      (verticalPosition === 'below' ? triggerHeight : -dropdownHeight);\n  }\n\n  return { horizontalPosition, verticalPosition, style };\n};\n\nexport const calculateInPlacePosition: CalculatePosition = (\n  trigger,\n  content,\n  _destination,\n  { horizontalPosition, verticalPosition },\n) => {\n  let dropdownRect;\n  const positionData: CalculatePositionResult = {\n    horizontalPosition: 'left',\n    verticalPosition: 'below',\n    style: {},\n  };\n  if (horizontalPosition === 'auto') {\n    const triggerRect = trigger.getBoundingClientRect();\n    dropdownRect = content.getBoundingClientRect();\n    const viewportRight = window.pageXOffset + window.innerWidth;\n    positionData.horizontalPosition =\n      triggerRect.left + dropdownRect.width > viewportRight ? 'right' : 'left';\n  } else if (horizontalPosition === 'center') {\n    const { width: triggerWidth } = trigger.getBoundingClientRect();\n    const { width: dropdownWidth } = content.getBoundingClientRect();\n    positionData.style = { left: (triggerWidth - dropdownWidth) / 2 };\n  } else if (horizontalPosition === 'auto-right') {\n    const triggerRect = trigger.getBoundingClientRect();\n    const dropdownRect = content.getBoundingClientRect();\n    positionData.horizontalPosition =\n      triggerRect.right > dropdownRect.width ? 'right' : 'left';\n  } else if (horizontalPosition === 'right') {\n    positionData.horizontalPosition = 'right';\n  }\n\n  if (verticalPosition === 'above') {\n    positionData.verticalPosition = verticalPosition;\n    dropdownRect = dropdownRect || content.getBoundingClientRect();\n    positionData.style.top = -dropdownRect.height;\n  } else {\n    positionData.verticalPosition = 'below';\n  }\n  return positionData;\n};\n\nexport function getScrollParent(element: Element) {\n  let style = window.getComputedStyle(element);\n  const excludeStaticParent = style.position === 'absolute';\n  const overflowRegex = /(auto|scroll)/;\n\n  if (style.position === 'fixed') return document.body;\n  for (\n    let parent: Element | null = element;\n    (parent = parent.parentElement);\n  ) {\n    style = window.getComputedStyle(parent);\n    if (excludeStaticParent && style.position === 'static') {\n      continue;\n    }\n    if (\n      overflowRegex.test(style.overflow + style.overflowY + style.overflowX)\n    ) {\n      return parent;\n    }\n  }\n\n  return document.body;\n}\nconst calculatePosition: CalculatePosition = (\n  trigger,\n  content,\n  destination,\n  options,\n) => {\n  if (options.renderInPlace) {\n    return calculateInPlacePosition(trigger, content, destination, options);\n  } else {\n    return calculateWormholedPosition(trigger, content, destination, options);\n  }\n};\n\nexport default calculatePosition;\n","export default function hasMoved(\n  endEvent: TouchEvent,\n  moveEvent?: TouchEvent,\n): boolean {\n  if (!moveEvent) {\n    return false;\n  }\n\n  if (\n    !endEvent.changedTouches?.[0] ||\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n    (moveEvent.changedTouches[0] as any).touchType !== 'stylus'\n  ) {\n    return true;\n  }\n\n  // Distinguish stylus scroll and tap: if touch \"distance\" < 5px, we consider it a tap\n  const horizontalDistance = Math.abs(\n    (moveEvent.changedTouches[0]?.pageX ?? 0) -\n      endEvent.changedTouches[0].pageX,\n  );\n  const verticalDistance = Math.abs(\n    (moveEvent.changedTouches[0]?.pageY ?? 0) -\n      endEvent.changedTouches[0].pageY,\n  );\n  return horizontalDistance >= 5 || verticalDistance >= 5;\n}\n","// https://github.com/zeppelin/ember-click-outside/issues/23\n\nconst proto = typeof Element !== 'undefined' ? Element.prototype : {};\nconst vendor =\n  proto.matches ||\n  proto.matchesSelector ||\n  proto.webkitMatchesSelector ||\n  proto.mozMatchesSelector ||\n  proto.msMatchesSelector ||\n  proto.oMatchesSelector;\n\nexport function matches(el, selector) {\n  if (!el || el.nodeType !== 1) return false;\n  if (vendor) return vendor.call(el, selector);\n  var nodes = el.parentNode.querySelectorAll(selector);\n  for (var i = 0; i < nodes.length; i++) {\n    if (nodes[i] == el) return true;\n  }\n  return false;\n}\n","import { matches } from './-private/matches-selector';\n\nexport function closest(element, selector) {\n  if (matches(element, selector)) {\n    return element;\n  }\n\n  while (element.parentNode) {\n    element = element.parentNode;\n\n    if (matches(element, selector)) {\n      return element;\n    }\n  }\n}\n\nexport const documentOrBodyContains = (element) => {\n  // https://github.com/zeppelin/ember-click-outside/issues/30\n  if (typeof document.contains === 'function') {\n    return document.contains(element);\n  } else {\n    return document.body.contains(element);\n  }\n};\n\nexport const ios = () => {\n  return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\n};\n","import { next, cancel } from '@ember/runloop';\nimport { registerDestructor } from '@ember/destroyable';\nimport Modifier from 'ember-modifier';\n\nimport { closest, documentOrBodyContains, ios } from '../utils';\n\nexport default class ClickOutsideModifier extends Modifier {\n  didSetup = false;\n  action = null;\n  capture = null;\n  eventHandler = null;\n  eventType = 'click';\n  exceptSelector = null;\n\n  cancelOutsideListenerSetup = null;\n\n  constructor() {\n    super(...arguments);\n    registerDestructor(this, this.cleanup);\n  }\n\n  modify(element, [action], { capture, eventType, exceptSelector }) {\n    if (!this.didSetup) {\n      if (ios()) {\n        document.body.style.cursor = 'pointer';\n      }\n\n      this.didSetup = true;\n    } else {\n      this._destroy();\n    }\n    this._init({\n      element,\n      action,\n      capture,\n      eventType,\n      exceptSelector,\n    });\n  }\n\n  cleanup = () => {\n    this._destroy();\n\n    if (ios()) {\n      document.body.style.cursor = '';\n    }\n  };\n\n  _init({ element, action, capture, eventType, exceptSelector }) {\n    if (!action) {\n      return;\n    }\n\n    this.action = action;\n    this.exceptSelector = exceptSelector;\n    this.capture = capture;\n\n    if (eventType) {\n      this.eventType = eventType;\n    }\n\n    this.eventHandler = this._createHandler(\n      element,\n      this.action,\n      this.exceptSelector\n    );\n    this.cancelOutsideListenerSetup = next(this, this._addClickOutsideListener);\n  }\n\n  _destroy() {\n    if (!this.action) {\n      return;\n    }\n\n    cancel(this.cancelOutsideListenerSetup);\n    this._removeClickOutsideListener();\n  }\n\n  _addClickOutsideListener() {\n    let { capture, eventHandler, eventType } = this;\n    document.addEventListener(eventType, eventHandler, { capture });\n  }\n\n  _removeClickOutsideListener() {\n    let { capture, eventHandler, eventType } = this;\n    document.removeEventListener(eventType, eventHandler, { capture });\n  }\n\n  _createHandler(element, action, exceptSelector) {\n    return (e) => {\n      if (exceptSelector && e.target && closest(e.target, exceptSelector)) {\n        return;\n      }\n\n      let path = e.path || (e.composedPath && e.composedPath());\n\n      if (path) {\n        path.includes(element) || action(e);\n      } else {\n        // Check if the click target still is in the DOM.\n        // If not, there is no way to know if it was inside the element or not.\n        let isRemoved = !e.target || !documentOrBodyContains(e.target);\n\n        // Check the element is found as a parent of the click target.\n        let isInside = element === e.target || element.contains(e.target);\n\n        if (!isRemoved && !isInside) {\n          action(e);\n        }\n      }\n    };\n  }\n}\n","import { get } from '@ember/object';\nimport { assert } from '@ember/debug';\n\nexport function taskHelperClosure(helperName, taskMethod, _args, hash) {\n  let task = _args[0];\n  let outerArgs = _args.slice(1);\n\n  return function (...innerArgs) {\n    if (!task || typeof task[taskMethod] !== 'function') {\n      assert(\n        `The first argument passed to the \\`${helperName}\\` helper should be a Task object (without quotes); you passed ${task}`,\n        false,\n      );\n      return;\n    }\n\n    if (hash && hash.value) {\n      let event = innerArgs.pop();\n      innerArgs.push(get(event, hash.value));\n    }\n\n    return task[taskMethod](...outerArgs, ...innerArgs);\n  };\n}\n","import { helper } from '@ember/component/helper';\nimport { assert } from '@ember/debug';\nimport { taskHelperClosure } from '../-private/helpers';\nimport type { Task } from '../index';\n\nconst CANCEL_REASON = \"the 'cancel-all' template helper was invoked\";\n\ntype CancelAllParams = [task: Task<any, any[]>];\n\nexport function cancelHelper(args: CancelAllParams) {\n  let cancelable = args[0];\n  if (!cancelable || typeof cancelable.cancelAll !== 'function') {\n    assert(\n      `The first argument passed to the \\`cancel-all\\` helper should be a Task or TaskGroup (without quotes); you passed ${cancelable}`,\n      false,\n    );\n  }\n\n  return taskHelperClosure('cancel-all', 'cancelAll', [\n    cancelable,\n    { reason: CANCEL_REASON },\n  ]);\n}\n\nexport default helper(cancelHelper);\n","import { helper } from '@ember/component/helper';\nimport { assert } from '@ember/debug';\nimport { taskHelperClosure } from '../-private/helpers';\nimport type { Task } from '../index';\n\nfunction maybeReportError(\n  onError: (error: unknown) => void | null | undefined,\n) {\n  return function (e: unknown) {\n    if (typeof onError === 'function') {\n      onError(e);\n    } else if (onError === null) {\n      // Do nothing\n    } else {\n      assert(\n        `The onError argument passed to the \\`perform\\` helper should be a function or null; you passed ${onError}`,\n        false,\n      );\n    }\n  };\n}\n\ntype PerformParams = [task: Task<any, any[]>, ...args: any[]];\n\nexport function performHelper(args: PerformParams, hash: any) {\n  let perform = taskHelperClosure('perform', 'perform', args, hash);\n\n  if (hash && typeof hash.onError !== 'undefined') {\n    return function (...innerArgs: any[]) {\n      try {\n        let taskInstance = perform(...innerArgs);\n        return taskInstance.catch(maybeReportError(hash.onError));\n        // eslint-disable-next-line no-empty\n      } catch {\n        maybeReportError(hash.onError);\n      }\n    };\n  } else {\n    return perform;\n  }\n}\n\nexport default helper(performHelper);\n","import { helper } from '@ember/component/helper';\nimport type { Task } from '../index';\n\ntype TaskParams = [task: Task<any, any[]>, ...args: any[]];\n\nfunction taskHelper(positional: TaskParams) {\n  let [task, ...args] = positional;\n\n  // @ts-expect-errors _curry isn't typed yet\n  return task._curry(...args);\n}\n\nexport default helper(taskHelper);\n","export class Environment {\n  assert() {}\n\n  async(callback) {\n    Promise.resolve().then(callback);\n  }\n\n  reportUncaughtRejection() {\n    this.async((error) => {\n      throw error;\n    });\n  }\n\n  defer() {\n    let deferable = {\n      promise: null,\n      resolve: null,\n      reject: null,\n    };\n\n    let promise = new Promise((resolve, reject) => {\n      deferable.resolve = resolve;\n      deferable.reject = reject;\n    });\n\n    deferable.promise = promise;\n\n    return deferable;\n  }\n\n  globalDebuggingEnabled() {\n    return false;\n  }\n}\n\nexport const DEFAULT_ENVIRONMENT = new Environment();\n","import Ember from 'ember';\nimport { defer } from 'rsvp';\nimport { Environment } from './external/environment';\nimport { assert } from '@ember/debug';\nimport { join, next, schedule } from '@ember/runloop';\n\nexport class EmberEnvironment extends Environment {\n  assert(...args) {\n    assert(...args);\n  }\n\n  async(callback) {\n    join(() => schedule('actions', callback));\n  }\n\n  reportUncaughtRejection(error) {\n    next(null, function () {\n      if (Ember.onerror) {\n        Ember.onerror(error);\n      } else {\n        throw error;\n      }\n    });\n  }\n\n  defer() {\n    return defer();\n  }\n\n  globalDebuggingEnabled() {\n    return Ember.ENV.DEBUG_TASKS;\n  }\n}\n\nexport const EMBER_ENVIRONMENT = new EmberEnvironment();\n","export const cancelableSymbol = '__ec_cancel__';\nexport const yieldableSymbol = '__ec_yieldable__';\nexport const YIELDABLE_CONTINUE = 'next';\nexport const YIELDABLE_THROW = 'throw';\nexport const YIELDABLE_RETURN = 'return';\nexport const YIELDABLE_CANCEL = 'cancel';\n\n/**\n * @class YieldableState\n * @hideconstructor\n */\nclass YieldableState {\n  constructor(taskInstance, resumeIndex) {\n    this._taskInstance = taskInstance;\n    this._resumeIndex = resumeIndex;\n  }\n\n  /**\n   * Return yielded TaskInstance. Useful for introspection on instance state.\n   * @method getTaskInstance\n   * @memberof YieldableState\n   * @public\n   * @instance\n   */\n  getTaskInstance() {\n    return this._taskInstance;\n  }\n\n  /**\n   * Cancel the yielded TaskInstance.\n   * @method cancel\n   * @memberof YieldableState\n   * @public\n   * @instance\n   */\n  cancel() {\n    let taskInstance = this._taskInstance;\n    taskInstance.proceed.call(\n      taskInstance,\n      this._resumeIndex,\n      YIELDABLE_CANCEL,\n    );\n  }\n\n  /**\n   * Cause the TaskInstance to return from its yield with an optional value,\n   * and continue executing.\n   * @method next\n   * @memberof YieldableState\n   * @param value\n   * @public\n   * @instance\n   */\n  next(value) {\n    let taskInstance = this._taskInstance;\n    taskInstance.proceed.call(\n      taskInstance,\n      this._resumeIndex,\n      YIELDABLE_CONTINUE,\n      value,\n    );\n  }\n\n  /**\n   * Short-circuit TaskInstance execution and have it return with an optional\n   * value.\n   * @method return\n   * @memberof YieldableState\n   * @param value\n   * @public\n   * @instance\n   */\n  return(value) {\n    let taskInstance = this._taskInstance;\n    taskInstance.proceed.call(\n      taskInstance,\n      this._resumeIndex,\n      YIELDABLE_RETURN,\n      value,\n    );\n  }\n\n  /**\n   * Raise a given error within the given task instance and halt execution\n   * @method throw\n   * @memberof YieldableState\n   * @param error\n   * @public\n   * @instance\n   */\n  throw(error) {\n    let taskInstance = this._taskInstance;\n    taskInstance.proceed.call(\n      taskInstance,\n      this._resumeIndex,\n      YIELDABLE_THROW,\n      error,\n    );\n  }\n}\n\n/**\n * Yieldables are a primitive for building safe, cancelation-aware ways to\n * instrument and introspect the runtime of a task. Many Yieldables are built-in\n * to ember-concurrency today, such as `timeout`, `animationFrame`, and\n * `rawTimeout`.\n *\n * For example, if I wanted to implement a yieldable for `requestIdleCallback`,\n * I could do the following:\n *\n * ```javascript\n * import Component from '@glimmer/component';\n * import { task, Yieldable } from 'ember-concurrency';\n *\n * class IdleCallbackYieldable extends Yieldable {\n *   onYield(state) {\n *     let callbackId = requestIdleCallback(() => state.next());\n *\n *     return () => cancelIdleCallback(callbackId);\n *   }\n * }\n *\n * const idleCallback = () => new IdleCallbackYieldable();\n *\n * class MyComponent extends Component {\n *   &#64;task *backgroundTask() {\n *     while (1) {\n *       yield idleCallback();\n *\n *       const data = this.complicatedNumberCrunching();\n *       yield this.sendData(data);\n *     }\n *   }\n * }\n * ```\n *\n * In general, `Yieldable` instances **should** be reusable across calls, and thus\n * care should be taken to ensure that teardown is provided and state not\n * intended to be shared across calls stay inside `onYield`.\n *\n * `Yieldable` also provides automatic Promise-casting.\n *\n * <style>\n *   .ignore-this--this-is-here-to-hide-constructor,\n *   #Yieldable { display: none }\n * </style>\n *\n * @class Yieldable\n */\nexport class Yieldable {\n  constructor() {\n    this[yieldableSymbol] = this[yieldableSymbol].bind(this);\n  }\n\n  /**\n   * Defines what happens when the task encounters `yield myYieldable` and returns\n   * a disposer function that handles any cleanup.\n   *\n   * The state parameter is provided by the runtime, and provides operations for\n   * interacting with the yielding task instance and advancing, returning,\n   * throwing, or canceling its execution.\n   *\n   * @method onYield\n   * @memberof Yieldable\n   * @param {YieldableState} state\n   * @instance\n   * @public\n   */\n  onYield() {}\n\n  _deferable() {\n    let def = { resolve: undefined, reject: undefined };\n\n    def.promise = new Promise((resolve, reject) => {\n      def.resolve = resolve;\n      def.reject = reject;\n    });\n\n    return def;\n  }\n\n  _toPromise() {\n    let def = this._deferable();\n\n    let thinInstance = {\n      proceed(_index, resumeType, value) {\n        if (\n          resumeType == YIELDABLE_CONTINUE ||\n          resumeType == YIELDABLE_RETURN\n        ) {\n          def.resolve(value);\n        } else {\n          def.reject(value);\n        }\n      },\n    };\n\n    let maybeDisposer = this[yieldableSymbol](thinInstance, 0);\n    def.promise[cancelableSymbol] = maybeDisposer;\n\n    return def.promise;\n  }\n\n  /**\n   * Returns a promise that resolves with the value yielded back to or returned\n   * to the yielded task, or rejects with either the exception thrown from the\n   * Yieldable, or an error with a `.name` property with value `\"TaskCancelation\"`.\n   *\n   * @method then\n   * @memberof Yieldable\n   * @instance\n   * @return {Promise}\n   */\n  then(...args) {\n    return this._toPromise().then(...args);\n  }\n\n  /**\n   * @method catch\n   * @memberof Yieldable\n   * @instance\n   * @return {Promise}\n   */\n  catch(...args) {\n    return this._toPromise().catch(...args);\n  }\n\n  /**\n   * @method finally\n   * @memberof Yieldable\n   * @instance\n   * @return {Promise}\n   */\n  finally(...args) {\n    return this._toPromise().finally(...args);\n  }\n\n  [yieldableSymbol](taskInstance, resumeIndex) {\n    let state = new YieldableState(taskInstance, resumeIndex);\n\n    return this.onYield(state);\n  }\n}\n\nclass AnimationFrameYieldable extends Yieldable {\n  onYield(state) {\n    let timerId = requestAnimationFrame(() => state.next());\n\n    return () => cancelAnimationFrame(timerId);\n  }\n}\n\nclass ForeverYieldable extends Yieldable {\n  onYield() {}\n}\n\nclass RawTimeoutYieldable extends Yieldable {\n  constructor(ms) {\n    super();\n    this.ms = ms;\n  }\n\n  onYield(state) {\n    let timerId = setTimeout(() => state.next(), this.ms);\n\n    return () => clearTimeout(timerId);\n  }\n}\n\n/**\n * Yielding `animationFrame()` will pause a task until after the next animation\n * frame using the native `requestAnimationFrame()` browser API.\n *\n * The task below, when performed, will print the time since the last loop run\n * for every animation frame.\n *\n * ```js\n * export default class MyComponent extends Component {\n *   &#64;task *myTask() {\n *     let lastNow = performance.now();\n *     while (true) {\n *       yield animationFrame();\n *\n *       let now = performance.now();\n *       let dt = now - lastNow;\n *       lastNow = now;\n *\n *       console.log(dt);\n *     }\n *   }\n * }\n * ```\n */\nexport function animationFrame() {\n  return new AnimationFrameYieldable();\n}\n\n/**\n *\n * Yielding `forever` will pause a task indefinitely until\n * it is cancelled (i.e. via host object destruction, the restartable modifier,\n * or manual cancellation).\n *\n * This is often useful in cases involving animation: if you're\n * using Liquid Fire, or some other animation scheme, sometimes you'll\n * notice buttons visibly reverting to their inactive states during\n * a route transition. By yielding `forever` in a Component task that drives a\n * button's active state, you can keep a task indefinitely running\n * until the animation runs to completion.\n *\n * NOTE: Liquid Fire also includes a useful `waitUntilIdle()` method\n * on the `liquid-fire-transitions` service that you can use in a lot\n * of these cases, but it won't cover cases of asynchrony that are\n * unrelated to animation, in which case `forever` might be better suited\n * to your needs.\n *\n * ```js\n * import { task, forever } from 'ember-concurrency';\n * export default class MyComponent extends Component {\n *   &#64;service myService;\n *   &#64;task *myTask() {\n *     yield this.myService.doSomethingThatCausesATransition();\n *     yield forever;\n *   }\n * }\n * ```\n */\nexport const forever = new ForeverYieldable();\n\n/**\n *\n * Yielding `rawTimeout(ms)` will pause a task for the duration\n * of time passed in, in milliseconds.\n *\n * The timeout will use the native `setTimeout()` browser API,\n * instead of the Ember runloop, which means that test helpers\n * will *not* wait for it to complete.\n *\n * The task below, when performed, will print a message to the\n * console every second.\n *\n * ```js\n * export default class MyComponent extends Component {\n *   &#64;task *myTask() {\n *     while (true) {\n *       console.log(\"Hello!\");\n *       yield rawTimeout(1000);\n *     }\n *   }\n * }\n * ```\n *\n * @param {number} ms - the amount of time to sleep before resuming\n *   the task, in milliseconds\n */\nexport function rawTimeout(ms) {\n  return new RawTimeoutYieldable(ms);\n}\n","import { later, cancel } from '@ember/runloop';\nimport { EMBER_ENVIRONMENT } from './ember-environment';\nimport { Yieldable } from './external/yieldables';\n\nexport function isEventedObject(c) {\n  return (\n    c &&\n    ((typeof c.one === 'function' && typeof c.off === 'function') ||\n      (typeof c.on === 'function' && typeof c.off === 'function') ||\n      (typeof c.addEventListener === 'function' &&\n        typeof c.removeEventListener === 'function'))\n  );\n}\n\nexport class EmberYieldable extends Yieldable {\n  _deferable() {\n    return EMBER_ENVIRONMENT.defer();\n  }\n}\n\nclass TimeoutYieldable extends EmberYieldable {\n  constructor(ms) {\n    super();\n    this.ms = ms;\n  }\n\n  onYield(state) {\n    let timerId = later(() => state.next(), this.ms);\n\n    return () => cancel(timerId);\n  }\n}\n\n/**\n *\n * Yielding `timeout(ms)` will pause a task for the duration\n * of time passed in, in milliseconds.\n *\n * This timeout will be scheduled on the Ember runloop, which\n * means that test helpers will wait for it to complete before\n * continuing with the test. See `rawTimeout()` if you need\n * different behavior.\n *\n * The task below, when performed, will print a message to the\n * console every second.\n *\n * ```js\n * export default class MyComponent extends Component {\n *   &#64;task *myTask() {\n *     while (true) {\n *       console.log(\"Hello!\");\n *       yield timeout(1000);\n *     }\n *   }\n * }\n * ```\n *\n * @param {number} ms - the amount of time to sleep before resuming\n *   the task, in milliseconds\n */\nexport function timeout(ms) {\n  return new TimeoutYieldable(ms);\n}\n\nexport function deprecatePrivateModule(moduleName) {\n  // eslint-disable-next-line no-console\n  console.warn(\n    `an Ember addon is importing a private ember-concurrency module '${moduleName}' that has moved`,\n  );\n}\n","class BoundedPolicy {\n  constructor(maxConcurrency) {\n    this.maxConcurrency = maxConcurrency || 1;\n  }\n}\n\nexport default BoundedPolicy;\n","export const TYPE_CANCELLED = 'CANCELLED';\nexport const TYPE_STARTED = 'STARTED';\nexport const TYPE_QUEUED = 'QUEUED';\n\nexport const STARTED = { type: TYPE_STARTED };\nexport const QUEUED = { type: TYPE_QUEUED };\n\nexport const makeCancelState = (reason) => ({ type: TYPE_CANCELLED, reason });\n","import BoundedPolicy from './bounded-policy';\nimport { makeCancelState, STARTED } from './execution-states';\n\nconst CANCELLED = makeCancelState(\n  `it belongs to a 'drop' Task that was already running`,\n);\n\nclass DropReducer {\n  constructor(remainingSlots) {\n    this.remainingSlots = remainingSlots;\n  }\n\n  step() {\n    if (this.remainingSlots > 0) {\n      this.remainingSlots--;\n      return STARTED;\n    }\n\n    return CANCELLED;\n  }\n}\n\nclass DropPolicy extends BoundedPolicy {\n  makeReducer() {\n    return new DropReducer(this.maxConcurrency);\n  }\n}\n\nexport default DropPolicy;\n","import BoundedPolicy from './bounded-policy';\nimport { STARTED, QUEUED } from './execution-states';\n\nclass EnqueuedReducer {\n  constructor(remainingSlots) {\n    this.remainingSlots = remainingSlots;\n  }\n\n  step() {\n    if (this.remainingSlots > 0) {\n      this.remainingSlots--;\n      return STARTED;\n    } else {\n      return QUEUED;\n    }\n  }\n}\n\nclass EnqueuedPolicy extends BoundedPolicy {\n  makeReducer() {\n    return new EnqueuedReducer(this.maxConcurrency);\n  }\n}\n\nexport default EnqueuedPolicy;\n","import BoundedPolicy from './bounded-policy';\nimport { STARTED, QUEUED, makeCancelState } from './execution-states';\n\nconst CANCELLED = makeCancelState(\n  `it belongs to a 'keepLatest' Task that was already running`,\n);\n\n// Given:\n// - started tasks: [a,b,_]\n// - queued tasks:  [c,d,e,f]\n// KeepLatest will cancel all but the last queued task instance, producing:\n// - started tasks: [a,b,c]\n// - queued tasks: [f]\n\n// TODO: perhaps we should expose another config for the number to keep enqueued.\n//       this would also make sense for enqueued, e.g. perform a max of maxConcurrency\n//       concurrent task instances, but after a number of queued instances has been\n//       reached, they should be cancelled.\n\nclass KeepLatestReducer {\n  constructor(remainingSlots, numToCancel) {\n    this.remainingSlots = remainingSlots;\n    this.numToCancel = numToCancel;\n  }\n\n  step() {\n    if (this.remainingSlots > 0) {\n      this.remainingSlots--;\n      return STARTED;\n    } else {\n      if (this.numToCancel > 0) {\n        this.numToCancel--;\n        return CANCELLED;\n      } else {\n        return QUEUED;\n      }\n    }\n  }\n}\n\nclass KeepLatestPolicy extends BoundedPolicy {\n  makeReducer(numRunning, numQueued) {\n    let maxEnqueued = 1;\n    let totalRunning = numRunning + numQueued;\n    return new KeepLatestReducer(\n      this.maxConcurrency,\n      totalRunning - this.maxConcurrency - maxEnqueued,\n    );\n  }\n}\n\nexport default KeepLatestPolicy;\n","import BoundedPolicy from './bounded-policy';\nimport { STARTED, makeCancelState } from './execution-states';\n\nconst CANCELLED = makeCancelState(\n  `it belongs to a 'restartable' Task that was .perform()ed again`,\n);\n\nclass RestartableReducer {\n  constructor(numToCancel) {\n    this.numToCancel = numToCancel;\n  }\n\n  step() {\n    if (this.numToCancel > 0) {\n      this.numToCancel--;\n      return CANCELLED;\n    } else {\n      return STARTED;\n    }\n  }\n}\n\nclass RestartablePolicy extends BoundedPolicy {\n  makeReducer(numRunning, numQueued) {\n    return new RestartableReducer(numRunning + numQueued - this.maxConcurrency);\n  }\n}\n\nexport default RestartablePolicy;\n","import Ember from 'ember';\n\nimport { computed } from '@ember/object';\n\nimport DropSchedulerPolicy from './external/scheduler/policies/drop-policy';\nimport EnqueueSchedulerPolicy from './external/scheduler/policies/enqueued-policy';\nimport KeepLatestSchedulerPolicy from './external/scheduler/policies/keep-latest-policy';\nimport RestartableSchedulerPolicy from './external/scheduler/policies/restartable-policy';\n\nexport let taskFactorySymbol = '__ec_task_factory';\n\nexport const propertyModifiers = {\n  /**\n   * Configures the task to cancel old currently task instances\n   * to make room for a new one to perform. Sets default\n   * maxConcurrency to 1.\n   *\n   * [See the Live Example](/docs/examples/route-tasks/1)\n   *\n   * @method restartable\n   * @memberof TaskProperty\n   * @instance\n   */\n  restartable() {\n    this[taskFactorySymbol].setBufferPolicy(RestartableSchedulerPolicy);\n    return this;\n  },\n\n  /**\n   * Configures the task to run task instances one-at-a-time in\n   * the order they were `.perform()`ed. Sets default\n   * maxConcurrency to 1.\n   *\n   * @method enqueue\n   * @memberof TaskProperty\n   * @instance\n   */\n  enqueue() {\n    this[taskFactorySymbol].setBufferPolicy(EnqueueSchedulerPolicy);\n    return this;\n  },\n\n  /**\n   * Configures the task to immediately cancel (i.e. drop) any\n   * task instances performed when the task is already running\n   * at maxConcurrency. Sets default maxConcurrency to 1.\n   *\n   * @method drop\n   * @memberof TaskProperty\n   * @instance\n   */\n  drop() {\n    this[taskFactorySymbol].setBufferPolicy(DropSchedulerPolicy);\n    return this;\n  },\n\n  /**\n   * Configures the task to drop all but the most recently\n   * performed {@linkcode TaskInstance }.\n   *\n   * @method keepLatest\n   * @memberof TaskProperty\n   * @instance\n   */\n  keepLatest() {\n    this[taskFactorySymbol].setBufferPolicy(KeepLatestSchedulerPolicy);\n    return this;\n  },\n\n  /**\n   * Sets the maximum number of task instances that are allowed\n   * to run at the same time. By default, with no task modifiers\n   * applied, this number is Infinity (there is no limit\n   * to the number of tasks that can run at the same time).\n   * {@linkcode TaskProperty#restartable .restartable},\n   * {@linkcode TaskProperty#enqueue .enqueue}, and\n   * {@linkcode TaskProperty#drop .drop} set the default\n   * maxConcurrency to 1, but you can override this value\n   * to set the maximum number of concurrently running tasks\n   * to a number greater than 1.\n   *\n   * [See the AJAX Throttling example](/docs/examples/ajax-throttling)\n   *\n   * The example below uses a task with `maxConcurrency(3)` to limit\n   * the number of concurrent AJAX requests (for anyone using this task)\n   * to 3.\n   *\n   * ```js\n   * doSomeAjax = task(async (url) => {\n   *   return fetch(url);\n   * }).maxConcurrency(3);\n   *\n   * elsewhere() {\n   *   this.doSomeAjax.perform(\"http://www.example.com/json\");\n   * }\n   * ```\n   *\n   * @method maxConcurrency\n   * @memberof TaskProperty\n   * @param {Number} n The maximum number of concurrently running tasks\n   * @instance\n   */\n  maxConcurrency(n) {\n    this[taskFactorySymbol].setMaxConcurrency(n);\n    return this;\n  },\n\n  /**\n   * Adds this task to a TaskGroup so that concurrency constraints\n   * can be shared between multiple tasks.\n   *\n   * [See the Task Group docs for more information](/docs/task-groups)\n   *\n   * @method group\n   * @memberof TaskProperty\n   * @param {String} groupPath A path to the TaskGroup property\n   * @instance\n   */\n  group(taskGroupPath) {\n    this[taskFactorySymbol].setGroup(taskGroupPath);\n    return this;\n  },\n\n  /**\n   * Activates lifecycle events, allowing Evented host objects to react to task state\n   * changes.\n   *\n   * ```js\n   * import Component from '@glimmer/component';\n   * import { task } from 'ember-concurrency';\n   * import { on } from '@ember/object/evented';\n   *\n   * export default class MyComponent extends Component {\n   *   uploadTask = task(async (file) => {\n   *     // ... file upload stuff\n   *   }).evented();\n   *\n   *   @on('uploadTask:started')\n   *   uploadedStarted(taskInstance) {\n   *     this.analytics.track(\"User Photo: upload started\");\n   *   }\n   * }\n   * ```\n   *\n   * @method evented\n   * @memberof TaskProperty\n   * @instance\n   */\n  evented() {\n    this[taskFactorySymbol].setEvented(true);\n    return this;\n  },\n\n  /**\n   * Logs lifecycle events to aid in debugging unexpected Task behavior.\n   * Presently only logs cancelation events and the reason for the cancelation,\n   * e.g. \"TaskInstance 'doStuff' was canceled because the object it lives on was destroyed or unrendered\"\n   *\n   * @method debug\n   * @memberof TaskProperty\n   * @instance\n   */\n  debug() {\n    this[taskFactorySymbol].setDebug(true);\n    return this;\n  },\n\n  /**\n   * Configures the task to call the passed in callback for derived state updates,\n   * overriding the default derived state tracking. You may call with `null` to\n   * completely opt-out of derived state tracking.\n   *\n   * @method onState\n   * @memberof TaskProperty\n   * @param {function?} callback Callback to be called. Receives an object argument with the new state.\n   * @instance\n   */\n  onState(callback) {\n    this[taskFactorySymbol].setOnState(callback);\n    return this;\n  },\n};\n\n/**\n  A {@link TaskProperty} is the Computed Property-like object returned\n  from the {@linkcode task} function. You can call Task Modifier methods\n  on this object to configure the behavior of the {@link Task}.\n\n  See [Managing Task Concurrency](/docs/task-concurrency) for an\n  overview of all the different task modifiers you can use and how\n  they impact automatic cancelation / enqueueing of task instances.\n\n  {@link TaskProperty} is only used for supporting \"classic\" Ember objects.\n  When using Native JavaScript or TypeScript classes, you will use [task decorators](/docs/task-decorators)\n  on methods instead.\n\n  @class TaskProperty\n*/\nexport class TaskProperty {}\nexport class TaskGroupProperty {}\n\nObject.assign(TaskGroupProperty.prototype, propertyModifiers);\nObject.assign(TaskProperty.prototype, propertyModifiers, {\n  setup(proto, key) {\n    if (this.callSuperSetup) {\n      this.callSuperSetup(...arguments);\n    }\n\n    this[taskFactorySymbol].setName(key);\n    this[taskFactorySymbol]._setupEmberKVO(proto);\n  },\n\n  /**\n   * Calling `task(...).on(eventName)` configures the task to be\n   * automatically performed when the specified events fire. In\n   * this way, it behaves like\n   * [Ember.on](http://emberjs.com/api/classes/Ember.html#method_on).\n   *\n   * You can use `task(...).on('init')` to perform the task\n   * when the host object is initialized.\n   *\n   * ```js\n   * import Component from '@glimmer/component';\n   * import { task } from 'ember-concurrency';\n   *\n   * export default class MyComponent extends Component {\n   *   pollForUpdates = task(async () => {\n   *     // ... this runs when the Component is first created\n   *     // because we specified .on('init')\n   *   }).on('init');\n   *\n   *   handleFoo = task(async (a, b, c) => {\n   *     // this gets performed automatically if the 'foo'\n   *     // event fires on this Component,\n   *     // e.g., if someone called component.trigger('foo')\n   *   }).on('foo');\n   * }\n   * ```\n   *\n   * @method on\n   * @memberof TaskProperty\n   * @param {String} eventNames*\n   * @instance\n   */\n  on() {\n    this[taskFactorySymbol].addPerformEvents(...arguments);\n    return this;\n  },\n\n  /**\n   * This behaves like the {@linkcode TaskProperty#on task(...).on() modifier},\n   * but instead will cause the task to be canceled if any of the\n   * specified events fire on the parent object.\n   *\n   * [See the Live Example](/docs/examples/route-tasks/1)\n   *\n   * @method cancelOn\n   * @memberof TaskProperty\n   * @param {String} eventNames*\n   * @instance\n   */\n  cancelOn() {\n    this[taskFactorySymbol].addCancelEvents(...arguments);\n    return this;\n  },\n\n  /**\n   * This behaves like the {@linkcode TaskProperty#on task(...).on() modifier},\n   * but instead will cause the task to be performed if any of the\n   * specified properties on the parent object change.\n   *\n   * @method observes\n   * @memberof TaskProperty\n   * @param {String} keys*\n   * @instance\n   */\n  observes() {\n    this[taskFactorySymbol].addObserverKeys(...arguments);\n    return this;\n  },\n});\n\nconst setDecorator = Ember._setClassicDecorator;\nexport function taskComputed(fn) {\n  let cp = function (proto, key) {\n    if (cp.setup !== undefined) {\n      cp.setup(proto, key);\n    }\n\n    return computed(fn)(...arguments);\n  };\n\n  setDecorator(cp);\n\n  return cp;\n}\n","import {\n  TYPE_STARTED,\n  TYPE_QUEUED,\n  TYPE_CANCELLED,\n} from './policies/execution-states';\n\nconst LAST_APPLIED_TAGS = new Map();\n\nclass Refresh {\n  constructor(schedulerPolicy, stateTracker, taskInstances) {\n    this.stateTracker = stateTracker;\n    this.schedulerPolicy = schedulerPolicy;\n    this.initialTaskInstances = taskInstances;\n    this.startingInstances = [];\n  }\n\n  process() {\n    let [taskInstances, numRunning, numQueued] =\n      this.filterFinishedTaskInstances();\n    let reducer = this.schedulerPolicy.makeReducer(numRunning, numQueued);\n\n    let finalTaskInstances = taskInstances.filter((taskInstance) => {\n      return this.setTaskInstanceExecutionState(taskInstance, reducer.step());\n    });\n\n    this.stateTracker.computeFinalStates((state) => this.applyState(state));\n    this.startingInstances.forEach((taskInstance) => taskInstance.start());\n\n    return finalTaskInstances;\n  }\n\n  filterFinishedTaskInstances() {\n    let numRunning = 0,\n      numQueued = 0;\n    let taskInstances = this.initialTaskInstances.filter((taskInstance) => {\n      let taskState = this.stateTracker.stateFor(taskInstance.task);\n      let executorState = taskInstance.executor.state;\n\n      if (executorState.isFinished) {\n        taskState.onCompletion(taskInstance);\n        return false;\n      }\n\n      if (executorState.hasStarted) {\n        numRunning += 1;\n      } else {\n        numQueued += 1;\n      }\n\n      return true;\n    });\n    return [taskInstances, numRunning, numQueued];\n  }\n\n  setTaskInstanceExecutionState(taskInstance, desiredState) {\n    let taskState = this.stateTracker.stateFor(taskInstance.task);\n\n    if (!taskInstance.executor.counted) {\n      taskInstance.executor.counted = true;\n      taskState.onPerformed(taskInstance);\n    }\n\n    switch (desiredState.type) {\n      case TYPE_CANCELLED:\n        // this will cause a follow up flush which will detect and recompute cancellation state\n        taskInstance.cancel(desiredState.reason);\n        return false;\n      case TYPE_STARTED:\n        if (!taskInstance.executor.state.hasStarted) {\n          this.startingInstances.push(taskInstance);\n          taskState.onStart(taskInstance);\n        }\n        taskState.onRunning(taskInstance);\n        return true;\n      case TYPE_QUEUED:\n        taskState.onQueued(taskInstance);\n        // TODO: assert taskInstance hasn't started?\n        // Or perhaps this can be a way to pause a task?\n        return true;\n    }\n  }\n\n  applyState(state) {\n    let { taskable } = state;\n\n    if (!taskable.onState) {\n      return;\n    }\n\n    const { guid } = taskable;\n\n    if (\n      LAST_APPLIED_TAGS.has(guid) &&\n      state.tag < LAST_APPLIED_TAGS.get(guid)\n    ) {\n      return;\n    }\n\n    let props = Object.assign(\n      {\n        numRunning: state.numRunning,\n        numQueued: state.numQueued,\n        numPerformedInc: state.numPerformedInc,\n      },\n      state.attrs,\n    );\n\n    taskable.onState(props, taskable);\n\n    LAST_APPLIED_TAGS.set(guid, state.tag);\n  }\n}\n\nexport default Refresh;\n","import {\n  COMPLETION_SUCCESS,\n  COMPLETION_ERROR,\n  COMPLETION_CANCEL,\n} from '../../task-instance/completion-states';\n\nclass RefreshState {\n  constructor(taskable, tag) {\n    this.taskable = taskable;\n    this.group = taskable.group;\n    this.numRunning = 0;\n    this.numQueued = 0;\n    this.numPerformedInc = 0;\n    this.attrs = {};\n    this.tag = tag;\n  }\n\n  onCompletion(taskInstance) {\n    let state = taskInstance.completionState;\n    this.attrs.lastRunning = null;\n    this.attrs.lastComplete = taskInstance;\n    if (state === COMPLETION_SUCCESS) {\n      this.attrs.lastSuccessful = taskInstance;\n    } else {\n      if (state === COMPLETION_ERROR) {\n        this.attrs.lastErrored = taskInstance;\n      } else if (state === COMPLETION_CANCEL) {\n        this.attrs.lastCanceled = taskInstance;\n      }\n      this.attrs.lastIncomplete = taskInstance;\n    }\n  }\n\n  onPerformed(taskInstance) {\n    this.numPerformedInc += 1;\n    this.attrs.lastPerformed = taskInstance;\n  }\n\n  onStart(taskInstance) {\n    this.attrs.last = taskInstance;\n  }\n\n  onRunning(taskInstance) {\n    this.attrs.lastRunning = taskInstance;\n    this.numRunning += 1;\n  }\n\n  onQueued() {\n    this.numQueued += 1;\n  }\n\n  recurseTaskGroups(callback) {\n    let group = this.group;\n    while (group) {\n      callback(group);\n      group = group.group;\n    }\n  }\n\n  applyStateFrom(other) {\n    Object.assign(this.attrs, other.attrs);\n    this.numRunning += other.numRunning;\n    this.numQueued += other.numQueued;\n    this.numPerformedInc += other.numPerformedInc;\n  }\n}\n\nexport default RefreshState;\n","export const COMPLETION_PENDING = 0;\nexport const COMPLETION_SUCCESS = 1;\nexport const COMPLETION_ERROR = 2;\nexport const COMPLETION_CANCEL = 3;\n","import RefreshState from './state';\n\nconst CURRENT_REFRESH_TAGS = new Map();\n\nclass StateTracker {\n  constructor() {\n    this.states = new Map();\n  }\n\n  stateFor(taskable) {\n    let guid = taskable.guid;\n    let taskState = this.states.get(guid);\n    if (!taskState) {\n      let currentTag = CURRENT_REFRESH_TAGS.has(guid)\n        ? CURRENT_REFRESH_TAGS.get(guid)\n        : 0;\n      taskState = new RefreshState(taskable, ++currentTag);\n      this.states.set(guid, taskState);\n      CURRENT_REFRESH_TAGS.set(guid, currentTag);\n    }\n    return taskState;\n  }\n\n  // After cancelling/queueing task instances, we have to recompute the derived state\n  // of all the tasks that had/have task instances in this scheduler. We do this by\n  // looping through all the Tasks that we've accumulated state for, and then recursively\n  // applying/adding to the state of any TaskGroups they belong to.\n  computeFinalStates(callback) {\n    this.computeRecursiveState();\n    this.forEachState((state) => callback(state));\n  }\n\n  computeRecursiveState() {\n    this.forEachState((taskState) => {\n      let lastState = taskState;\n      taskState.recurseTaskGroups((taskGroup) => {\n        let state = this.stateFor(taskGroup);\n        state.applyStateFrom(lastState);\n        lastState = state;\n      });\n    });\n  }\n\n  forEachState(callback) {\n    this.states.forEach((state) => callback(state));\n  }\n}\n\nexport default StateTracker;\n","import NullState from './null-state';\n\nconst NULL_STATE = new NullState();\n\nclass NullStateTracker {\n  stateFor() {\n    return NULL_STATE;\n  }\n\n  computeFinalStates() {}\n}\n\nexport default NullStateTracker;\n","class NullState {\n  onCompletion() {}\n  onPerformed() {}\n  onStart() {}\n  onRunning() {}\n  onQueued() {}\n}\n\nexport default NullState;\n","import SchedulerRefresh from './refresh';\nimport StateTracker from './state-tracker/state-tracker';\nimport NullStateTracker from './state-tracker/null-state-tracker';\n\n// Scheduler base class\n\n// When a Task is performed, it creates an unstarted TaskInstance and\n// passes it to the Scheduler to determine when it should run. The\n// scheduler consults the schedulerPolicy (e.g. DropPolicy, RestartablePolicy, etc)\n// to determine whether the task instance should start executing, be enqueued\n// for later execution, or be immediately cancelled. As TaskInstances start\n// and run to completion, the Scheduler's `refresh()` method is called to\n// give it an opportunity to start (or cancel) previously enqueued task instances,\n// as well as update the derived state on Tasks and TaskGroups.\n\n// Every Task has its own Scheduler instance, unless it is part of a group,\n// in which case all the Tasks in a group share a single Scheduler.\n\nclass Scheduler {\n  constructor(schedulerPolicy, stateTrackingEnabled) {\n    this.schedulerPolicy = schedulerPolicy;\n    this.stateTrackingEnabled = stateTrackingEnabled;\n    this.taskInstances = [];\n  }\n\n  cancelAll(guid, cancelRequest) {\n    let cancelations = this.taskInstances\n      .map((taskInstance) => {\n        if (taskInstance.task.guids[guid]) {\n          taskInstance.executor.cancel(cancelRequest);\n        }\n      })\n      .filter((cancelation) => !!cancelation);\n\n    return Promise.all(cancelations);\n  }\n\n  perform(taskInstance) {\n    taskInstance.onFinalize(() => this.scheduleRefresh());\n    this.taskInstances.push(taskInstance);\n    this.refresh();\n  }\n\n  scheduleRefresh() {\n    Promise.resolve().then(() => this.refresh());\n  }\n\n  refresh() {\n    let stateTracker = this.stateTrackingEnabled\n      ? new StateTracker()\n      : new NullStateTracker();\n    let refresh = new SchedulerRefresh(\n      this.schedulerPolicy,\n      stateTracker,\n      this.taskInstances,\n    );\n    this.taskInstances = refresh.process();\n  }\n}\n\nexport default Scheduler;\n","import { STARTED } from './execution-states';\n\nclass UnboundedReducer {\n  step() {\n    return STARTED;\n  }\n}\n\nconst SINGLETON_REDUCER = new UnboundedReducer();\n\nclass UnboundedPolicy {\n  makeReducer() {\n    return SINGLETON_REDUCER;\n  }\n}\n\nexport default UnboundedPolicy;\n","export const DEFAULT_STATE = {\n  last: null,\n  lastRunning: null,\n  lastPerformed: null,\n  lastSuccessful: null,\n  lastComplete: null,\n  lastErrored: null,\n  lastCanceled: null,\n  lastIncomplete: null,\n  performCount: 0,\n};\n\nObject.freeze(DEFAULT_STATE);\n","export const TASK_CANCELATION_NAME = 'TaskCancelation';\n\n/**\n * Returns true if the object passed to it is a TaskCancelation error.\n * If you call `someTask.perform().catch(...)` or otherwise treat\n * a {@linkcode TaskInstance} like a promise, you may need to\n * handle the cancelation of a TaskInstance differently from\n * other kinds of errors it might throw, and you can use this\n * convenience function to distinguish cancelation from errors.\n *\n * ```js\n * click() {\n *   this.myTask.perform().catch(e => {\n *     if (!didCancel(e)) { throw e; }\n *   });\n * }\n * ```\n *\n * @param {object} error the caught error, which might be a TaskCancelation\n * @returns {boolean}\n */\nexport function didCancel(e) {\n  return e && e.name === TASK_CANCELATION_NAME;\n}\n\nexport const CANCEL_KIND_EXPLICIT = 'explicit';\nexport const CANCEL_KIND_YIELDABLE_CANCEL = 'yielded';\nexport const CANCEL_KIND_LIFESPAN_END = 'lifespan_end';\nexport const CANCEL_KIND_PARENT_CANCEL = 'parent_cancel';\n\nexport class CancelRequest {\n  constructor(kind, reason) {\n    this.kind = kind;\n    this.reason = reason;\n    this.promise = new Promise((resolve) => {\n      this.finalize = resolve;\n    });\n  }\n}\n","import { DEFAULT_STATE } from './default-state';\nimport {\n  CancelRequest,\n  CANCEL_KIND_EXPLICIT,\n} from '../task-instance/cancelation';\n\nlet guidId = 0;\nfunction makeGuid() {\n  return `ec_${guidId++}`;\n}\n\nexport class Taskable {\n  constructor(options) {\n    this.context = options.context;\n    this.debug = options.debug || false;\n    this.enabledModifiers = options.enabledModifiers;\n    this.env = options.env;\n    this.group = options.group;\n    this.hasEnabledEvents = options.hasEnabledEvents;\n    this.modifierOptions = options.modifierOptions;\n    this.name = options.name;\n    this.onStateCallback = options.onStateCallback;\n    this.scheduler = options.scheduler;\n\n    this.guid = makeGuid();\n    this.guids = {};\n    this.guids[this.guid] = true;\n    if (this.group) {\n      Object.assign(this.guids, this.group.guids);\n    }\n  }\n\n  cancelAll(options) {\n    let { reason, cancelRequestKind, resetState } = options || {};\n    reason = reason || '.cancelAll() was explicitly called on the Task';\n\n    let cancelRequest = new CancelRequest(\n      cancelRequestKind || CANCEL_KIND_EXPLICIT,\n      reason,\n    );\n    return this.scheduler.cancelAll(this.guid, cancelRequest).then(() => {\n      if (resetState) {\n        this._resetState();\n      }\n    });\n  }\n\n  get _isAlive() {\n    return true;\n  }\n\n  _resetState() {\n    this.setState(DEFAULT_STATE);\n  }\n\n  // override\n  setState() {}\n}\n\nObject.assign(Taskable.prototype, DEFAULT_STATE);\nObject.assign(Taskable.prototype, {\n  numRunning: 0,\n  numQueued: 0,\n  isRunning: false,\n  isQueued: false,\n  isIdle: true,\n  state: 'idle',\n});\n","export class GeneratorStepResult {\n  constructor(value, done, errored) {\n    this.value = value;\n    this.done = done;\n    this.errored = errored;\n  }\n}\n\nexport class GeneratorState {\n  constructor(generatorFactory) {\n    this.done = false;\n    this.generatorFactory = generatorFactory;\n    this.iterator = null;\n  }\n\n  step(resolvedValue, iteratorMethod) {\n    try {\n      let iterator = this.getIterator();\n      let { value, done } = iterator[iteratorMethod](resolvedValue);\n\n      if (done) {\n        return this.finalize(value, false);\n      } else {\n        return new GeneratorStepResult(value, false, false);\n      }\n    } catch (e) {\n      return this.finalize(e, true);\n    }\n  }\n\n  getIterator() {\n    if (!this.iterator && !this.done) {\n      this.iterator = this.generatorFactory();\n    }\n    return this.iterator;\n  }\n\n  finalize(value, errored) {\n    this.done = true;\n    this.iterator = null;\n    return new GeneratorStepResult(value, true, errored);\n  }\n}\n","import { COMPLETION_PENDING } from './completion-states';\n\nexport const INITIAL_STATE = {\n  completionState: COMPLETION_PENDING,\n\n  /**\n   * If this TaskInstance runs to completion by returning a property\n   * other than a rejecting promise, this property will be set\n   * with that value.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  value: null,\n\n  /**\n   * If this TaskInstance is canceled or throws an error (or yields\n   * a promise that rejects), this property will be set with that error.\n   * Otherwise, it is null.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  error: null,\n\n  /**\n   * True if the task instance is fulfilled.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  isSuccessful: false,\n\n  /**\n   * True if the task instance resolves to a rejection.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  isError: false,\n\n  /**\n   * True if the task instance is canceled\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  isCanceled: false,\n\n  /**\n   * True if the task instance has started, else false.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  hasStarted: false,\n\n  /**\n   * True if the task has run to completion.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  isFinished: false,\n};\n","import { GeneratorState } from '../generator-state';\nimport {\n  cancelableSymbol,\n  YIELDABLE_CANCEL,\n  YIELDABLE_CONTINUE,\n  YIELDABLE_RETURN,\n  YIELDABLE_THROW,\n  yieldableSymbol,\n} from '../yieldables';\nimport { INITIAL_STATE } from './initial-state';\n\nimport {\n  CANCEL_KIND_LIFESPAN_END,\n  CANCEL_KIND_PARENT_CANCEL,\n  CANCEL_KIND_YIELDABLE_CANCEL,\n  CancelRequest,\n  didCancel,\n  TASK_CANCELATION_NAME,\n} from './cancelation';\nimport {\n  COMPLETION_CANCEL,\n  COMPLETION_ERROR,\n  COMPLETION_SUCCESS,\n} from './completion-states';\n\nexport const PERFORM_TYPE_DEFAULT = 'PERFORM_TYPE_DEFAULT';\nexport const PERFORM_TYPE_UNLINKED = 'PERFORM_TYPE_UNLINKED';\nexport const PERFORM_TYPE_LINKED = 'PERFORM_TYPE_LINKED';\n\nconst CANCEL_RETURN_VALUE_SENTINEL = {};\nlet TASK_INSTANCE_STACK = [];\n\nexport function getRunningInstance() {\n  return TASK_INSTANCE_STACK[TASK_INSTANCE_STACK.length - 1];\n}\n\nexport class TaskInstanceExecutor {\n  constructor({ generatorFactory, env, debug }) {\n    this.generatorState = new GeneratorState(generatorFactory);\n    this.state = Object.assign({}, INITIAL_STATE);\n    this.index = 1;\n    this.disposers = [];\n    this.finalizeCallbacks = [];\n    this.env = env;\n    this.debug = debug;\n    this.cancelRequest = null;\n  }\n\n  start() {\n    if (this.state.hasStarted || this.cancelRequest) {\n      return;\n    }\n    this.setState({ hasStarted: true });\n    this.proceedSync(YIELDABLE_CONTINUE, undefined);\n    this.taskInstance.onStarted();\n  }\n\n  cancel(cancelRequest) {\n    if (!this.requestCancel(cancelRequest)) {\n      cancelRequest.finalize();\n      return cancelRequest.promise;\n    }\n\n    if (this.state.hasStarted) {\n      this.proceedWithCancelAsync();\n    } else {\n      this.finalizeWithCancel();\n    }\n\n    return this.cancelRequest.promise;\n  }\n\n  setState(state) {\n    Object.assign(this.state, state);\n    this.taskInstance.setState(this.state);\n  }\n\n  proceedChecked(index, yieldResumeType, value) {\n    if (this.state.isFinished) {\n      return;\n    }\n    if (!this.advanceIndex(index)) {\n      return;\n    }\n\n    if (yieldResumeType === YIELDABLE_CANCEL) {\n      this.requestCancel(\n        new CancelRequest(CANCEL_KIND_YIELDABLE_CANCEL),\n        value,\n      );\n      this.proceedWithCancelAsync();\n    } else {\n      this.proceedAsync(yieldResumeType, value);\n    }\n  }\n\n  proceedWithCancelAsync() {\n    this.proceedAsync(YIELDABLE_RETURN, CANCEL_RETURN_VALUE_SENTINEL);\n  }\n\n  proceedAsync(yieldResumeType, value) {\n    this.advanceIndex(this.index);\n    this.env.async(() => this.proceedSync(yieldResumeType, value));\n  }\n\n  proceedSync(yieldResumeType, value) {\n    if (this.state.isFinished) {\n      return;\n    }\n\n    this.dispose();\n\n    if (this.generatorState.done) {\n      this.handleResolvedReturnedValue(yieldResumeType, value);\n    } else {\n      this.handleResolvedContinueValue(yieldResumeType, value);\n    }\n  }\n\n  /**\n   * This method is called when a previously yielded value from\n   * the generator has been resolved, and now it's time to pass\n   * it back into the generator. There are 3 ways to \"resume\" a\n   * generator:\n   *\n   * - call `.next(value)` on it, which is used to pass in a resolved\n   *   value (the fulfilled value of a promise), e.g. if a task generator fn\n   *   does `yield Promise.resolve(5)`, then we take that promise yielded\n   *   by the generator, detect that it's a promise, resolve it, and then\n   *   pass its fulfilled value `5` back into the generator function so\n   *   that it can continue executing.\n   * - call `.throw(error)` on it, which throw an exception from where the\n   *   the generator previously yielded. We do this when the previously\n   *   yielded value resolves to an error value (e.g. a rejected promise\n   *   or a TaskInstance that finished with an error). Note that when you\n   *   resume a generator with a `.throw()`, it can still recover from that\n   *   thrown error and continue executing normally so long as the `yield`\n   *   was inside a `try/catch` statement.\n   * - call `.return(value)` on it, causes the generator function to return\n   *   from where it previously `yield`ed. We use `.return()` when cancelling\n   *   a TaskInstance; by `.return`ing, rather than `.throw`ing, it allows\n   *   the generator function to skip `catch(e) {}` blocks, which is usually\n   *   reserved for actual errors/exceptions; if we `.throw`'d cancellations,\n   *   it would require all tasks that used try/catch to conditionally ignore\n   *   cancellations, which is annoying. So we `.return()` from generator functions\n   *   in the case of errors as a matter of convenience.\n   *\n   * @private\n   */\n  handleResolvedContinueValue(iteratorMethod, resumeValue) {\n    let beforeIndex = this.index;\n    let stepResult = this.generatorStep(resumeValue, iteratorMethod);\n\n    // TODO: what is this doing? write breaking test.\n    if (!this.advanceIndex(beforeIndex)) {\n      return;\n    }\n\n    if (stepResult.errored) {\n      this.finalize(stepResult.value, COMPLETION_ERROR);\n      return;\n    }\n\n    this.handleYieldedValue(stepResult);\n  }\n\n  /**\n   * This method is called when the generator function is all\n   * out of values, and the last value returned from the function\n   * (possible a thenable/yieldable/promise/etc) has been resolved.\n   *\n   * Possible cases:\n   * - `return \"simple value\";` // resolved value is \"simple value\"\n   * - `return undefined;` // (or omitted return) resolved value is undefined\n   * - `return someTask.perform()` // resolved value is the value returned/resolved from someTask\n   *\n   * @private\n   */\n  handleResolvedReturnedValue(yieldResumeType, value) {\n    switch (yieldResumeType) {\n      case YIELDABLE_CONTINUE:\n      case YIELDABLE_RETURN:\n        this.finalize(value, COMPLETION_SUCCESS);\n        break;\n      case YIELDABLE_THROW:\n        this.finalize(value, COMPLETION_ERROR);\n        break;\n    }\n  }\n\n  handleYieldedUnknownThenable(thenable) {\n    let resumeIndex = this.index;\n    thenable.then(\n      (value) => {\n        this.proceedChecked(resumeIndex, YIELDABLE_CONTINUE, value);\n      },\n      (error) => {\n        this.proceedChecked(resumeIndex, YIELDABLE_THROW, error);\n      },\n    );\n  }\n\n  /**\n   * The TaskInstance internally tracks an index/sequence number\n   * (the `index` property) which gets incremented every time the\n   * task generator function iterator takes a step. When a task\n   * function is paused at a `yield`, there are two events that\n   * cause the TaskInstance to take a step: 1) the yielded value\n   * \"resolves\", thus resuming the TaskInstance's execution, or\n   * 2) the TaskInstance is canceled. We need some mechanism to prevent\n   * stale yielded value resolutions from resuming the TaskFunction\n   * after the TaskInstance has already moved on (either because\n   * the TaskInstance has since been canceled or because an\n   * implementation of the Yieldable API tried to resume the\n   * TaskInstance more than once). The `index` serves as\n   * that simple mechanism: anyone resuming a TaskInstance\n   * needs to pass in the `index` they were provided that acts\n   * as a ticket to resume the TaskInstance that expires once\n   * the TaskInstance has moved on.\n   *\n   * @private\n   */\n  advanceIndex(index) {\n    if (this.index === index) {\n      return ++this.index;\n    }\n  }\n\n  handleYieldedValue(stepResult) {\n    let yieldedValue = stepResult.value;\n    if (!yieldedValue) {\n      this.proceedWithSimpleValue(yieldedValue);\n      return;\n    }\n\n    this.addDisposer(yieldedValue[cancelableSymbol]);\n\n    if (yieldedValue[yieldableSymbol]) {\n      this.invokeYieldable(yieldedValue);\n    } else if (typeof yieldedValue.then === 'function') {\n      this.handleYieldedUnknownThenable(yieldedValue);\n    } else {\n      this.proceedWithSimpleValue(yieldedValue);\n    }\n  }\n\n  proceedWithSimpleValue(yieldedValue) {\n    this.proceedAsync(YIELDABLE_CONTINUE, yieldedValue);\n  }\n\n  addDisposer(maybeDisposer) {\n    if (typeof maybeDisposer !== 'function') {\n      return;\n    }\n\n    this.disposers.push(maybeDisposer);\n  }\n\n  /**\n   * Runs any disposers attached to the task's most recent `yield`.\n   * For instance, when a task yields a TaskInstance, it registers that\n   * child TaskInstance's disposer, so that if the parent task is canceled,\n   * dispose() will run that disposer and cancel the child TaskInstance.\n   *\n   * @private\n   */\n  dispose() {\n    let disposers = this.disposers;\n    if (disposers.length === 0) {\n      return;\n    }\n    this.disposers = [];\n    disposers.forEach((disposer) => disposer());\n  }\n\n  /**\n   * Calls .next()/.throw()/.return() on the task's generator function iterator,\n   * essentially taking a single step of execution on the task function.\n   *\n   * @private\n   */\n  generatorStep(nextValue, iteratorMethod) {\n    TASK_INSTANCE_STACK.push(this);\n    let stepResult = this.generatorState.step(nextValue, iteratorMethod);\n    TASK_INSTANCE_STACK.pop();\n\n    // TODO: fix this!\n    if (this._expectsLinkedYield) {\n      let value = stepResult.value;\n      if (!value || value.performType !== PERFORM_TYPE_LINKED) {\n        // eslint-disable-next-line no-console\n        console.warn(\n          'You performed a .linked() task without immediately yielding/returning it. This is currently unsupported (but might be supported in future version of ember-concurrency).',\n        );\n      }\n      this._expectsLinkedYield = false;\n    }\n\n    return stepResult;\n  }\n\n  maybeResolveDefer() {\n    if (!this.defer || !this.state.isFinished) {\n      return;\n    }\n\n    if (this.state.completionState === COMPLETION_SUCCESS) {\n      this.defer.resolve(this.state.value);\n    } else {\n      this.defer.reject(this.state.error);\n    }\n  }\n\n  onFinalize(callback) {\n    this.finalizeCallbacks.push(callback);\n\n    if (this.state.isFinished) {\n      this.runFinalizeCallbacks();\n    }\n  }\n\n  runFinalizeCallbacks() {\n    this.finalizeCallbacks.forEach((cb) => cb());\n    this.finalizeCallbacks = [];\n    this.maybeResolveDefer();\n    this.maybeThrowUnhandledTaskErrorLater();\n  }\n\n  promise() {\n    if (!this.defer) {\n      this.defer = this.env.defer();\n      this.asyncErrorsHandled = true;\n      this.maybeResolveDefer();\n    }\n    return this.defer.promise;\n  }\n\n  maybeThrowUnhandledTaskErrorLater() {\n    if (\n      !this.asyncErrorsHandled &&\n      this.state.completionState === COMPLETION_ERROR &&\n      !didCancel(this.state.error)\n    ) {\n      this.env.async(() => {\n        if (!this.asyncErrorsHandled) {\n          this.env.reportUncaughtRejection(this.state.error);\n        }\n      });\n    }\n  }\n\n  requestCancel(request) {\n    if (this.cancelRequest || this.state.isFinished) {\n      return false;\n    }\n    this.cancelRequest = request;\n    return true;\n  }\n\n  finalize(value, completionState) {\n    if (this.cancelRequest) {\n      return this.finalizeWithCancel();\n    }\n\n    let state = { completionState };\n\n    if (completionState === COMPLETION_SUCCESS) {\n      state.isSuccessful = true;\n      state.value = value;\n    } else if (completionState === COMPLETION_ERROR) {\n      state.isError = true;\n      state.error = value;\n    } else if (completionState === COMPLETION_CANCEL) {\n      state.error = value;\n    }\n\n    this.finalizeShared(state);\n  }\n\n  finalizeWithCancel() {\n    let cancelReason = this.taskInstance.formatCancelReason(\n      this.cancelRequest.reason,\n    );\n    let error = new Error(cancelReason);\n\n    if (this.debugEnabled()) {\n      // eslint-disable-next-line no-console\n      console.log(cancelReason);\n    }\n\n    error.name = TASK_CANCELATION_NAME;\n\n    this.finalizeShared({\n      isCanceled: true,\n      completionState: COMPLETION_CANCEL,\n      error,\n      cancelReason,\n    });\n\n    this.cancelRequest.finalize();\n  }\n\n  debugEnabled() {\n    return this.debug || this.env.globalDebuggingEnabled();\n  }\n\n  finalizeShared(state) {\n    this.index++;\n    state.isFinished = true;\n    this.setState(state);\n    this.runFinalizeCallbacks();\n    this.dispatchFinalizeEvents(state.completionState);\n  }\n\n  dispatchFinalizeEvents(completionState) {\n    switch (completionState) {\n      case COMPLETION_SUCCESS:\n        this.taskInstance.onSuccess();\n        break;\n      case COMPLETION_ERROR:\n        this.taskInstance.onError(this.state.error);\n        break;\n      case COMPLETION_CANCEL:\n        this.taskInstance.onCancel(this.state.cancelReason);\n        break;\n    }\n  }\n\n  invokeYieldable(yieldedValue) {\n    try {\n      let maybeDisposer = yieldedValue[yieldableSymbol](\n        this.taskInstance,\n        this.index,\n      );\n      this.addDisposer(maybeDisposer);\n    } catch (e) {\n      this.env.reportUncaughtRejection(e);\n    }\n  }\n\n  /**\n   * `onYielded` is called when this task instance has been\n   * yielded in another task instance's execution. We take\n   * this opportunity to conditionally link up the tasks\n   * so that when the parent or child cancels, the other\n   * is cancelled.\n   *\n   * Given the following case:\n   *\n   * ```js\n   * parentTask = task(async () => {\n   *   await otherTask.perform();\n   * });\n   * ```\n   *\n   * Then the `parent` param is the task instance that is executing, `this`\n   * is the `otherTask` task instance that was yielded.\n   *\n   * @private\n   */\n  onYielded(parent, resumeIndex) {\n    this.asyncErrorsHandled = true;\n\n    this.onFinalize(() => {\n      let completionState = this.state.completionState;\n      if (completionState === COMPLETION_SUCCESS) {\n        parent.proceed(resumeIndex, YIELDABLE_CONTINUE, this.state.value);\n      } else if (completionState === COMPLETION_ERROR) {\n        parent.proceed(resumeIndex, YIELDABLE_THROW, this.state.error);\n      } else if (completionState === COMPLETION_CANCEL) {\n        parent.proceed(resumeIndex, YIELDABLE_CANCEL, null);\n      }\n    });\n\n    let performType = this.getPerformType();\n    if (performType === PERFORM_TYPE_UNLINKED) {\n      return;\n    }\n\n    return () => {\n      this.detectSelfCancelLoop(performType, parent);\n      this.cancel(new CancelRequest(CANCEL_KIND_PARENT_CANCEL));\n    };\n  }\n\n  getPerformType() {\n    return this.taskInstance.performType || PERFORM_TYPE_DEFAULT;\n  }\n\n  detectSelfCancelLoop(performType, parent) {\n    if (performType !== PERFORM_TYPE_DEFAULT) {\n      return;\n    }\n\n    let parentCancelRequest = parent.executor && parent.executor.cancelRequest;\n\n    // Detect that the parent was cancelled by a lifespan ending and\n    // that the child is still running and not cancelled.\n    if (\n      parentCancelRequest &&\n      parentCancelRequest.kind === CANCEL_KIND_LIFESPAN_END &&\n      !this.cancelRequest &&\n      !this.state.isFinished\n    ) {\n      this.taskInstance.selfCancelLoopWarning(parent);\n    }\n  }\n}\n","import { Taskable } from './taskable';\nimport {\n  PERFORM_TYPE_DEFAULT,\n  PERFORM_TYPE_LINKED,\n  PERFORM_TYPE_UNLINKED,\n  getRunningInstance,\n  TaskInstanceExecutor,\n} from '../task-instance/executor';\n\nclass TaskLinkProxy {\n  constructor(task, performType, linkedObject) {\n    this.task = task;\n    this.performType = performType;\n    this.linkedObject = linkedObject;\n  }\n\n  perform(...args) {\n    return this.task._performShared(args, this.performType, this.linkedObject);\n  }\n}\n\nexport class Task extends Taskable {\n  constructor(options) {\n    super(options);\n    this.generatorFactory = options.generatorFactory;\n    this.perform = this._perform.bind(this);\n  }\n\n  linked() {\n    let linkedObject = getRunningInstance();\n    if (!linkedObject) {\n      throw new Error(`You can only call .linked() from within a task.`);\n    }\n\n    return new TaskLinkProxy(this, PERFORM_TYPE_LINKED, linkedObject);\n  }\n\n  unlinked() {\n    return new TaskLinkProxy(this, PERFORM_TYPE_UNLINKED, null);\n  }\n\n  toString() {\n    return `<Task:${this.name}>`;\n  }\n\n  _clone() {\n    return new Task({\n      context: this.context,\n      debug: this.debug,\n      env: this.env,\n      generatorFactory: this.generatorFactory,\n      group: this.group,\n      hasEnabledEvents: this.hasEnabledEvents,\n      name: this.name,\n      onStateCallback: this.onStateCallback,\n      scheduler: this.scheduler,\n    });\n  }\n\n  _curry(...args) {\n    let task = this._clone();\n    task._curryArgs = [...(this._curryArgs || []), ...args];\n    return task;\n  }\n\n  _perform(...args) {\n    return this._performShared(args, PERFORM_TYPE_DEFAULT, null);\n  }\n\n  _performShared(args, performType, linkedObject) {\n    let fullArgs = this._curryArgs ? [...this._curryArgs, ...args] : args;\n    let taskInstance = this._taskInstanceFactory(\n      fullArgs,\n      performType,\n      linkedObject,\n    );\n\n    if (performType === PERFORM_TYPE_LINKED) {\n      linkedObject._expectsLinkedYield = true;\n    }\n\n    if (!this._isAlive) {\n      // a task linked to a dead lifetime should immediately cancel.\n      taskInstance.cancel();\n    }\n\n    this.scheduler.perform(taskInstance);\n    return taskInstance;\n  }\n\n  // eslint-disable-next-line no-unused-vars\n  _taskInstanceOptions(args, performType, _linkedObject) {\n    let generatorFactory = () => this.generatorFactory(args);\n    let taskInstanceOptions = {\n      task: this,\n      args,\n      executor: new TaskInstanceExecutor({\n        generatorFactory,\n        env: this.env,\n        debug: this.debug,\n      }),\n      performType,\n      hasEnabledEvents: this.hasEnabledEvents,\n    };\n\n    return taskInstanceOptions;\n  }\n}\n","import { Taskable } from './taskable';\n\nexport class TaskGroup extends Taskable {}\n","import Scheduler from './scheduler/scheduler';\nimport UnboundedSchedulerPolicy from './scheduler/policies/unbounded-policy';\nimport EnqueueSchedulerPolicy from './scheduler/policies/enqueued-policy';\nimport DropSchedulerPolicy from './scheduler/policies/drop-policy';\nimport KeepLatestSchedulerPolicy from './scheduler/policies/keep-latest-policy';\nimport RestartableSchedulerPolicy from './scheduler/policies/restartable-policy';\nimport { Task } from './task/task';\nimport { TaskGroup } from './task/task-group';\nimport { DEFAULT_ENVIRONMENT } from './environment';\n\nfunction assertModifiersNotMixedWithGroup(obj) {\n  if (obj._hasSetConcurrencyConstraint && obj._taskGroupPath) {\n    throw new Error(\n      `Cannot use both 'group' and other concurrency-constraining task modifiers (e.g. 'drop', 'enqueue', 'restartable')`,\n    );\n  }\n}\n\nfunction assertUnsetBufferPolicy(obj) {\n  if (obj._hasSetBufferPolicy) {\n    throw new Error(\n      `Cannot set multiple buffer policies on a task or task group. ${obj._schedulerPolicyClass} has already been set for task or task group '${obj.name}'`,\n    );\n  }\n}\n\nconst MODIFIER_REGISTRY = {\n  enqueue: (factory, value) =>\n    value && factory.setBufferPolicy(EnqueueSchedulerPolicy),\n  evented: (factory, value) => value && factory.setEvented(value),\n  debug: (factory, value) => value && factory.setDebug(value),\n  drop: (factory, value) =>\n    value && factory.setBufferPolicy(DropSchedulerPolicy),\n  group: (factory, groupName) => factory.setGroup(groupName),\n  keepLatest: (factory, value) =>\n    value && factory.setBufferPolicy(KeepLatestSchedulerPolicy),\n  maxConcurrency: (factory, maxConcurrency) =>\n    factory.setMaxConcurrency(maxConcurrency),\n  onState: (factory, onStateCallback) => factory.setOnState(onStateCallback),\n  restartable: (factory, value) =>\n    value && factory.setBufferPolicy(RestartableSchedulerPolicy),\n};\n\n/**\n * Callback type defining a task modifier\n *\n * @callback TaskFactory~TaskModifier\n * @param {TaskFactory} factory\n * @param {*} taskModifierOption\n */\n\n/**\n * Registers a new modifier with the modifier registry\n *\n * @param {string} name Name of the modifier\n * @param {TaskFactory~TaskModifier} callback\n */\nexport function registerModifier(name, callback) {\n  if (MODIFIER_REGISTRY[name]) {\n    throw new Error(\n      `A modifier with the name '${name}' has already been defined.`,\n    );\n  }\n\n  MODIFIER_REGISTRY[name] = callback;\n}\n\n/**\n * Returns a specified modifier, if it exists in the registry\n *\n * @param {string} name Name of the modifier\n * @returns {TaskFactory~TaskModifier?}\n */\nexport function getModifier(name) {\n  return MODIFIER_REGISTRY[name];\n}\n\n/**\n * Returns whether a specified modifier exists in the registry\n *\n * @param {string} name Name of the modifier\n * @returns {boolean}\n */\nexport function hasModifier(name) {\n  return name in MODIFIER_REGISTRY;\n}\n\n/**\n * Factory used for instantiating Tasks and Task Groups. Mostly for internal\n * use, but some public APIs exposed via the Task Modifier APIs.\n *\n * <style>\n *  .ignore-this--this-is-here-to-hide-constructor,\n *  #TaskFactory { display: none }\n * </style>\n *\n * @class TaskFactory\n */\nexport class TaskFactory {\n  env = DEFAULT_ENVIRONMENT;\n\n  _debug = null;\n  _enabledModifiers = [];\n  _hasSetConcurrencyConstraint = false;\n  _hasSetBufferPolicy = false;\n  _hasEnabledEvents = false;\n  _maxConcurrency = null;\n  _onStateCallback = (state, taskable) => taskable.setState(state);\n  _schedulerPolicyClass = UnboundedSchedulerPolicy;\n  _taskGroupPath = null;\n\n  constructor(name = '<unknown>', taskDefinition = null, options = {}) {\n    this.name = name;\n    this.taskDefinition = taskDefinition;\n    this.options = options;\n    this._processModifierOptions(options);\n  }\n\n  /**\n   * Returns a new Task bound to the given context\n   *\n   * @protected\n   * @param {*} context\n   * @returns {Task}\n   */\n  createTask(context) {\n    let options = this.getTaskOptions(context);\n\n    return new Task(\n      Object.assign(\n        {\n          generatorFactory: (args) => this.taskDefinition.apply(context, args),\n        },\n        options,\n      ),\n    );\n  }\n\n  /**\n   * Returns a new TaskGroup bound to the given context\n   *\n   * @protected\n   * @param {*} context\n   * @returns {Task}\n   */\n  createTaskGroup(context) {\n    let options = this.getTaskOptions(context);\n\n    return new TaskGroup(options);\n  }\n\n  /**\n   * Returns a modifier callback with the given name bound to this TaskFactory,\n   * if registered.\n   *\n   * @protected\n   * @param {string} name\n   * @returns {TaskFactory~TaskModifier?}\n   */\n  getModifier(name) {\n    if (hasModifier(name)) {\n      return MODIFIER_REGISTRY[name].bind(null, this);\n    }\n  }\n\n  /**\n   * Returns the options provided to TaskFactory\n   *\n   * @public\n   * @returns {object}\n   */\n  getOptions() {\n    return this.options;\n  }\n\n  /**\n   * Returns a new Scheduler instance\n   *\n   * @protected\n   * @param {*} schedulerPolicy\n   * @param {boolean} stateTrackingEnabled\n   * @returns {Scheduler}\n   */\n  getScheduler(schedulerPolicy, stateTrackingEnabled) {\n    return new Scheduler(schedulerPolicy, stateTrackingEnabled);\n  }\n\n  /**\n   * Returns the options to pass to a Task or TaskGroup constructor\n   *\n   * @protected\n   * @param {*} context\n   * @returns {object}\n   */\n  getTaskOptions(context) {\n    let group, scheduler;\n    let onStateCallback = this._onStateCallback;\n\n    if (this._taskGroupPath) {\n      group = context[this._taskGroupPath];\n      if (!(group instanceof TaskGroup)) {\n        throw new Error(\n          `Expected group '${this._taskGroupPath}' to be defined but was not found.`,\n        );\n      }\n\n      scheduler = group.scheduler;\n    } else {\n      let schedulerPolicy = new this._schedulerPolicyClass(\n        this._maxConcurrency,\n      );\n      scheduler = this.getScheduler(\n        schedulerPolicy,\n        onStateCallback && typeof onStateCallback === 'function',\n      );\n    }\n\n    return {\n      context,\n      debug: this._debug,\n      env: this.env,\n      name: this.name,\n      group,\n      scheduler,\n      hasEnabledEvents: this._hasEnabledEvents,\n      onStateCallback,\n      enabledModifiers: this._enabledModifiers,\n      modifierOptions: this.getOptions(),\n    };\n  }\n\n  /**\n   * Sets the Scheduler buffer policy class to the specified value.\n   *\n   * Will raise an assertion if a buffer policy has already been specified\n   *\n   * @param {*} policy\n   * @returns {TaskFactory}\n   */\n  setBufferPolicy(policy) {\n    assertUnsetBufferPolicy(this);\n    this._hasSetBufferPolicy = true;\n    this._hasSetConcurrencyConstraint = true;\n    this._schedulerPolicyClass = policy;\n    assertModifiersNotMixedWithGroup(this);\n\n    return this;\n  }\n\n  /**\n   * Sets debug mode\n   *\n   * @param {boolean} enabled\n   * @returns {TaskFactory}\n   */\n  setDebug(enabled) {\n    this._debug = enabled;\n    return this;\n  }\n\n  /**\n   * Sets whether Task will dispatch Task events or not\n   *\n   * @param {boolean} enabled\n   * @returns {TaskFactory}\n   */\n  setEvented(enabled) {\n    this._hasEnabledEvents = enabled;\n    return this;\n  }\n\n  /**\n   * Sets Scheduling policy's `maxConcurrency`\n   *\n   * @param {number} maxConcurrency\n   * @returns {TaskFactory}\n   */\n  setMaxConcurrency(maxConcurrency) {\n    this._hasSetConcurrencyConstraint = true;\n    this._maxConcurrency = maxConcurrency;\n    return this;\n  }\n\n  /**\n   * Assigns Task created from this factory to the specified group name\n   *\n   * @param {string} group\n   * @returns {TaskFactory}\n   */\n  setGroup(group) {\n    this._taskGroupPath = group;\n    return this;\n  }\n\n  /**\n   * Sets the name of tasks created from this factory\n   *\n   * @param {string} name\n   * @returns {TaskFactory}\n   */\n  setName(name) {\n    this.name = name;\n    return this;\n  }\n\n  /**\n   * Sets the callback used on state updates. Can be set to null to disable\n   * state tracking on tasks.\n   *\n   * @param {function} onStateCallback\n   * @returns {TaskFactory}\n   */\n  setOnState(onStateCallback) {\n    this._onStateCallback = onStateCallback;\n    return this;\n  }\n\n  /**\n   * Sets the definition for tasks created from this factory\n   *\n   * @param {*} taskDefinition\n   * @returns {TaskFactory}\n   */\n  setTaskDefinition(taskDefinition) {\n    this.taskDefinition = taskDefinition;\n    return this;\n  }\n\n  _processModifierOptions(options) {\n    if (!options) {\n      return;\n    }\n\n    for (let key of Object.keys(options)) {\n      let value = options[key];\n      let modifier = this.getModifier(key);\n\n      if (typeof modifier === 'function' && modifier(value)) {\n        this._enabledModifiers.push(key);\n      }\n    }\n  }\n}\n","import { TaskFactory } from './task-factory';\n\nimport { deprecate } from '@ember/debug';\n\nfunction taskFromPropertyDescriptor(\n  target,\n  key,\n  descriptor,\n  params = [],\n  factoryClass = TaskFactory,\n) {\n  let { initializer, get, value } = descriptor;\n  let taskFn;\n\n  deprecate(\n    'Using @task decorator (or any of its variants) is deprecated. Please use modern `taskName = task(async () => {})` syntax instead',\n    false,\n    {\n      id: 'ember-concurrency.deprecate-decorator-task',\n      for: 'ember-concurrency',\n      since: '4.0.5',\n      until: '5.0.0',\n    },\n  );\n\n  if (initializer) {\n    taskFn = initializer.call(undefined);\n  } else if (get) {\n    taskFn = get.call(undefined);\n  } else if (value) {\n    taskFn = value;\n  }\n\n  taskFn.displayName = `${key} (task)`;\n\n  let tasks = new WeakMap();\n  let options = params[0] || {};\n  let factory = new factoryClass(key, taskFn, options);\n  factory._setupEmberKVO(target);\n\n  return {\n    get() {\n      let task = tasks.get(this);\n\n      if (!task) {\n        task = factory.createTask(this);\n        tasks.set(this, task);\n      }\n\n      return task;\n    },\n  };\n}\n\nfunction taskGroupPropertyDescriptor(\n  _target,\n  key,\n  _descriptor,\n  params = [],\n  factoryClass = TaskFactory,\n) {\n  let taskGroups = new WeakMap();\n  let options = params[0] || {};\n  let factory = new factoryClass(key, null, options);\n\n  return {\n    get() {\n      let task = taskGroups.get(this);\n\n      if (!task) {\n        task = factory.createTaskGroup(this);\n        taskGroups.set(this, task);\n      }\n\n      return task;\n    },\n  };\n}\n\n// Cribbed from @ember-decorators/utils\nfunction isFieldDescriptor(possibleDesc) {\n  let [target, key, desc] = possibleDesc;\n\n  return (\n    possibleDesc.length === 3 &&\n    typeof target === 'object' &&\n    target !== null &&\n    typeof key === 'string' &&\n    ((typeof desc === 'object' &&\n      desc !== null &&\n      'enumerable' in desc &&\n      'configurable' in desc) ||\n      desc === undefined) // TS compatibility ???\n  );\n}\n\nexport function decoratorWithParams(descriptorFn) {\n  return function (...params) {\n    if (isFieldDescriptor(params)) {\n      return descriptorFn(...params);\n    } else {\n      return (...desc) => descriptorFn(...desc, params);\n    }\n  };\n}\n\nfunction createDecorator(fn, baseOptions = {}, factoryClass = TaskFactory) {\n  return decoratorWithParams((target, key, descriptor, [userOptions] = []) => {\n    let mergedOptions = Object.assign({}, { ...baseOptions, ...userOptions });\n\n    return fn(target, key, descriptor, [mergedOptions], factoryClass);\n  });\n}\n\nexport function createTaskDecorator(\n  baseOptions = {},\n  factoryClass = TaskFactory,\n) {\n  return createDecorator(taskFromPropertyDescriptor, baseOptions, factoryClass);\n}\n\nexport function createTaskGroupDecorator(\n  baseOptions = {},\n  factoryClass = TaskFactory,\n) {\n  return createDecorator(\n    taskGroupPropertyDescriptor,\n    baseOptions,\n    factoryClass,\n  );\n}\n\nexport const lastValue = decoratorWithParams(\n  (_target, _key, descriptor, [taskName] = []) => {\n    const { initializer } = descriptor;\n    delete descriptor.initializer;\n\n    deprecate(\n      '@lastValue is deprecated is deprecated along with all ember-concurrency decorators. Please use a getter that references taskName.lastSuccessful.value instead.',\n      false,\n      {\n        id: 'ember-concurrency.deprecate-decorator-last-value',\n        for: 'ember-concurrency',\n        since: '4.0.5',\n        until: '5.0.0',\n      },\n    );\n\n    return {\n      get() {\n        let lastInstance = this[taskName].lastSuccessful;\n\n        if (lastInstance) {\n          return lastInstance.value;\n        }\n\n        if (initializer) {\n          return initializer.call(this);\n        }\n\n        return undefined;\n      },\n    };\n  },\n);\n","import Scheduler from '../external/scheduler/scheduler';\nimport { once } from '@ember/runloop';\n\nclass EmberScheduler extends Scheduler {\n  scheduleRefresh() {\n    once(this, this.refresh);\n  }\n}\n\nexport default EmberScheduler;\n","import { INITIAL_STATE } from './initial-state';\nimport { yieldableSymbol } from '../yieldables';\nimport { CancelRequest, CANCEL_KIND_EXPLICIT } from './cancelation';\nconst EXPLICIT_CANCEL_REASON = '.cancel() was explicitly called';\n\nexport class BaseTaskInstance {\n  constructor({ task, args, executor, performType, hasEnabledEvents }) {\n    this.task = task;\n    this.args = args;\n    this.performType = performType;\n    this.executor = executor;\n    this.executor.taskInstance = this;\n    this.hasEnabledEvents = hasEnabledEvents;\n  }\n\n  setState() {}\n  onStarted() {}\n  onSuccess() {}\n  onError() {}\n  onCancel() {}\n  formatCancelReason() {}\n  selfCancelLoopWarning() {}\n\n  onFinalize(callback) {\n    this.executor.onFinalize(callback);\n  }\n\n  proceed(index, yieldResumeType, value) {\n    this.executor.proceedChecked(index, yieldResumeType, value);\n  }\n\n  [yieldableSymbol](parentTaskInstance, resumeIndex) {\n    return this.executor.onYielded(parentTaskInstance, resumeIndex);\n  }\n\n  cancel(cancelReason = EXPLICIT_CANCEL_REASON) {\n    this.executor.cancel(new CancelRequest(CANCEL_KIND_EXPLICIT, cancelReason));\n  }\n\n  then(...args) {\n    return this.executor.promise().then(...args);\n  }\n\n  catch(...args) {\n    return this.executor.promise().catch(...args);\n  }\n\n  finally(...args) {\n    return this.executor.promise().finally(...args);\n  }\n\n  toString() {\n    return `${this.task} TaskInstance`;\n  }\n\n  start() {\n    this.executor.start();\n    return this;\n  }\n}\n\nObject.assign(BaseTaskInstance.prototype, INITIAL_STATE);\nObject.assign(BaseTaskInstance.prototype, {\n  state: 'waiting',\n  isDropped: false,\n  isRunning: true,\n});\n","import { tracked } from '@glimmer/tracking';\nimport { DEFAULT_STATE as INITIAL_TASK_STATE } from './external/task/default-state';\nimport { INITIAL_STATE as INITIAL_INSTANCE_STATE } from './external/task-instance/initial-state';\n\nfunction trackMixin(proto, obj, key) {\n  const propDesc = Object.getOwnPropertyDescriptor(proto, key);\n  propDesc.initializer = propDesc.initializer || (() => proto[key]);\n  delete propDesc.value;\n  const desc = tracked(obj, key, propDesc);\n  obj[key] = desc;\n  return obj;\n}\n\nfunction applyTracked(proto, initial) {\n  return Object.keys(proto).reduce((acc, key) => {\n    return trackMixin(proto, acc, key);\n  }, initial);\n}\n\nexport let TRACKED_INITIAL_TASK_STATE;\nexport let TRACKED_INITIAL_INSTANCE_STATE;\n\nTRACKED_INITIAL_TASK_STATE = applyTracked(INITIAL_TASK_STATE, {});\nTRACKED_INITIAL_TASK_STATE = applyTracked(\n  {\n    numRunning: 0,\n    numQueued: 0,\n    isRunning: false,\n    isQueued: false,\n    isIdle: true,\n    state: 'idle',\n  },\n  TRACKED_INITIAL_TASK_STATE,\n);\n\nTRACKED_INITIAL_INSTANCE_STATE = applyTracked(INITIAL_INSTANCE_STATE, {});\nTRACKED_INITIAL_INSTANCE_STATE = applyTracked(\n  {\n    state: 'waiting',\n    isDropped: false,\n    isRunning: false,\n  },\n  TRACKED_INITIAL_INSTANCE_STATE,\n);\n\nObject.freeze(TRACKED_INITIAL_TASK_STATE);\nObject.freeze(TRACKED_INITIAL_INSTANCE_STATE);\n","import { BaseTaskInstance } from './external/task-instance/base';\nimport { TRACKED_INITIAL_INSTANCE_STATE } from './tracked-state';\n\n/**\n  A `TaskInstance` represent a single execution of a\n  {@linkcode Task}. Every call to {@linkcode Task#perform} returns\n  a `TaskInstance`.\n\n  `TaskInstance`s are cancelable, either explicitly\n  via {@linkcode TaskInstance#cancel} or {@linkcode Task#cancelAll},\n  or automatically due to the host object being destroyed, or\n  because concurrency policy enforced by a\n  {@linkcode TaskProperty Task Modifier} canceled the task instance.\n\n  <style>\n    .ignore-this--this-is-here-to-hide-constructor,\n    #TaskInstance { display: none }\n  </style>\n\n  @class TaskInstance\n*/\n\nexport class TaskInstance extends BaseTaskInstance {\n  setState(props) {\n    let state = this._recomputeState(props);\n    Object.assign(this, {\n      ...props,\n      isRunning: !props.isFinished,\n      isDropped: state === 'dropped',\n      state,\n    });\n  }\n\n  _recomputeState(props) {\n    if (props.isDropped) {\n      return 'dropped';\n    } else if (props.isCanceled) {\n      if (props.hasStarted) {\n        return 'canceled';\n      } else {\n        return 'dropped';\n      }\n    } else if (props.isFinished) {\n      return 'finished';\n    } else if (props.hasStarted) {\n      return 'running';\n    } else {\n      return 'waiting';\n    }\n  }\n\n  onStarted() {\n    this.triggerEvent('started', this);\n  }\n\n  onSuccess() {\n    this.triggerEvent('succeeded', this);\n  }\n\n  onError(error) {\n    this.triggerEvent('errored', this, error);\n  }\n\n  onCancel(cancelReason) {\n    this.triggerEvent('canceled', this, cancelReason);\n  }\n\n  formatCancelReason(reason) {\n    return `TaskInstance '${this.getName()}' was canceled because ${reason}. For more information, see: http://ember-concurrency.com/docs/task-cancelation-help`;\n  }\n\n  getName() {\n    if (!this.name) {\n      this.name = (this.task && this.task.name) || '<unknown>';\n    }\n    return this.name;\n  }\n\n  selfCancelLoopWarning(parent) {\n    let parentName = `\\`${parent.getName()}\\``;\n    let childName = `\\`${this.getName()}\\``;\n    // eslint-disable-next-line no-console\n    console.warn(\n      `ember-concurrency detected a potentially hazardous \"self-cancel loop\" between parent task ${parentName} and child task ${childName}. If you want child task ${childName} to be canceled when parent task ${parentName} is canceled, please change \\`.perform()\\` to \\`.linked().perform()\\`. If you want child task ${childName} to keep running after parent task ${parentName} is canceled, change it to \\`.unlinked().perform()\\``,\n    );\n  }\n\n  triggerEvent(...allArgs) {\n    if (!this.hasEnabledEvents) {\n      return;\n    }\n\n    let taskInstance = this;\n    let task = taskInstance.task;\n    let host = task.context;\n    let eventNamespace = task && task.name;\n\n    if (host && host.trigger && eventNamespace) {\n      let [eventType, ...args] = allArgs;\n      host.trigger(`${eventNamespace}:${eventType}`, ...args);\n    }\n  }\n\n  /**\n   * Describes the state that the task instance is in. Can be used for debugging,\n   * or potentially driving some UI state. Possible values are:\n   *\n   * - `\"dropped\"`: task instance was canceled before it started\n   * - `\"canceled\"`: task instance was canceled before it could finish\n   * - `\"finished\"`: task instance ran to completion (even if an exception was thrown)\n   * - `\"running\"`: task instance is currently running (returns true even if\n   *     is paused on a yielded promise)\n   * - `\"waiting\"`: task instance hasn't begun running yet (usually\n   *     because the task is using the {@linkcode TaskProperty#enqueue enqueue}\n   *     task modifier)\n   *\n   * The animated timeline examples on the [Task Concurrency](/docs/task-concurrency)\n   * docs page make use of this property.\n   *\n   * @name state\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n\n  /**\n   * True if the TaskInstance was canceled before it could\n   * ever start running. For example, calling\n   * {@linkcode Task#perform .perform()} twice on a\n   * task with the {@linkcode TaskProperty#drop drop} modifier applied\n   * will result in the second task instance being dropped.\n   *\n   * @name isDropped\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n\n  /**\n   * True if the task is still running.\n   *\n   * @name isRunning\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n\n  /**\n   * Event emitted when a new {@linkcode TaskInstance} starts executing.\n   *\n   * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n   *\n   * ```js\n   * import Component from '@glimmer/component';\n   * import { task } from 'ember-concurrency';\n   * import { on } from '@ember/object/evented';\n   *\n   * export default class MyComponent extends Component {\n   *   doSomething = task(async () => {\n   *     // ... does something\n   *   });\n   *\n   *   @on('doSomething:started')\n   *   onDoSomethingStarted(taskInstance) {\n   *     // ...\n   *   }\n   * }\n   * ```\n   *\n   * @event TaskInstance#TASK_NAME:started\n   * @param {TaskInstance} taskInstance - Task instance that was started\n   */\n\n  /**\n   * Event emitted when a {@linkcode TaskInstance} succeeds.\n   *\n   * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n   *\n   * ```js\n   * import Component from '@glimmer/component';\n   * import { task } from 'ember-concurrency';\n   * import { on } from '@ember/object/evented';\n   *\n   * export default class MyComponent extends Component {\n   *   doSomething = task(async () => {\n   *     // ... does something\n   *   });\n   *\n   *   @on('doSomething:succeeded')\n   *   onDoSomethingSucceeded(taskInstance) {\n   *     // ...\n   *   }\n   * }\n   * ```\n   *\n   * @event TaskInstance#TASK_NAME:succeeded\n   * @param {TaskInstance} taskInstance - Task instance that was succeeded\n   */\n\n  /**\n   * Event emitted when a {@linkcode TaskInstance} throws an an error that is\n   * not handled within the task itself.\n   *\n   * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n   *\n   * ```js\n   * import Component from '@glimmer/component';\n   * import { task } from 'ember-concurrency';\n   * import { on } from '@ember/object/evented';\n   *\n   * export default class MyComponent extends Component {\n   *   doSomething = task(async () => {\n   *     // ... does something\n   *   });\n   *\n   *   @on('doSomething:errored')\n   *   onDoSomethingErrored(taskInstance, error) {\n   *     // ...\n   *   }\n   * }\n   * ```\n   *\n   * @event TaskInstance#TASK_NAME:errored\n   * @param {TaskInstance} taskInstance - Task instance that was started\n   * @param {Error} error - Error that was thrown by the task instance\n   */\n\n  /**\n   * Event emitted when a {@linkcode TaskInstance} is canceled.\n   *\n   * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n   *\n   * ```js\n   * import Component from '@glimmer/component';\n   * import { task } from 'ember-concurrency';\n   * import { on } from '@ember/object/evented';\n   *\n   * export default class MyComponent extends Component {\n   *   doSomething = task(async () => {\n   *     // ... does something\n   *   });\n   *\n   *   @on('doSomething:canceled')\n   *   onDoSomethingCanceled(taskInstance, cancelationReason) {\n   *     // ...\n   *   }\n   * }\n   * ```\n   *\n   * @event TaskInstance#TASK_NAME:canceled\n   * @param {TaskInstance} taskInstance - Task instance that was started\n   * @param {string} cancelationReason - Cancelation reason that was was provided to {@linkcode TaskInstance#cancel}\n   */\n\n  /**\n   * Cancels the task instance. Has no effect if the task instance has\n   * already been canceled or has already finished running.\n   *\n   * @method cancel\n   * @memberof TaskInstance\n   * @instance\n   * @async\n   */\n\n  /**\n   * Returns a promise that resolves with the value returned\n   * from the task's (generator) function, or rejects with\n   * either the exception thrown from the task function, or\n   * an error with a `.name` property with value `\"TaskCancelation\"`.\n   *\n   * @method then\n   * @memberof TaskInstance\n   * @instance\n   * @return {Promise}\n   */\n\n  /**\n   * @method catch\n   * @memberof TaskInstance\n   * @instance\n   * @return {Promise}\n   */\n\n  /**\n   * @method finally\n   * @memberof TaskInstance\n   * @instance\n   * @return {Promise}\n   */\n}\n\nif (TRACKED_INITIAL_INSTANCE_STATE) {\n  Object.defineProperties(\n    TaskInstance.prototype,\n    TRACKED_INITIAL_INSTANCE_STATE,\n  );\n}\n","export const TASKABLE_MIXIN = {\n  _performCount: 0,\n\n  setState(state) {\n    this._performCount = this._performCount + (state.numPerformedInc || 0);\n\n    let isRunning = state.numRunning > 0;\n    let isQueued = state.numQueued > 0;\n    let derivedState = Object.assign({}, state, {\n      performCount: this._performCount,\n      isRunning,\n      isQueued,\n      isIdle: !isRunning && !isQueued,\n      state: isRunning ? 'running' : 'idle',\n    });\n    Object.assign(this, derivedState);\n  },\n\n  onState(state, task) {\n    if (task.onStateCallback) {\n      task.onStateCallback(state, task);\n    }\n  },\n};\n","import { setOwner, getOwner } from '@ember/application';\nimport EmberObject, { get, set } from '@ember/object';\nimport { isDestroying, registerDestructor } from '@ember/destroyable';\nimport { Task as BaseTask } from './external/task/task';\nimport { TaskInstance } from './task-instance';\nimport { TaskInstanceExecutor } from './external/task-instance/executor';\nimport { TASKABLE_MIXIN } from './taskable-mixin';\nimport { TRACKED_INITIAL_TASK_STATE } from './tracked-state';\nimport { CANCEL_KIND_LIFESPAN_END } from './external/task-instance/cancelation';\n\n/**\n  The `Task` object lives on a host Ember object (e.g.\n  a Component, Route, or Controller). You call the\n  {@linkcode Task#perform .perform()} method on this object\n  to create run individual {@linkcode TaskInstance}s,\n  and at any point, you can call the {@linkcode Task#cancelAll .cancelAll()}\n  method on this object to cancel all running or enqueued\n  {@linkcode TaskInstance}s.\n\n  <style>\n    .ignore-this--this-is-here-to-hide-constructor,\n    #Task { display: none }\n  </style>\n\n  @class Task\n*/\nexport class Task extends BaseTask {\n  /**\n   * `true` if any current task instances are running.\n   *\n   * @memberof Task\n   * @member {boolean} isRunning\n   * @instance\n   * @readOnly\n   */\n  /**\n   * `true` if any future task instances are queued.\n   *\n   * @memberof Task\n   * @member {boolean} isQueued\n   * @instance\n   * @readOnly\n   */\n  /**\n   * `true` if the task is not in the running or queued state.\n   *\n   * @memberof Task\n   * @member {boolean} isIdle\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The current state of the task: `\"running\"`, `\"queued\"` or `\"idle\"`.\n   *\n   * @memberof Task\n   * @member {string} state\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently started task instance.\n   *\n   * @memberof Task\n   * @member {TaskInstance} last\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that is currently running.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastRunning\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently performed task instance.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastPerformed\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that succeeded.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastSuccessful\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently completed task instance.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastComplete\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that errored.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastErrored\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently canceled task instance.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastCanceled\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that is incomplete.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastIncomplete\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The number of times this task has been performed.\n   *\n   * @memberof Task\n   * @member {number} performCount\n   * @instance\n   * @readOnly\n   */\n\n  constructor(options) {\n    super(options);\n\n    if (!isDestroying(this.context)) {\n      registerDestructor(this.context, () => {\n        this.cancelAll({\n          reason: 'the object it lives on was destroyed or unrendered',\n          cancelRequestKind: CANCEL_KIND_LIFESPAN_END,\n        });\n      });\n    }\n  }\n\n  /**\n   * Flags the task as linked to the parent task's lifetime. Must be called\n   * within another task's perform function. The task will be cancelled if the\n   * parent task is canceled as well.\n   *\n   * ember-concurrency will indicate when this may be needed.\n   *\n   * @method linked\n   * @memberof Task\n   * @instance\n   *\n   */\n\n  /**\n   * Flags the task as not linked to the parent task's lifetime. Must be called\n   * within another task's perform function. The task will NOT be cancelled if the\n   * parent task is canceled.\n   *\n   * This is useful for avoiding the so-called \"self-cancel loop\" for tasks.\n   * ember-concurrency will indicate when this may be needed.\n   *\n   * @method unlinked\n   * @memberof Task\n   * @instance\n   *\n   */\n\n  /**\n   * Creates a new {@linkcode TaskInstance} and attempts to run it right away.\n   * If running this task instance would increase the task's concurrency\n   * to a number greater than the task's maxConcurrency, this task\n   * instance might be immediately canceled (dropped), or enqueued\n   * to run at later time, after the currently running task(s) have finished.\n   *\n   * @method perform\n   * @memberof Task\n   * @param {*} arg* - args to pass to the task function\n   * @instance\n   *\n   * @fires TaskInstance#TASK_NAME:started\n   * @fires TaskInstance#TASK_NAME:succeeded\n   * @fires TaskInstance#TASK_NAME:errored\n   * @fires TaskInstance#TASK_NAME:canceled\n   *\n   */\n\n  /**\n   * Cancels all running or queued `TaskInstance`s for this Task.\n   * If you're trying to cancel a specific TaskInstance (rather\n   * than all of the instances running under this task) call\n   * `.cancel()` on the specific TaskInstance.\n   *\n   * @method cancelAll\n   * @memberof Task\n   * @param options.reason A descriptive reason the task was\n   *   cancelled. Defaults to `\".cancelAll() was explicitly called\n   *   on the Task\"`.\n   * @param options.resetState If true, will clear the task state\n   *   (`last*` and `performCount` properties will be set to initial\n   *   values). Defaults to false.\n   * @instance\n   * @async\n   *\n   */\n\n  get _isAlive() {\n    return !isDestroying(this.context);\n  }\n\n  _taskInstanceFactory(args, performType, linkedObject) {\n    let options = this._taskInstanceOptions(args, performType, linkedObject);\n    let taskInstance = new TaskInstance(options);\n    return taskInstance;\n  }\n\n  _clone() {\n    return new Task({\n      context: this.context,\n      debug: this.debug,\n      env: this.env,\n      generatorFactory: this.generatorFactory,\n      group: this.group,\n      hasEnabledEvents: this.hasEnabledEvents,\n      name: this.name,\n      onStateCallback: this.onStateCallback,\n      scheduler: this.scheduler,\n    });\n  }\n}\n\nif (TRACKED_INITIAL_TASK_STATE) {\n  Object.defineProperties(Task.prototype, TRACKED_INITIAL_TASK_STATE);\n}\n\nObject.assign(Task.prototype, TASKABLE_MIXIN);\n\nconst currentTaskInstanceSymbol = '__ec__encap_current_ti';\nexport class EncapsulatedTask extends Task {\n  constructor(options) {\n    super(options);\n    this.taskObj = options.taskObj;\n    this._encapsulatedTaskStates = new WeakMap();\n    this._encapsulatedTaskInstanceProxies = new WeakMap();\n  }\n\n  _getEncapsulatedTaskClass() {\n    let encapsulatedTaskImplClass = this._encapsulatedTaskImplClass;\n\n    if (!encapsulatedTaskImplClass) {\n      // eslint-disable-next-line ember/no-classic-classes\n      encapsulatedTaskImplClass = EmberObject.extend(this.taskObj, {\n        unknownProperty(key) {\n          let currentInstance = this[currentTaskInstanceSymbol];\n          return currentInstance ? currentInstance[key] : undefined;\n        },\n      });\n    }\n\n    return encapsulatedTaskImplClass;\n  }\n\n  _taskInstanceFactory(args, performType) {\n    let owner = getOwner(this.context);\n    let taskInstanceProxy;\n    let encapsulatedTaskImpl = this._getEncapsulatedTaskClass().create({\n      context: this.context,\n    });\n    setOwner(encapsulatedTaskImpl, owner);\n\n    let generatorFactory = () =>\n      encapsulatedTaskImpl.perform.apply(taskInstanceProxy, args);\n    let taskInstance = new TaskInstance({\n      task: this,\n      args,\n      executor: new TaskInstanceExecutor({\n        generatorFactory,\n        env: this.env,\n        debug: this.debug,\n      }),\n      performType,\n      hasEnabledEvents: this.hasEnabledEvents,\n    });\n    encapsulatedTaskImpl[currentTaskInstanceSymbol] = taskInstance;\n\n    this._encapsulatedTaskStates.set(taskInstance, encapsulatedTaskImpl);\n\n    taskInstanceProxy = this._wrappedEncapsulatedTaskInstance(taskInstance);\n\n    return taskInstanceProxy;\n  }\n\n  _wrappedEncapsulatedTaskInstance(taskInstance) {\n    if (!taskInstance) {\n      return null;\n    }\n\n    let _encapsulatedTaskInstanceProxies =\n      this._encapsulatedTaskInstanceProxies;\n    let proxy = _encapsulatedTaskInstanceProxies.get(taskInstance);\n\n    if (!proxy) {\n      let encapsulatedTaskImpl = this._encapsulatedTaskStates.get(taskInstance);\n\n      proxy = new Proxy(taskInstance, {\n        get(obj, prop) {\n          return prop in obj\n            ? obj[prop]\n            : get(encapsulatedTaskImpl, prop.toString());\n        },\n        set(obj, prop, value) {\n          if (prop in obj) {\n            obj[prop] = value;\n          } else {\n            set(encapsulatedTaskImpl, prop.toString(), value);\n          }\n          return true;\n        },\n        has(obj, prop) {\n          return prop in obj || prop in encapsulatedTaskImpl;\n        },\n        ownKeys(obj) {\n          return Reflect.ownKeys(obj).concat(\n            Reflect.ownKeys(encapsulatedTaskImpl),\n          );\n        },\n        defineProperty(obj, prop, descriptor) {\n          // Ember < 3.16 uses a WeakMap for value storage, keyed to the proxy.\n          // We need to ensure that when we use setProperties to update it, and\n          // it creates Meta, that it uses the proxy to key, otherwise we'll\n          // have two different values stores in Meta, one which won't render.\n          let proxy = _encapsulatedTaskInstanceProxies.get(taskInstance);\n          if (proxy) {\n            if (descriptor.get) {\n              descriptor.get = descriptor.get.bind(proxy);\n            } else if (proxy && descriptor.set) {\n              descriptor.set = descriptor.set.bind(proxy);\n            }\n          }\n\n          return Reflect.defineProperty(encapsulatedTaskImpl, prop, descriptor);\n        },\n        getOwnPropertyDescriptor(obj, prop) {\n          return prop in obj\n            ? Reflect.getOwnPropertyDescriptor(obj, prop)\n            : Reflect.getOwnPropertyDescriptor(encapsulatedTaskImpl, prop);\n        },\n      });\n\n      _encapsulatedTaskInstanceProxies.set(taskInstance, proxy);\n    }\n\n    return proxy;\n  }\n}\n","import { TaskGroup as TaskGroupBase } from './external/task/task-group';\nimport { TASKABLE_MIXIN } from './taskable-mixin';\nimport { TRACKED_INITIAL_TASK_STATE } from './tracked-state';\n\n/**\n * \"Task Groups\" provide a means for applying\n * task modifiers to groups of tasks. Once a {@linkcode Task} is declared\n * as part of a group task, modifiers like `drop` or `restartable`\n * will no longer affect the individual `Task`. Instead those\n * modifiers can be applied to the entire group.\n *\n * Turns the decorated property into a task group.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task group. For instance `maxConcurrency` or `keepLatest`.\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { task, taskGroup } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;taskGroup({ maxConcurrency: 5 }) chores;\n *\n *   &#64;task({ group: 'chores' })\n *   *mowLawn() {}\n *\n *   &#64;task({ group: 'chores' })\n *   *doDishes() {}\n * }\n * ```\n *\n * <style>\n *  .ignore-this--this-is-here-to-hide-constructor,\n *  #TaskGroup { display: none }\n * </style>\n *\n * @class TaskGroup\n */\nexport class TaskGroup extends TaskGroupBase {\n  /**\n   * Cancels all running or queued `TaskInstance`s for this task group.\n   * If you're trying to cancel a specific TaskInstance (rather\n   * than all of the instances running under this task group) call\n   * `.cancel()` on the specific TaskInstance.\n   *\n   * @method cancelAll\n   * @memberof TaskGroup\n   * @param options.reason A descriptive reason the task group was\n   *   cancelled. Defaults to `\".cancelAll() was explicitly called\n   *   on the Task\"`.\n   * @param options.resetState If true, will clear the task group state\n   *   (`last*` and `performCount` properties will be set to initial\n   *   values). Defaults to false.\n   * @instance\n   * @async\n   *\n   */\n  /**\n   * `true` if any current task instances are running.\n   *\n   * @memberof TaskGroup\n   * @member {boolean} isRunning\n   * @instance\n   * @readOnly\n   */\n  /**\n   * `true` if any future task instances are queued.\n   *\n   * @memberof TaskGroup\n   * @member {boolean} isQueued\n   * @instance\n   * @readOnly\n   */\n  /**\n   * `true` if the task is not in the running or queued state.\n   *\n   * @memberof TaskGroup\n   * @member {boolean} isIdle\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The current state of the task: `\"running\"`, `\"queued\"` or `\"idle\"`.\n   *\n   * @memberof TaskGroup\n   * @member {string} state\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently started task instance.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} last\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that is currently running.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastRunning\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently performed task instance.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastPerformed\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that succeeded.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastSuccessful\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently completed task instance.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastComplete\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that errored.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastErrored\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently canceled task instance.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastCanceled\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that is incomplete.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastIncomplete\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The number of times this task has been performed.\n   *\n   * @memberof TaskGroup\n   * @member {number} performCount\n   * @instance\n   * @readOnly\n   */\n}\n\nif (TRACKED_INITIAL_TASK_STATE) {\n  Object.defineProperties(TaskGroup.prototype, TRACKED_INITIAL_TASK_STATE);\n}\n\nObject.assign(TaskGroup.prototype, TASKABLE_MIXIN);\n","import { assert, deprecate } from '@ember/debug';\nimport { get } from '@ember/object';\nimport { addListener } from '@ember/object/events';\nimport { addObserver } from '@ember/object/observers';\nimport { scheduleOnce } from '@ember/runloop';\nimport {\n  TaskFactory as BaseTaskFactory,\n  registerModifier,\n} from './external/task-factory';\n\nimport { EMBER_ENVIRONMENT } from './ember-environment';\nimport EmberScheduler from './scheduler/ember-scheduler';\nimport { EncapsulatedTask, Task } from './task';\nimport { TaskGroup } from './task-group';\nimport { TaskProperty } from './task-properties';\n\nlet handlerCounter = 0;\n\nfunction registerOnPrototype(\n  addListenerOrObserver,\n  proto,\n  names,\n  taskName,\n  taskMethod,\n  once,\n) {\n  if (names && names.length > 0) {\n    for (let i = 0; i < names.length; ++i) {\n      let name = names[i];\n\n      let handlerName = `__ember_concurrency_handler_${handlerCounter++}`;\n      proto[handlerName] = makeTaskCallback(taskName, taskMethod, once);\n      addListenerOrObserver(proto, name, null, handlerName);\n    }\n  }\n}\n\nfunction makeTaskCallback(taskName, method, once) {\n  return function () {\n    let task = get(this, taskName);\n\n    if (once) {\n      scheduleOnce('actions', task, method, ...arguments);\n    } else {\n      task[method].apply(task, arguments);\n    }\n  };\n}\n\nconst ensureArray = (possibleArr) =>\n  Array.isArray(possibleArr) ? possibleArr : [possibleArr];\n\nregisterModifier('cancelOn', (factory, eventNames) =>\n  factory.addCancelEvents(...ensureArray(eventNames)),\n);\nregisterModifier('observes', (factory, propertyPaths) =>\n  factory.addObserverKeys(...ensureArray(propertyPaths)),\n);\nregisterModifier('on', (factory, eventNames) =>\n  factory.addPerformEvents(...ensureArray(eventNames)),\n);\n\nexport class TaskFactory extends BaseTaskFactory {\n  env = EMBER_ENVIRONMENT;\n\n  createTask(context) {\n    assert(\n      `Cannot create task if a task definition is not provided as generator function or encapsulated task.`,\n      this.taskDefinition,\n    );\n\n    let options = this.getTaskOptions(context);\n\n    if (typeof this.taskDefinition === 'object') {\n      return new EncapsulatedTask(\n        Object.assign({ taskObj: this.taskDefinition }, options),\n      );\n    } else {\n      return new Task(\n        Object.assign(\n          {\n            generatorFactory: (args) =>\n              this.taskDefinition.apply(context, args),\n          },\n          options,\n        ),\n      );\n    }\n  }\n\n  createTaskGroup(context) {\n    assert(\n      `A task definition is not expected for a task group.`,\n      !this.taskDefinition,\n    );\n\n    deprecate(\n      'Task Groups are deprecated. There is no direct replacement for Task Groups and some refactoring may be necessary.',\n      false,\n      {\n        id: 'ember-concurrency.deprecate-task-group',\n        for: 'ember-concurrency',\n        since: '4.0.5',\n        until: '5.0.0',\n      },\n    );\n\n    let options = this.getTaskOptions(context);\n\n    return new TaskGroup(options);\n  }\n\n  addCancelEvents(...cancelEventNames) {\n    this._cancelEventNames = this._cancelEventNames || [];\n    this._cancelEventNames.push(...cancelEventNames);\n    return this;\n  }\n\n  addObserverKeys(...keys) {\n    this._observes = this._observes || [];\n    this._observes.push(...keys);\n    return this;\n  }\n\n  addPerformEvents(...eventNames) {\n    this._eventNames = this._eventNames || [];\n    this._eventNames.push(...eventNames);\n    return this;\n  }\n\n  getModifier(name) {\n    let modifier = super.getModifier(name);\n    if (!modifier && typeof TaskProperty.prototype[name] === 'function') {\n      // Shim for compatibility with user-defined TaskProperty prototype\n      // extensions. To be removed when replaced with proper public API.\n      modifier = TaskProperty.prototype[name].bind(this);\n    }\n\n    assert(\n      `Task option '${name}' is not recognized as a supported option.`,\n      modifier,\n    );\n\n    return modifier;\n  }\n\n  getScheduler(schedulerPolicy, stateTrackingEnabled) {\n    return new EmberScheduler(schedulerPolicy, stateTrackingEnabled);\n  }\n\n  _setupEmberKVO(proto) {\n    // TODO: Does this make sense in a post-Ember object world?\n\n    registerOnPrototype(\n      addListener,\n      proto,\n      this._eventNames,\n      this.name,\n      'perform',\n      false,\n    );\n    registerOnPrototype(\n      addListener,\n      proto,\n      this._cancelEventNames,\n      this.name,\n      'cancelAll',\n      false,\n    );\n    registerOnPrototype(\n      addObserver,\n      proto,\n      this._observes,\n      this.name,\n      'perform',\n      true,\n    );\n  }\n\n  // Provided for compatibility with ember-concurrency TaskProperty extension\n  // methods\n  get taskFn() {\n    return this.taskDefinition;\n  }\n\n  set taskFn(fn) {\n    this.setTaskDefinition(fn);\n  }\n}\n","import {\n  createTaskDecorator,\n  createTaskGroupDecorator,\n  lastValue as nativeLastValue,\n} from './external/task-decorators';\nimport { TaskFactory as EmberTaskFactory } from './task-factory';\n\nexport const lastValue = nativeLastValue;\n\n/**\n * A Task is a cancelable, restartable, asynchronous operation that\n * is driven by a generator function. Tasks are automatically canceled\n * when the object they live on is destroyed (e.g. a Component\n * is unrendered).\n *\n * Turns the decorated generator function into a task.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task. For instance `maxConcurrency`, `on`, `group` or `keepLatest`.\n *\n * By default, tasks have no concurrency constraints\n * (multiple instances of a task can be running at the same time)\n * but much of a power of tasks lies in proper usage of Task Modifiers\n * that you can apply to a task.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by decorating an object that defines a `perform` generator\n * method.\n *\n * ```js\n * import Component from '@ember/component';\n * import { task } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;task\n *   *plainTask() {}\n *\n *   &#64;task({ maxConcurrency: 5, keepLatest: true, cancelOn: 'click' })\n *   *taskWithModifiers() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task modifier options\n * @param {string|string[]} [options.cancelOn] Events to cancel task on. Applies only to `&#64;ember/component`\n * @param {boolean} [options.enqueue] Sets `enqueue` modifier on task if `true`\n * @param {boolean} [options.evented] Enables [task lifecycle events](/docs/advanced/lifecycle-events) for this Task, if `true`\n * @param {boolean} [options.debug] Enables task debugging if `true`\n * @param {boolean} [options.drop] Sets `drop` modifier on task if `true`\n * @param {string} [options.group] Associates task with the group specified\n * @param {boolean} [options.keepLatest] Sets `keepLatest` modifier on task if `true`\n * @param {number} [options.maxConcurrency] Sets the maximum number of running task instances for the task\n * @param {string|string[]} [options.observes] Properties to watch and cause task to be performed when they change\n * @param {string|string[]} [options.on] Events to perform task on. Applies only to `&#64;ember/component`\n * @param {function?} [options.onState] Callback to use for state tracking. May be set to `null` to disable state tracking.\n * @param {boolean} [options.restartable] Sets `restartable` modifier on task if `true`\n * @return {Task}\n */\nexport const task = createTaskDecorator({}, EmberTaskFactory);\n\n/**\n * Turns the decorated generator function into a task and applies the\n * `drop` modifier.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task. For instance `maxConcurrency`, `on`, or `group`.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by decorating an object that defines a `perform` generator\n * method.\n *\n * ```js\n * import Component from '@ember/component';\n * import { task, dropTask } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;task\n *   *plainTask() {}\n *\n *   &#64;dropTask({ cancelOn: 'click' })\n *   *myDropTask() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n * @return {Task}\n */\nexport const dropTask = createTaskDecorator({ drop: true }, EmberTaskFactory);\n\n/**\n * Turns the decorated generator function into a task and applies the\n * `enqueue` modifier.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task. For instance `maxConcurrency`, `on`, or `group`.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by decorating an object that defines a `perform` generator\n * method.\n *\n * ```js\n * import Component from '@ember/component';\n * import { task, enqueueTask } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;task\n *   *plainTask() {}\n *\n *   &#64;enqueueTask({ cancelOn: 'click' })\n *   *myEnqueueTask() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n * @return {Task}\n */\nexport const enqueueTask = createTaskDecorator(\n  {\n    enqueue: true,\n  },\n  EmberTaskFactory,\n);\n\n/**\n * Turns the decorated generator function into a task and applies the\n * `keepLatest` modifier.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task. For instance `maxConcurrency`, `on`, or `group`.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by decorating an object that defines a `perform` generator\n * method.\n *\n * ```js\n * import Component from '@ember/component';\n * import { task, keepLatestTask } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;task\n *   *plainTask() {}\n *\n *   &#64;keepLatestTask({ cancelOn: 'click' })\n *   *myKeepLatestTask() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n * @return {Task}\n */\nexport const keepLatestTask = createTaskDecorator(\n  {\n    keepLatest: true,\n  },\n  EmberTaskFactory,\n);\n\n/**\n * Turns the decorated generator function into a task and applies the\n * `restartable` modifier.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task. For instance `maxConcurrency`, `on`, or `group`.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by decorating an object that defines a `perform` generator\n * method.\n *\n * ```js\n * import Component from '@ember/component';\n * import { task, restartableTask } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;task\n *   *plainTask() {}\n *\n *   &#64;restartableTask({ cancelOn: 'click' })\n *   *myRestartableTask() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n * @return {Task}\n */\nexport const restartableTask = createTaskDecorator(\n  {\n    restartable: true,\n  },\n  EmberTaskFactory,\n);\n\n/**\n * \"Task Groups\" provide a means for applying\n * task modifiers to groups of tasks. Once a {@linkcode Task} is declared\n * as part of a group task, modifiers like `drop` or `restartable`\n * will no longer affect the individual `Task`. Instead those\n * modifiers can be applied to the entire group.\n *\n * Turns the decorated property into a task group.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task group. For instance `maxConcurrency` or `keepLatest`.\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { task, taskGroup } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;taskGroup({ maxConcurrency: 5 }) chores;\n *\n *   &#64;task({ group: 'chores' })\n *   *mowLawn() {}\n *\n *   &#64;task({ group: 'chores' })\n *   *doDishes() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n * @return {TaskGroup}\n */\nexport const taskGroup = createTaskGroupDecorator({}, EmberTaskFactory);\n\n/**\n * Turns the decorated property into a task group and applies the\n * `drop` modifier.\n *\n * Optionally takes a hash of further options that will be applied as modifiers\n * to the task group.\n *\n * @function\n * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n * @return {TaskGroup}\n */\nexport const dropTaskGroup = createTaskGroupDecorator(\n  {\n    drop: true,\n  },\n  EmberTaskFactory,\n);\n\n/**\n * Turns the decorated property into a task group and applies the\n * `enqueue` modifier.\n *\n * Optionally takes a hash of further options that will be applied as modifiers\n * to the task group.\n *\n * @function\n * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n * @return {TaskGroup}\n */\nexport const enqueueTaskGroup = createTaskGroupDecorator(\n  {\n    enqueue: true,\n  },\n  EmberTaskFactory,\n);\n\n/**\n * Turns the decorated property into a task group and applies the\n * `keepLatest` modifier.\n *\n * Optionally takes a hash of further options that will be applied as modifiers\n * to the task group.\n *\n * @function\n * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n * @return {TaskGroup}\n */\nexport const keepLatestTaskGroup = createTaskGroupDecorator(\n  { keepLatest: true },\n  EmberTaskFactory,\n);\n\n/**\n * Turns the decorated property into a task group and applies the\n * `restartable` modifier.\n *\n * Optionally takes a hash of further options that will be applied as modifiers\n * to the task group.\n *\n * @function\n * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n * @return {TaskGroup}\n */\nexport const restartableTaskGroup = createTaskGroupDecorator(\n  { restartable: true },\n  EmberTaskFactory,\n);\n","import { assert, deprecate } from '@ember/debug';\nimport {\n  task as taskDecorator,\n  taskGroup as taskGroupDecorator,\n} from './task-decorators';\nimport { TaskFactory } from './task-factory';\nimport {\n  TaskGroupProperty,\n  TaskProperty,\n  taskComputed,\n  taskFactorySymbol,\n} from './task-properties';\n\n// eslint-disable-next-line no-unused-vars\nimport { TaskGroup } from './task-group';\n\n/**\n * A Task is a cancelable, restartable, asynchronous operation that\n * is driven by an async function. Tasks are automatically canceled\n * when the object they live on is destroyed (e.g. a Component\n * is unrendered).\n *\n * To define a task, use the `task(...)` function, and pass in\n * an async arrow function, which will be invoked when the task\n * is performed. Async functions with the await keyword can\n * be used to elegantly express asynchronous, cancelable\n * operations.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by passing in an object that defined a `perform` async\n * function property.\n *\n * The following Component defines a task called `myTask` that,\n * when performed, prints a message to the console, sleeps for 1 second,\n * prints a final message to the console, and then completes.\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { task, timeout } from 'ember-concurrency';\n *\n * export default class MyComponent extends Component {\n *   myTask = task(async () => {\n *     console.log(\"Pausing for a second...\");\n *     await timeout(1000);\n *     console.log(\"Done!\");\n *   });\n * }\n * ```\n *\n * ```hbs\n * <button {{action myTask.perform}}>Perform Task</button>\n * ```\n *\n * By default, tasks have no concurrency constraints\n * (multiple instances of a task can be running at the same time)\n * but much of a power of tasks lies in proper usage of Task Modifiers\n * that you can apply to a task.\n *\n * @param {function} taskFunction the async function backing the task.\n * @returns {TaskProperty}\n */\nexport function task(taskFnOrProtoOrDecoratorOptions, key, descriptor) {\n  assert(\n    `It appears you're attempting to use the new task(async () => { ... }) syntax, but the async arrow task function you've provided is not being properly compiled by Babel.\\n\\nPossible causes / remedies:\\n\\n1. You must pass the async function expression directly to the task() function (it is not currently supported to pass in a variable containing the async arrow fn, or any other kind of indirection)\\n2. The new task syntax is only supported by native classes. Ensure that this is one.\\n3. If this code is in an addon, please ensure the addon specifies ember-concurrency \"2.3.0\" or higher in \"dependencies\" (not \"devDependencies\")\\n4. Ensure that there is only one version of ember-concurrency v2.3.0+ being used in your project (including nested dependencies) and consider using npm/yarn/pnpm resolutions to enforce a single version is used\\n5. Ensure that you have registered the Babel transform that Ember Concurrency uses to transform tasks in the \"async-arrow\" notation, see https://ember-concurrency.com/docs/v4-upgrade`,\n    !isUntranspiledAsyncFn(arguments[arguments.length - 1]),\n  );\n\n  if (\n    isDecoratorOptions(taskFnOrProtoOrDecoratorOptions) ||\n    (key && descriptor)\n  ) {\n    return taskDecorator(...arguments);\n  } else {\n    return buildClassicTaskProperty(taskFnOrProtoOrDecoratorOptions);\n  }\n}\n\nfunction isUntranspiledAsyncFn(obj) {\n  return obj && obj.constructor && obj.constructor.name === 'AsyncFunction';\n}\n\n/**\n * Build and return a \"classic\" TaskProperty, which is essentially a subclass of a Computed Property\n * descriptor that can be used to define Tasks on classic Ember.Objects.\n *\n * @private\n */\nfunction buildClassicTaskProperty(taskFn) {\n  const taskProperty = taskComputed(function () {\n    taskProperty[taskFactorySymbol].setTaskDefinition(taskProperty.taskFn);\n    return taskProperty[taskFactorySymbol].createTask(this);\n  });\n\n  deprecate(\n    \"Using task() in any form other than `taskName = task(async () => {})` is deprecated. Please use the modern syntax instead (and consider using one of ember-concurrency's codemods).\",\n    false,\n    {\n      id: 'ember-concurrency.deprecate-classic-task-api',\n      for: 'ember-concurrency',\n      since: '4.0.5',\n      until: '5.0.0',\n    },\n  );\n\n  taskProperty.taskFn = taskFn;\n\n  taskProperty[taskFactorySymbol] = new TaskFactory();\n\n  Object.setPrototypeOf(taskProperty, TaskProperty.prototype);\n\n  return taskProperty;\n}\n\n/**\n * \"Task Groups\" provide a means for applying\n * task modifiers to groups of tasks. Once a {@linkcode Task} is declared\n * as part of a group task, modifiers like `drop` or `restartable`\n * will no longer affect the individual `Task`. Instead those\n * modifiers can be applied to the entire group.\n *\n * ```js\n * import { task, taskGroup } from 'ember-concurrency';\n *\n * export default class MyController extends Controller {\n *   &#64;taskGroup({ drop: true }) chores;\n *\n *   &#64;task({ group: 'chores' }) mowLawn = taskFn;\n *   &#64;task({ group: 'chores' }) doDishes = taskFn;\n *   &#64;task({ group: 'chores' }) changeDiapers = taskFn;\n * }\n * ```\n *\n * @returns {TaskGroup}\n */\nexport function taskGroup(possibleDecoratorOptions, key, descriptor) {\n  if (isDecoratorOptions(possibleDecoratorOptions) || (key && descriptor)) {\n    return taskGroupDecorator(...arguments);\n  } else {\n    let tp = taskComputed(function (key) {\n      tp[taskFactorySymbol].setName(key);\n      return tp[taskFactorySymbol].createTaskGroup(this);\n    });\n\n    tp[taskFactorySymbol] = new TaskFactory();\n\n    Object.setPrototypeOf(tp, TaskGroupProperty.prototype);\n\n    return tp;\n  }\n}\n\nfunction isDecoratorOptions(possibleOptions) {\n  if (!possibleOptions) {\n    return false;\n  }\n  if (typeof possibleOptions === 'function') {\n    return false;\n  }\n\n  if (\n    typeof possibleOptions === 'object' &&\n    'perform' in possibleOptions &&\n    typeof possibleOptions.perform === 'function'\n  ) {\n    return false;\n  }\n\n  return Object.getPrototypeOf(possibleOptions) === Object.prototype;\n}\n","import { assert } from '@ember/debug';\nimport RSVP, { Promise } from 'rsvp';\nimport { TaskInstance } from './task-instance';\nimport { cancelableSymbol, Yieldable } from './external/yieldables';\n\n/**\n * A cancelation-aware variant of [Promise.all](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all).\n * The normal version of a `Promise.all` just returns a regular, uncancelable\n * Promise. The `ember-concurrency` variant of `all()` has the following\n * additional behavior:\n *\n * - if the task that `yield`ed `all()` is canceled, any of the\n *   {@linkcode TaskInstance}s passed in to `all` will be canceled\n * - if any of the {@linkcode TaskInstance}s (or regular promises) passed in reject (or\n *   are canceled), all of the other unfinished `TaskInstance`s will\n *   be automatically canceled.\n *\n * [Check out the \"Awaiting Multiple Child Tasks example\"](/docs/examples/joining-tasks)\n */\nexport const all = taskAwareVariantOf(RSVP.Promise, 'all', identity);\n\n/**\n * A cancelation-aware variant of [RSVP.allSettled](https://api.emberjs.com/ember/release/functions/rsvp/allSettled).\n * The normal version of a `RSVP.allSettled` just returns a regular, uncancelable\n * Promise. The `ember-concurrency` variant of `allSettled()` has the following\n * additional behavior:\n *\n * - if the task that `yield`ed `allSettled()` is canceled, any of the\n *   {@linkcode TaskInstance}s passed in to `allSettled` will be canceled\n */\nexport const allSettled = taskAwareVariantOf(RSVP, 'allSettled', identity);\n\n/**\n * A cancelation-aware variant of [Promise.race](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race).\n * The normal version of a `Promise.race` just returns a regular, uncancelable\n * Promise. The `ember-concurrency` variant of `race()` has the following\n * additional behavior:\n *\n * - if the task that `yield`ed `race()` is canceled, any of the\n *   {@linkcode TaskInstance}s passed in to `race` will be canceled\n * - once any of the tasks/promises passed in complete (either success, failure,\n *   or cancelation), any of the {@linkcode TaskInstance}s passed in will be canceled\n *\n * [Check out the \"Awaiting Multiple Child Tasks example\"](/docs/examples/joining-tasks)\n */\nexport const race = taskAwareVariantOf(Promise, 'race', identity);\n\n/**\n * A cancelation-aware variant of [RSVP.hash](https://api.emberjs.com/ember/release/functions/rsvp/hash).\n * The normal version of a `RSVP.hash` just returns a regular, uncancelable\n * Promise. The `ember-concurrency` variant of `hash()` has the following\n * additional behavior:\n *\n * - if the task that `yield`ed `hash()` is canceled, any of the\n *   {@linkcode TaskInstance}s passed in to `hash` will be canceled\n * - if any of the items rejects/cancels, all other cancelable items\n *   (e.g. {@linkcode TaskInstance}s) will be canceled\n */\nexport const hash = taskAwareVariantOf(RSVP, 'hash', getValues);\n\n/**\n * A cancelation-aware variant of [RSVP.hashSettled](https://api.emberjs.com/ember/release/functions/rsvp/hashSettled).\n * The normal version of a `RSVP.hashSettled` just returns a regular, uncancelable\n * Promise. The `ember-concurrency` variant of `hashSettled()` has the following\n * additional behavior:\n *\n * - if the task that `yield`ed `hashSettled()` is canceled, any of the\n *   {@linkcode TaskInstance}s passed in to `hashSettled` will be canceled\n */\nexport const hashSettled = taskAwareVariantOf(RSVP, 'hashSettled', getValues);\n\nfunction identity(obj) {\n  return obj;\n}\n\nfunction getValues(obj) {\n  return Object.keys(obj).map((k) => obj[k]);\n}\n\nfunction castForPromiseHelper(castable) {\n  if (castable) {\n    if (castable instanceof TaskInstance) {\n      // Mark TaskInstances, including those that performed synchronously and\n      // have finished already, as having their errors handled, as if they had\n      // been then'd, which this is emulating.\n      castable.executor.asyncErrorsHandled = true;\n    } else if (castable instanceof Yieldable) {\n      // Cast to promise\n      return castable._toPromise();\n    }\n  }\n\n  return castable;\n}\n\nfunction castAwaitables(arrOrHash, callback) {\n  if (Array.isArray(arrOrHash)) {\n    return arrOrHash.map(callback);\n  } else if (typeof arrOrHash === 'object' && arrOrHash !== null) {\n    let obj = {};\n    Object.keys(arrOrHash).forEach((key) => {\n      obj[key] = callback(arrOrHash[key]);\n    });\n    return obj;\n  } else {\n    // :shruggie:\n    return arrOrHash;\n  }\n}\n\nfunction taskAwareVariantOf(obj, method, getItems) {\n  return function (awaitable) {\n    let awaitables = castAwaitables(awaitable, castForPromiseHelper);\n\n    let items = getItems(awaitables);\n    assert(`'${method}' expects an array.`, Array.isArray(items));\n\n    let defer = RSVP.defer();\n\n    obj[method](awaitables).then(defer.resolve, defer.reject);\n\n    let hasCancelled = false;\n    let cancelAll = () => {\n      if (hasCancelled) {\n        return;\n      }\n      hasCancelled = true;\n      items.forEach((it) => {\n        if (it) {\n          if (it instanceof TaskInstance) {\n            it.cancel();\n          } else if (typeof it[cancelableSymbol] === 'function') {\n            it[cancelableSymbol]();\n          }\n        }\n      });\n    };\n\n    let promise = defer.promise.finally(cancelAll);\n    promise[cancelableSymbol] = cancelAll;\n    return promise;\n  };\n}\n","import { assert, deprecate } from '@ember/debug';\nimport { get } from '@ember/object';\nimport { addObserver, removeObserver } from '@ember/object/observers';\nimport { cancel, schedule } from '@ember/runloop';\nimport { EmberYieldable, isEventedObject } from './utils';\n\nclass WaitForQueueYieldable extends EmberYieldable {\n  constructor(queueName) {\n    super();\n    this.queueName = queueName;\n  }\n\n  onYield(state) {\n    let timerId;\n\n    try {\n      timerId = schedule(this.queueName, () => state.next());\n    } catch (error) {\n      state.throw(error);\n    }\n\n    return () => cancel(timerId);\n  }\n}\n\nclass WaitForEventYieldable extends EmberYieldable {\n  constructor(object, eventName) {\n    super();\n    this.object = object;\n    this.eventName = eventName;\n    this.usesDOMEvents = false;\n  }\n\n  on(callback) {\n    if (typeof this.object.addEventListener === 'function') {\n      // assume that we're dealing with a DOM `EventTarget`.\n      this.usesDOMEvents = true;\n      this.object.addEventListener(this.eventName, callback);\n    } else {\n      this.object.on(this.eventName, callback);\n    }\n  }\n\n  off(callback) {\n    if (this.usesDOMEvents) {\n      this.object.removeEventListener(this.eventName, callback);\n    } else {\n      this.object.off(this.eventName, callback);\n    }\n  }\n\n  onYield(state) {\n    let fn = null;\n    let disposer = () => {\n      fn && this.off(fn);\n      fn = null;\n    };\n\n    fn = (event) => {\n      disposer();\n      state.next(event);\n    };\n\n    this.on(fn);\n\n    return disposer;\n  }\n}\n\nclass WaitForPropertyYieldable extends EmberYieldable {\n  constructor(object, key, predicateCallback = Boolean) {\n    super();\n    this.object = object;\n    this.key = key;\n\n    deprecate(\n      'waitForProperty is deprecated due to its use of observers. Consider using a polling approach instead.',\n      false,\n      {\n        id: 'ember-concurrency.deprecate-wait-for-property',\n        for: 'ember-concurrency',\n        since: '4.0.5',\n        until: '5.0.0',\n      },\n    );\n\n    if (typeof predicateCallback === 'function') {\n      this.predicateCallback = predicateCallback;\n    } else {\n      this.predicateCallback = (v) => v === predicateCallback;\n    }\n  }\n\n  onYield(state) {\n    let observerBound = false;\n    let observerFn = () => {\n      let value = get(this.object, this.key);\n      let predicateValue = this.predicateCallback(value);\n      if (predicateValue) {\n        state.next(value);\n        return true;\n      }\n    };\n\n    if (!observerFn()) {\n      // eslint-disable-next-line ember/no-observers\n      addObserver(this.object, this.key, null, observerFn);\n      observerBound = true;\n    }\n\n    return () => {\n      if (observerBound && observerFn) {\n        removeObserver(this.object, this.key, null, observerFn);\n      }\n    };\n  }\n}\n\n/**\n * Use `waitForQueue` to pause the task until a certain run loop queue is reached.\n *\n * ```js\n * import { task, waitForQueue } from 'ember-concurrency';\n * export default class MyComponent extends Component {\n *   &#64;task *myTask() {\n *     yield waitForQueue('afterRender');\n *     console.log(\"now we're in the afterRender queue\");\n *   }\n * }\n * ```\n *\n * @param {string} queueName the name of the Ember run loop queue\n */\nexport function waitForQueue(queueName) {\n  return new WaitForQueueYieldable(queueName);\n}\n\n/**\n * Use `waitForEvent` to pause the task until an event is fired. The event\n * can either be a jQuery event or an Ember.Evented event (or any event system\n * where the object supports `.on()` `.one()` and `.off()`).\n *\n * ```js\n * import { task, waitForEvent } from 'ember-concurrency';\n * export default class MyComponent extends Component {\n *   &#64;task *myTask() {\n *     console.log(\"Please click anywhere..\");\n *     let clickEvent = yield waitForEvent($('body'), 'click');\n *     console.log(\"Got event\", clickEvent);\n *\n *     let emberEvent = yield waitForEvent(this, 'foo');\n *     console.log(\"Got foo event\", emberEvent);\n *\n *     // somewhere else: component.trigger('foo', { value: 123 });\n *   }\n * }\n * ```\n *\n * @param {object} object the Ember Object, jQuery element, or other object with .on() and .off() APIs\n *                 that the event fires from\n * @param {function} eventName the name of the event to wait for\n */\nexport function waitForEvent(object, eventName) {\n  assert(\n    `${object} must include Ember.Evented (or support \\`.on()\\` and \\`.off()\\`) or DOM EventTarget (or support \\`addEventListener\\` and  \\`removeEventListener\\`) to be able to use \\`waitForEvent\\``,\n    isEventedObject(object),\n  );\n  return new WaitForEventYieldable(object, eventName);\n}\n\n/**\n * Use `waitForProperty` to pause the task until a property on an object\n * changes to some expected value. This can be used for a variety of use\n * cases, including synchronizing with another task by waiting for it\n * to become idle, or change state in some other way. If you omit the\n * callback, `waitForProperty` will resume execution when the observed\n * property becomes truthy. If you provide a callback, it'll be called\n * immediately with the observed property's current value, and multiple\n * times thereafter whenever the property changes, until you return\n * a truthy value from the callback, or the current task is canceled.\n * You can also pass in a non-Function value in place of the callback,\n * in which case the task will continue executing when the property's\n * value becomes the value that you passed in.\n *\n * ```js\n * import { task, waitForProperty } from 'ember-concurrency';\n * export default class MyComponent extends Component {\n *   &#64;tracked foo = 0;\n *\n *   &#64;task *myTask() {\n *     console.log(\"Waiting for `foo` to become 5\");\n *\n *     yield waitForProperty(this, 'foo', v => v === 5);\n *     // alternatively: yield waitForProperty(this, 'foo', 5);\n *\n *     // somewhere else: this.foo = 5;\n *\n *     console.log(\"`foo` is 5!\");\n *\n *     // wait for another task to be idle before running:\n *     yield waitForProperty(this, 'otherTask.isIdle');\n *     console.log(\"otherTask is idle!\");\n *   }\n * }\n * ```\n *\n * @param {object} object an object (most likely an Ember Object)\n * @param {string} key the property name that is observed for changes\n * @param {function} callbackOrValue a Function that should return a truthy value\n *                                   when the task should continue executing, or\n *                                   a non-Function value that the watched property\n *                                   needs to equal before the task will continue running\n */\nexport function waitForProperty(object, key, predicateCallback) {\n  return new WaitForPropertyYieldable(object, key, predicateCallback);\n}\n","// eslint-disable-next-line ember/no-classic-components\nimport EmberComponent from '@ember/component';\nimport Helper from '@ember/component/helper';\nimport { assert, runInDebug } from '@ember/debug';\n\nimport type { ComponentLike } from '@glint/template';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction UNINITIALIZED() { }\n\nexport type ElementFromTagName<T extends string> = T extends keyof HTMLElementTagNameMap\n  ? HTMLElementTagNameMap[T]\n  : Element;\n\ntype Positional<T extends string> = [name: T];\ntype Return<T extends string> = ComponentLike<{\n  Element: ElementFromTagName<T>;\n  Blocks: { default: [] };\n}>;\n\nexport interface ElementSignature<T extends string> {\n  Args: {\n    Positional: Positional<T>;\n  };\n  Return: Return<T> | undefined;\n}\n\nexport default class ElementHelper<T extends string> extends Helper<ElementSignature<T>> {\n  tagName: string | (() => void) = UNINITIALIZED;\n  componentClass?: Return<T>;\n\n  compute(params: Positional<T>, hash: object) {\n    assert('The `element` helper takes a single positional argument', params.length === 1);\n    assert(\n      'The `element` helper does not take any named arguments',\n      Object.keys(hash).length === 0\n    );\n\n    let tagName = params[0];\n\n    if (tagName !== this.tagName) {\n      this.tagName = tagName;\n\n      if (typeof tagName === 'string') {\n        this.componentClass =\n          class DynamicElement extends EmberComponent {\n            tagName = tagName;\n          } as unknown as Return<T>;\n      } else {\n        this.componentClass = undefined;\n\n        runInDebug(() => {\n          let message = 'The argument passed to the `element` helper must be a string';\n\n          try {\n            message += ` (you passed \\`${tagName}\\`)`;\n          } catch (e) {\n            // ignore\n          }\n\n          assert(message, tagName === undefined || tagName === null);\n        });\n      }\n    }\n\n    return this.componentClass;\n  }\n}\n","function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _initializerDefineProperty(target, property, descriptor, context) {\n  if (!descriptor) return;\n  Object.defineProperty(target, property, {\n    enumerable: descriptor.enumerable,\n    configurable: descriptor.configurable,\n    writable: descriptor.writable,\n    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n  });\n}\n\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object.keys(descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n\n  if (desc.initializer === void 0) {\n    Object.defineProperty(target, property, desc);\n    desc = null;\n  }\n\n  return desc;\n}\n\nexport { _defineProperty as _, _applyDecoratedDescriptor as a, _initializerDefineProperty as b };\n","const SHIFT_KEY_MAP = {\n  A: 'a',\n  B: 'b',\n  C: 'c',\n  D: 'd',\n  E: 'e',\n  F: 'f',\n  G: 'g',\n  H: 'h',\n  I: 'i',\n  J: 'j',\n  K: 'k',\n  L: 'l',\n  M: 'm',\n  N: 'n',\n  O: 'o',\n  P: 'p',\n  Q: 'q',\n  R: 'r',\n  S: 's',\n  T: 't',\n  U: 'u',\n  V: 'v',\n  W: 'w',\n  X: 'x',\n  Y: 'y',\n  Z: 'z',\n  '!': '1',\n  '@': '2',\n  '#': '3',\n  $: '4',\n  '%': '5',\n  '^': '6',\n  '&': '7',\n  '*': '8',\n  '(': '9',\n  ')': '0',\n  _: '-',\n  '+': '=',\n  '<': ',',\n  '>': '.',\n  '?': '/',\n  ':': ';',\n  '\"': \"'\",\n  '~': '`',\n  '{': '[',\n  '}': ']',\n  '|': '\\\\'\n};\nconst MAC_ALT_KEY_MAP = {\n  å: 'a',\n  b: 'b',\n  ç: 'c',\n  '∂': 'd',\n  // 'Dead': 'e',\n  ƒ: 'f',\n  '©': 'g',\n  '˙': 'h',\n  // 'Dead': 'i',\n  '∆': 'j',\n  '˚': 'k',\n  '¬': 'l',\n  µ: 'm',\n  // 'Dead': 'n',\n  ø: 'o',\n  π: 'p',\n  œ: 'q',\n  '®': 'r',\n  ß: 's',\n  '†': 't',\n  // 'Dead': 'u',\n  '√': 'v',\n  '∑': 'w',\n  '≈': 'x',\n  '¥': 'y',\n  Ω: 'z',\n  '¡': '1',\n  '™': '2',\n  '£': '3',\n  '¢': '4',\n  '∞': '5',\n  '§': '6',\n  '¶': '7',\n  '•': '8',\n  ª: '9',\n  º: '0',\n  '–': '-',\n  '≠': '=',\n  '≤': ',',\n  '≥': '.',\n  '÷': '/',\n  '…': ';',\n  æ: \"'\",\n  // 'Dead': '`',\n  '“': '[',\n  '‘': ']',\n  '«': '\\\\'\n};\nconst MAC_SHIFT_ALT_KEY_MAP = {\n  Å: 'a',\n  ı: 'b',\n  // 'Dead': 'c',\n  Î: 'd',\n  // 'Dead': 'e',\n  Ï: 'f',\n  '˝': 'g',\n  Ó: 'h',\n  ˆ: 'i',\n  Ô: 'j',\n  '': 'k',\n  Ò: 'l',\n  Â: 'm',\n  '˜': 'n',\n  Ø: 'o',\n  // 'Dead': 'p',\n  Œ: 'q',\n  '‰': 'r',\n  Í: 's',\n  ˇ: 't',\n  '¨': 'u',\n  '◊': 'v',\n  '„': 'w',\n  '˛': 'x',\n  Á: 'y',\n  '¸': 'z',\n  '⁄': '1',\n  '€': '2',\n  '‹': '3',\n  '›': '4',\n  ﬁ: '5',\n  ﬂ: '6',\n  '‡': '7',\n  '°': '8',\n  '·': '9',\n  '‚': '0',\n  '—': '-',\n  '±': '=',\n  '¯': ',',\n  '˘': '.',\n  '¿': '/',\n  Ú: ';',\n  Æ: \"'\",\n  '`': '`',\n  '”': '[',\n  '’': ']',\n  '»': '\\\\'\n};\n\nexport { MAC_ALT_KEY_MAP, MAC_SHIFT_ALT_KEY_MAP, SHIFT_KEY_MAP };\n","var validModifiers = ['alt', 'ctrl', 'meta', 'shift', 'cmd'];\n\nexport { validModifiers as default };\n","import { helper } from '@ember/component/helper';\nimport { assert } from '@ember/debug';\nimport isKey from '../utils/is-key.js';\nimport listenerName from '../utils/listener-name.js';\nimport '../utils/keyboard-listener.js';\nimport '../_rollupPluginBabelHelpers-30c82890.js';\nimport '../utils/platform.js';\nimport '../fixtures/key-maps.js';\nimport '../fixtures/modifiers-array.js';\nimport '../utils/get-mouse-name.js';\nimport '@ember/utils';\nimport '../utils/get-cmd-key.js';\n\nvar ifKey = helper(function ifKey([keyCombo, callback]\n/*, named*/\n) {\n  return function (event) {\n    assert('ember-keyboard: You must pass a function as the second argument to the `if-key` helper', typeof callback === 'function');\n    assert('ember-keyboard: The `if-key` helper expects to be invoked with a KeyboardEvent', event instanceof KeyboardEvent);\n\n    if (isKey(listenerName(event.type, keyCombo), event)) {\n      callback(event);\n    }\n  };\n});\n\nexport { ifKey as default };\n","import { a as _applyDecoratedDescriptor, b as _initializerDefineProperty, _ as _defineProperty } from '../_rollupPluginBabelHelpers-30c82890.js';\nimport Helper from '@ember/component/helper';\nimport { assert } from '@ember/debug';\nimport { inject } from '@ember/service';\nimport listenerName from '../utils/listener-name.js';\nimport '../utils/get-cmd-key.js';\n\nvar _class2, _descriptor;\n\nlet _class = (_class2 = class _class2 extends Helper {\n  constructor(...args) {\n    super(...args);\n\n    _initializerDefineProperty(this, \"keyboard\", _descriptor, this);\n\n    _defineProperty(this, \"keyCombo\", void 0);\n\n    _defineProperty(this, \"callback\", void 0);\n\n    _defineProperty(this, \"keyboardActivated\", true);\n\n    _defineProperty(this, \"keyboardPriority\", 0);\n\n    _defineProperty(this, \"eventName\", 'keydown');\n\n    _defineProperty(this, \"keyboardHandlers\", void 0);\n  }\n\n  compute([keyCombo, callback], {\n    event = 'keydown',\n    activated = true,\n    priority = 0\n  }) {\n    assert('ember-keyboard: You must pass a function as the second argument to the `on-key` helper', typeof callback === 'function');\n    this.keyCombo = keyCombo;\n    this.callback = callback;\n    this.eventName = event;\n    this.keyboardActivated = activated;\n    this.keyboardPriority = priority;\n    this.keyboardHandlers = {};\n    this.keyboardHandlers[listenerName(event, keyCombo)] = callback;\n    this.keyboard.register(this);\n  }\n\n  willDestroy() {\n    this.keyboard.unregister(this);\n    super.willDestroy(...arguments);\n  }\n\n}, (_descriptor = _applyDecoratedDescriptor(_class2.prototype, \"keyboard\", [inject], {\n  configurable: true,\n  enumerable: true,\n  writable: true,\n  initializer: null\n})), _class2);\n\nexport { _class as default };\n","import { isNone } from '@ember/utils';\n\nfunction getMouseName(buttonCode) {\n  if (isNone(buttonCode)) return;\n\n  switch (buttonCode) {\n    case 'left':\n      return 0;\n\n    case 'middle':\n      return 1;\n\n    case 'right':\n      return 2;\n  }\n}\n\nexport { getMouseName as default };\n","import { _ as _defineProperty, a as _applyDecoratedDescriptor, b as _initializerDefineProperty } from '../_rollupPluginBabelHelpers-30c82890.js';\nimport { inject } from '@ember/service';\nimport { registerDestructor } from '@ember/destroyable';\n\nfunction populateKeyboardHandlers(responder) {\n  responder.keyboardHandlers = responder.keyboardHandlers || {};\n\n  if (!responder.keyboardHandlerNames) {\n    responder.keyboardHandlerNames = {};\n\n    for (let propertyName in responder) {\n      let propertyValue = responder[propertyName];\n\n      if (typeof propertyValue === 'function' && propertyValue._emberKeyboardOnKeyDecoratorData) {\n        for (let listenerName of propertyValue._emberKeyboardOnKeyDecoratorData.listenerNames || []) {\n          responder.keyboardHandlerNames[listenerName] = propertyName;\n        }\n      }\n    }\n  }\n\n  for (let [listenerName, methodName] of Object.entries(responder.keyboardHandlerNames || {})) {\n    responder.keyboardHandlers[listenerName] = responder[methodName].bind(responder);\n  }\n}\n\nfunction keyResponder(opts = {}) {\n  const createClass = function (DecoratedClass) {\n    var _class, _descriptor, _class2;\n\n    if (opts.priority === undefined) {\n      opts.priority = 0;\n    }\n\n    if (opts.activated === undefined) {\n      opts.activated = true;\n    }\n\n    return _class = (_class2 = class ClassAsKeyResponder extends DecoratedClass {\n      get keyboardPriority() {\n        if (super.keyboardPriority === undefined) {\n          return opts.priority;\n        }\n\n        return super.keyboardPriority;\n      }\n\n      set keyboardPriority(val) {\n        super.keyboardPriority = val;\n      }\n\n      get keyboardActivated() {\n        if (super.keyboardActivated === undefined) {\n          return opts.activated;\n        }\n\n        return super.keyboardActivated;\n      }\n\n      set keyboardActivated(val) {\n        super.keyboardActivated = val;\n      }\n\n      constructor() {\n        super(...arguments);\n\n        _initializerDefineProperty(this, \"keyboard\", _descriptor, this);\n\n        populateKeyboardHandlers(this);\n        this.keyboard.register(this);\n        registerDestructor(this, () => {\n          this.keyboard.unregister(this);\n        });\n      }\n\n    }, _defineProperty(_class2, \"name\", `${DecoratedClass.name}WithKeyResponder`), _class2), (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"keyboard\", [inject], {\n      configurable: true,\n      enumerable: true,\n      writable: true,\n      initializer: null\n    })), _class;\n  };\n\n  if (typeof opts === 'function') {\n    return createClass(opts);\n  } else {\n    return function (DecoratedClass) {\n      return createClass(DecoratedClass);\n    };\n  }\n}\n\nexport { keyResponder as default };\n","import listenerName from '../utils/listener-name.js';\nimport '../utils/get-cmd-key.js';\n\nconst DEFAULT_EVENT_NAME = 'keydown';\nfunction onKey(keyCombo, opts = {}) {\n  if (typeof arguments[1] === 'function') {\n    return onKeyClassic(keyCombo, {\n      event: DEFAULT_EVENT_NAME\n    }, arguments[1]);\n  }\n\n  if (!opts.event) {\n    opts.event = DEFAULT_EVENT_NAME;\n  }\n\n  if (typeof arguments[2] === 'function') {\n    return onKeyClassic(keyCombo, opts, arguments[2]);\n  } else {\n    return onKeyDecorator(keyCombo, opts);\n  }\n}\n\nfunction onKeyDecorator(keyCombo, opts) {\n  // ES6 class\n  return function (target, property, descriptor) {\n    if (!Object.prototype.hasOwnProperty.call(target, 'keyboardHandlerNames')) {\n      let parentKeyboardHandlerNames = target.parentKeyboardHandlerNames; // we need to assign because of the way mixins copy actions down when inheriting\n\n      target.keyboardHandlerNames = parentKeyboardHandlerNames ? Object.assign({}, parentKeyboardHandlerNames) : {};\n    }\n\n    target.keyboardHandlerNames[listenerName(opts.event, keyCombo)] = property;\n    return descriptor;\n  };\n}\n\nfunction onKeyClassic(keyCombo, opts, handler) {\n  if (!handler._emberKeyboardOnKeyDecoratorData) {\n    handler._emberKeyboardOnKeyDecoratorData = {\n      listenerNames: []\n    };\n  }\n\n  handler._emberKeyboardOnKeyDecoratorData.listenerNames.push(listenerName(opts.event, keyCombo));\n\n  return handler;\n}\n\nexport { onKey as default };\n","import listenerName from '../utils/listener-name.js';\nimport validMouseButtons from '../fixtures/mouse-buttons-array.js';\nimport validModifiers from '../fixtures/modifiers-array.js';\nimport '../utils/get-cmd-key.js';\n\nconst validKeys = validMouseButtons.concat(validModifiers);\n\nconst validateKeys = function validateKeys(keys) {\n  keys.forEach(key => {\n    if (validKeys.indexOf(key) === -1) {\n      /* eslint no-console: [\"error\", { allow: [\"error\"] }] */\n      console.error(`\\`${key}\\` is not a valid key name`);\n    }\n  });\n};\n\nconst formattedListener = function formattedListener(type, keysString) {\n  const keys = keysString !== undefined ? keysString.split('+') : [];\n  validateKeys(keys);\n  return listenerName(type, keys);\n};\n\nfunction click(keys) {\n  return formattedListener('click', keys);\n}\nfunction mouseDown(keys) {\n  return formattedListener('mousedown', keys);\n}\nfunction mouseUp(keys) {\n  return formattedListener('mouseup', keys);\n}\n\nexport { click, mouseDown, mouseUp };\n","var validMouseButtons = ['left', 'middle', 'right'];\n\nexport { validMouseButtons as default };\n","import listenerName from '../utils/listener-name.js';\nimport validModifiers from '../fixtures/modifiers-array.js';\nimport '../utils/get-cmd-key.js';\n\nfunction validateKeys(keysString) {\n  const keys = keysString !== undefined ? keysString.split('+') : [];\n  keys.forEach(key => {\n    if (validModifiers.indexOf(key) === -1) {\n      /* eslint no-console: [\"error\", { allow: [\"error\"] }] */\n      console.error(`\\`${key}\\` is not a valid key name`);\n    }\n  });\n}\n\nconst formattedListener = function formattedListener(type, keysString) {\n  validateKeys(keysString);\n  return listenerName(type, keysString);\n};\n\nfunction touchEnd(keys) {\n  return formattedListener('touchEnd', keys);\n}\nfunction touchStart(keys) {\n  return formattedListener('touchstart', keys);\n}\n\nexport { touchEnd, touchStart };\n","import KeyboardListener from './keyboard-listener.js';\nimport '../_rollupPluginBabelHelpers-30c82890.js';\nimport './platform.js';\nimport '@ember/debug';\n\nconst triggerKeyEvent = function triggerKeyEvent(eventType, keyCombo, element) {\n  let keyboardListener = KeyboardListener.parse(`${eventType}:${keyCombo}`);\n  const event = keyboardListener.createMatchingKeyboardEvent();\n  element.dispatchEvent(event);\n};\n\nconst triggerKeyDown = function triggerKeyDown(keyCombo, element = document) {\n  triggerKeyEvent('keydown', keyCombo, element);\n};\n\nconst triggerKeyPress = function triggerKeyPress(keyCombo, element = document) {\n  triggerKeyEvent('keypress', keyCombo, element);\n};\n\nconst triggerKeyUp = function triggerKeyUp(keyCombo, element = document) {\n  triggerKeyEvent('keyup', keyCombo, element);\n};\n\nexport { triggerKeyDown, triggerKeyPress, triggerKeyUp };\n","export { default as getMouseCode } from './utils/get-mouse-code.js';\nexport { default as keyResponder } from './decorators/key-responder.js';\nexport { default as onKey } from './decorators/on-key.js';\nexport { keyDown, keyPress, keyUp } from './listeners/key-events.js';\nexport { click, mouseDown, mouseUp } from './listeners/mouse-events.js';\nexport { touchEnd, touchStart } from './listeners/touch-events.js';\nexport { triggerKeyDown, triggerKeyPress, triggerKeyUp } from './utils/trigger-event.js';\nimport '@ember/utils';\nimport './_rollupPluginBabelHelpers-30c82890.js';\nimport '@ember/service';\nimport '@ember/destroyable';\nimport './utils/listener-name.js';\nimport './utils/get-cmd-key.js';\nimport './fixtures/mouse-buttons-array.js';\nimport './fixtures/modifiers-array.js';\nimport './utils/keyboard-listener.js';\nimport './utils/platform.js';\nimport '@ember/debug';\n\nfunction getCode() {\n  throw new Error('ember-keyboard: `getCode` has been removed. There is no longer a need for this function as you can directly specify `key` and/or `code` values');\n}\n\nfunction getKeyCode() {\n  throw new Error('ember-keyboard: `getKeyCode` has been removed. There is no longer a need for this function as you can directly specify `key` and/or `code` values');\n}\n\nexport { getCode, getKeyCode };\n","import listenerName from '../utils/listener-name.js';\nimport '../utils/get-cmd-key.js';\n\nfunction keyDown(keyCombo) {\n  return listenerName('keydown', keyCombo);\n}\nfunction keyPress(keyCombo) {\n  return listenerName('keypress', keyCombo);\n}\nfunction keyUp(keyCombo) {\n  return listenerName('keyup', keyCombo);\n}\n\nexport { keyDown, keyPress, keyUp };\n","import { a as _applyDecoratedDescriptor, b as _initializerDefineProperty, _ as _defineProperty } from '../_rollupPluginBabelHelpers-30c82890.js';\nimport Modifier from 'ember-modifier';\nimport { inject } from '@ember/service';\nimport { action } from '@ember/object';\nimport { registerDestructor } from '@ember/destroyable';\nimport { macroCondition, dependencySatisfies } from '@embroider/macros';\nimport listenerName from '../utils/listener-name.js';\nimport isKey from '../utils/is-key.js';\nimport '../utils/get-cmd-key.js';\nimport '../utils/keyboard-listener.js';\nimport '../utils/platform.js';\nimport '@ember/debug';\nimport '../fixtures/key-maps.js';\nimport '../fixtures/modifiers-array.js';\nimport '../utils/get-mouse-name.js';\nimport '@ember/utils';\n\nconst ONLY_WHEN_FOCUSED_TAG_NAMES = ['input', 'select', 'textarea'];\nlet modifier;\n\nif (macroCondition(dependencySatisfies('ember-modifier', '>=3.2.0 || 4.x'))) {\n  var _class, _descriptor;\n\n  /**\n   * This is an element modifier to trigger some behavior when\n   * specified key combo is pressed. When used with a form element\n   * (input, textarea, or select), the action fires only when element\n   * has focus. When used with another element type, it will trigger the\n   * passed action, OR if no action is passed, it will trigger a `click`\n   * on the element. This allows for easy declaration of keyboard shortcuts\n   * for anything clickable: In the following example, we trigger a\n   * click on the button when the B key is pressed:\n   *\n   * <button\n   *    type=\"button\"\n   *    {{on-key 'b'}}>\n   *   Click me, or press \"B\"\n   * </button>\n   */\n  modifier = (_class = class OnKeyModifier extends Modifier {\n    constructor(owner, args) {\n      super(owner, args);\n\n      _initializerDefineProperty(this, \"keyboard\", _descriptor, this);\n\n      _defineProperty(this, \"element\", void 0);\n\n      _defineProperty(this, \"keyboardPriority\", 0);\n\n      _defineProperty(this, \"activatedParamValue\", true);\n\n      _defineProperty(this, \"eventName\", 'keydown');\n\n      _defineProperty(this, \"onlyWhenFocused\", true);\n\n      _defineProperty(this, \"listenerName\", void 0);\n\n      _defineProperty(this, \"removeEventListeners\", () => {\n        if (this.onlyWhenFocused) {\n          this.element.removeEventListener('click', this.onFocus, true);\n          this.element.removeEventListener('focus', this.onFocus, true);\n          this.element.removeEventListener('focusout', this.onFocusOut, true);\n        }\n      });\n\n      this.keyboard.register(this);\n      registerDestructor(this, () => {\n        this.removeEventListeners();\n        this.keyboard.unregister(this);\n      });\n    }\n\n    modify(element, positional, named) {\n      this.element = element;\n      this.removeEventListeners();\n      this.setupProperties(positional, named);\n\n      if (this.onlyWhenFocused) {\n        this.addEventListeners();\n      }\n    }\n\n    setupProperties(positional, named) {\n      let [keyCombo, callback] = positional;\n      let {\n        activated,\n        event,\n        priority,\n        onlyWhenFocused\n      } = named;\n      this.keyCombo = keyCombo;\n      this.callback = callback;\n      this.eventName = event || 'keydown';\n      this.activatedParamValue = 'activated' in named ? !!activated : undefined;\n      this.keyboardPriority = priority ? parseInt(priority, 10) : 0;\n      this.listenerName = listenerName(this.eventName, this.keyCombo);\n\n      if (onlyWhenFocused !== undefined) {\n        this.onlyWhenFocused = onlyWhenFocused;\n      } else {\n        this.onlyWhenFocused = ONLY_WHEN_FOCUSED_TAG_NAMES.includes(this.element.tagName.toLowerCase());\n      }\n    }\n\n    addEventListeners() {\n      this.element.addEventListener('click', this.onFocus, true);\n      this.element.addEventListener('focus', this.onFocus, true);\n      this.element.addEventListener('focusout', this.onFocusOut, true);\n    }\n\n    onFocus() {\n      this.isFocused = true;\n    }\n\n    onFocusOut() {\n      this.isFocused = false;\n    }\n\n    get keyboardActivated() {\n      if (this.activatedParamValue === false) {\n        return false;\n      }\n\n      if (this.onlyWhenFocused) {\n        return this.isFocused;\n      }\n\n      return true;\n    }\n\n    get keyboardFirstResponder() {\n      if (this.onlyWhenFocused) {\n        return this.isFocused;\n      }\n\n      return false;\n    }\n\n    canHandleKeyboardEvent(event) {\n      return isKey(this.listenerName, event);\n    }\n\n    handleKeyboardEvent(event, ekEvent) {\n      if (isKey(this.listenerName, event)) {\n        if (this.callback) {\n          this.callback(event, ekEvent);\n        } else {\n          this.element.click();\n        }\n      }\n    }\n\n  }, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"keyboard\", [inject], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"onFocus\", [action], Object.getOwnPropertyDescriptor(_class.prototype, \"onFocus\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"onFocusOut\", [action], Object.getOwnPropertyDescriptor(_class.prototype, \"onFocusOut\"), _class.prototype)), _class);\n} else {\n  var _class3, _descriptor2;\n\n  modifier = (_class3 = class OnKeyModifier extends Modifier {\n    constructor(...args) {\n      super(...args);\n\n      _initializerDefineProperty(this, \"keyboard\", _descriptor2, this);\n\n      _defineProperty(this, \"keyboardPriority\", 0);\n\n      _defineProperty(this, \"activatedParamValue\", true);\n\n      _defineProperty(this, \"eventName\", 'keydown');\n\n      _defineProperty(this, \"onlyWhenFocused\", true);\n\n      _defineProperty(this, \"listenerName\", void 0);\n    }\n\n    didReceiveArguments() {\n      let [keyCombo, callback] = this.args.positional;\n      let {\n        activated,\n        event,\n        priority\n      } = this.args.named;\n      this.keyCombo = keyCombo;\n      this.callback = callback;\n      this.eventName = event || 'keydown';\n      this.activatedParamValue = Object.keys(this.args.named).includes('activated') ? !!activated : undefined;\n      this.keyboardPriority = priority ? parseInt(priority, 10) : 0;\n      this.listenerName = listenerName(this.eventName, this.keyCombo);\n\n      if (this.args.named.onlyWhenFocused !== undefined) {\n        this.onlyWhenFocused = this.args.named.onlyWhenFocused;\n      } else {\n        this.onlyWhenFocused = ONLY_WHEN_FOCUSED_TAG_NAMES.includes(this.element.tagName.toLowerCase());\n      }\n    }\n\n    didInstall() {\n      this.keyboard.register(this);\n\n      if (this.onlyWhenFocused) {\n        this.element.addEventListener('click', this.onFocus, true);\n        this.element.addEventListener('focus', this.onFocus, true);\n        this.element.addEventListener('focusout', this.onFocusOut, true);\n      }\n    }\n\n    willRemove() {\n      if (this.onlyWhenFocused) {\n        this.element.removeEventListener('click', this.onFocus, true);\n        this.element.removeEventListener('focus', this.onFocus, true);\n        this.element.removeEventListener('focusout', this.onFocusOut, true);\n      }\n\n      this.keyboard.unregister(this);\n    }\n\n    onFocus() {\n      this.isFocused = true;\n    }\n\n    onFocusOut() {\n      this.isFocused = false;\n    }\n\n    get keyboardActivated() {\n      if (this.activatedParamValue === false) {\n        return false;\n      }\n\n      if (this.onlyWhenFocused) {\n        return this.isFocused;\n      }\n\n      return true;\n    }\n\n    get keyboardFirstResponder() {\n      if (this.onlyWhenFocused) {\n        return this.isFocused;\n      }\n\n      return false;\n    }\n\n    canHandleKeyboardEvent(event) {\n      return isKey(this.listenerName, event);\n    }\n\n    handleKeyboardEvent(event, ekEvent) {\n      if (isKey(this.listenerName, event)) {\n        if (this.callback) {\n          this.callback(event, ekEvent);\n        } else {\n          this.element.click();\n        }\n      }\n    }\n\n  }, (_descriptor2 = _applyDecoratedDescriptor(_class3.prototype, \"keyboard\", [inject], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class3.prototype, \"onFocus\", [action], Object.getOwnPropertyDescriptor(_class3.prototype, \"onFocus\"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, \"onFocusOut\", [action], Object.getOwnPropertyDescriptor(_class3.prototype, \"onFocusOut\"), _class3.prototype)), _class3);\n}\n\nvar modifier$1 = modifier;\n\nexport { modifier$1 as default };\n","import { a as _applyDecoratedDescriptor, _ as _defineProperty } from '../_rollupPluginBabelHelpers-30c82890.js';\nimport Service from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport { action } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { keyDown, keyPress, keyUp } from '../listeners/key-events.js';\nimport { handleKeyEventWithPropagation } from '../utils/handle-key-event.js';\nimport { reverseCompareProp } from '../utils/sort.js';\nimport '../utils/listener-name.js';\nimport '../utils/get-cmd-key.js';\nimport '../utils/is-key.js';\nimport '../utils/keyboard-listener.js';\nimport '../utils/platform.js';\nimport '@ember/debug';\nimport '../fixtures/key-maps.js';\nimport '../fixtures/modifiers-array.js';\nimport '../utils/get-mouse-name.js';\nimport '@ember/utils';\n\nvar _class;\nlet KeyboardService = (_class = class KeyboardService extends Service {\n  get activeResponders() {\n    let {\n      registeredResponders\n    } = this;\n    return Array.from(registeredResponders).filter(r => r.keyboardActivated);\n  }\n\n  get sortedResponders() {\n    return this.activeResponders.sort((a, b) => {\n      return reverseCompareProp(a, b, 'keyboardPriority');\n    });\n  }\n\n  get firstResponders() {\n    return this.sortedResponders.filter(r => r.keyboardFirstResponder);\n  }\n\n  get normalResponders() {\n    return this.sortedResponders.filter(r => !r.keyboardFirstResponder);\n  }\n\n  constructor(...args) {\n    super(...args);\n\n    _defineProperty(this, \"registeredResponders\", new Set());\n\n    if (typeof FastBoot !== 'undefined') {\n      return;\n    }\n\n    const config = getOwner(this).resolveRegistration('config:environment') || {};\n    let emberKeyboardConfig = config.emberKeyboard || {};\n\n    if (emberKeyboardConfig.disableOnInputFields) {\n      this._disableOnInput = true;\n    }\n\n    this._listeners = emberKeyboardConfig.listeners || ['keyUp', 'keyDown', 'keyPress'];\n    this._listeners = this._listeners.map(listener => listener.toLowerCase());\n\n    this._listeners.forEach(type => {\n      document.addEventListener(type, this._respond);\n    });\n  }\n\n  willDestroy(...args) {\n    super.willDestroy(...args);\n\n    if (typeof FastBoot !== 'undefined') {\n      return;\n    }\n\n    this._listeners.forEach(type => {\n      document.removeEventListener(type, this._respond);\n    });\n  }\n\n  _respond(event) {\n    if (this._disableOnInput && event.target) {\n      const target = event.composedPath()[0] ?? event.target;\n      const tag = target.tagName;\n      const isContentEditable = target.getAttribute && target.getAttribute('contenteditable') != null;\n\n      if (isContentEditable || tag === 'TEXTAREA' || tag === 'INPUT') {\n        return;\n      }\n    }\n\n    run(() => {\n      let {\n        firstResponders,\n        normalResponders\n      } = this;\n      handleKeyEventWithPropagation(event, {\n        firstResponders,\n        normalResponders\n      });\n    });\n  }\n\n  register(responder) {\n    this.registeredResponders.add(responder);\n  }\n\n  unregister(responder) {\n    this.registeredResponders.delete(responder);\n  }\n\n  keyDown(...args) {\n    return keyDown(...args);\n  }\n\n  keyPress(...args) {\n    return keyPress(...args);\n  }\n\n  keyUp(...args) {\n    return keyUp(...args);\n  }\n\n}, (_applyDecoratedDescriptor(_class.prototype, \"_respond\", [action], Object.getOwnPropertyDescriptor(_class.prototype, \"_respond\"), _class.prototype)), _class);\n\nexport { KeyboardService as default };\n","import isKey from './is-key.js';\nimport './keyboard-listener.js';\nimport '../_rollupPluginBabelHelpers-30c82890.js';\nimport './platform.js';\nimport '@ember/debug';\nimport '../fixtures/key-maps.js';\nimport '../fixtures/modifiers-array.js';\nimport './get-mouse-name.js';\nimport '@ember/utils';\n\nfunction handleKeyEventWithPropagation(event, {\n  firstResponders,\n  normalResponders\n}) {\n  let isImmediatePropagationStopped = false;\n  let isPropagationStopped = false;\n  const ekEvent = {\n    stopImmediatePropagation() {\n      isImmediatePropagationStopped = true;\n    },\n\n    stopPropagation() {\n      isPropagationStopped = true;\n    }\n\n  };\n\n  for (const responder of firstResponders) {\n    triggerResponderListener(responder, event, ekEvent);\n\n    if (isImmediatePropagationStopped) {\n      break;\n    }\n  }\n\n  if (isPropagationStopped) {\n    return;\n  }\n\n  isImmediatePropagationStopped = false;\n  let previousPriorityLevel = Number.POSITIVE_INFINITY;\n\n  for (const responder of normalResponders) {\n    const currentPriorityLevel = Number(responder.keyboardPriority);\n\n    if (isImmediatePropagationStopped && currentPriorityLevel === previousPriorityLevel) {\n      continue;\n    }\n\n    if (currentPriorityLevel < previousPriorityLevel) {\n      if (isPropagationStopped) {\n        return;\n      }\n\n      isImmediatePropagationStopped = false;\n      previousPriorityLevel = currentPriorityLevel;\n    }\n\n    triggerResponderListener(responder, event, ekEvent);\n  }\n  /* eslint-enable no-unused-vars */\n\n}\n\nfunction triggerResponderListener(responder, event, ekEvent = null) {\n  if (responder.handleKeyboardEvent) {\n    if (responder.canHandleKeyboardEvent && !responder.canHandleKeyboardEvent(event)) {\n      return;\n    }\n\n    responder.handleKeyboardEvent(event, ekEvent);\n    return;\n  }\n\n  if (responder.keyboardHandlers) {\n    Object.keys(responder.keyboardHandlers).forEach(responderListenerName => {\n      if (isKey(responderListenerName, event)) {\n        if (ekEvent) {\n          responder.keyboardHandlers[responderListenerName](event, ekEvent);\n        } else {\n          responder.keyboardHandlers[responderListenerName](event);\n        }\n      }\n    });\n    return;\n  }\n\n  throw new Error('A responder registered with the ember-keyboard service must implement either `keyboardHandlers` (property returning a dictionary of listenerNames to handler functions), or `handleKeyboardEvent(event)`)');\n}\n\nexport { handleKeyEventWithPropagation };\n","import { get } from '@ember/object';\n\nfunction compare(a, b) {\n  let diff = a - b;\n  return (diff > 0) - (diff < 0);\n}\nfunction compareProp(a, b, propName, convertValue) {\n  return compare(convertValue ? convertValue(get(a, propName)) : get(a, propName), convertValue ? convertValue(get(b, propName)) : get(b, propName));\n}\nfunction reverseCompareProp(a, b, propName, convertValue = null) {\n  return compareProp(b, a, propName, convertValue);\n}\n\nexport { compare, compareProp, reverseCompareProp };\n","import { isNone } from '@ember/utils';\n\nfunction getMouseName(buttonCode) {\n  if (isNone(buttonCode)) return;\n\n  switch (buttonCode) {\n    case 0:\n      return 'left';\n\n    case 1:\n      return 'middle';\n\n    case 2:\n      return 'right';\n  }\n}\n\nexport { getMouseName as default };\n","import KeyboardListener from './keyboard-listener.js';\nimport getPlatform from './platform.js';\nimport { SHIFT_KEY_MAP, MAC_ALT_KEY_MAP, MAC_SHIFT_ALT_KEY_MAP } from '../fixtures/key-maps.js';\nimport validModifiers from '../fixtures/modifiers-array.js';\nimport getMouseName from './get-mouse-name.js';\nimport '../_rollupPluginBabelHelpers-30c82890.js';\nimport '@ember/debug';\nimport '@ember/utils';\n\nconst ALL_SYMBOL = '_all';\nfunction isKey(listenerOrListenerName, event, platform = getPlatform()) {\n  let listener;\n\n  if (listenerOrListenerName instanceof KeyboardListener) {\n    listener = listenerOrListenerName;\n  } else if (typeof listenerOrListenerName === 'string') {\n    listener = KeyboardListener.parse(listenerOrListenerName, platform);\n  } else {\n    throw new Error('Expected a `string` or `KeyCombo` as `keyComboOrKeyComboString` argument to `isKey`');\n  }\n\n  if (listener.type !== event.type) {\n    return false;\n  }\n\n  if (isAll(listener)) {\n    return true;\n  }\n\n  if (modifiersMatch(listener, event) && (keyOrCodeMatches(listener, event) || mouseButtonMatches(listener, event))) {\n    return true;\n  }\n\n  return specialCaseMatches(listener, event, platform);\n}\n\nfunction isAll(listener) {\n  return listener.keyOrCode === ALL_SYMBOL && listener.altKey === false && listener.ctrlKey === false && listener.metaKey === false && listener.shiftKey === false;\n}\n\nfunction modifiersMatch(listener, keyboardEvent) {\n  return listener.type === keyboardEvent.type && listener.altKey === keyboardEvent.altKey && listener.ctrlKey === keyboardEvent.ctrlKey && listener.metaKey === keyboardEvent.metaKey && listener.shiftKey === keyboardEvent.shiftKey;\n}\n\nfunction keyOrCodeMatches(listener, keyboardEvent) {\n  if (!(keyboardEvent instanceof KeyboardEvent)) {\n    return false;\n  }\n\n  if (listener.keyOrCode === ALL_SYMBOL) {\n    return true;\n  }\n\n  return listener.keyOrCode === keyboardEvent.code || listener.keyOrCode === keyboardEvent.key;\n}\n\nfunction mouseButtonMatches(listener, mouseEvent) {\n  if (!(mouseEvent instanceof MouseEvent)) {\n    return false;\n  }\n\n  if (listener.keyOrCode === ALL_SYMBOL) {\n    return true;\n  }\n\n  return listener.keyOrCode === getMouseName(mouseEvent.button);\n}\n\nfunction specialCaseMatches(keyboardListener, keyboardEvent, platform) {\n  if (onlyModifiers([], keyboardListener) && onlyModifiers(['shift'], keyboardEvent)) {\n    return keyboardEvent.key === keyboardListener.keyOrCode;\n  }\n\n  if (onlyModifiers(['shift'], keyboardListener) && onlyModifiers(['shift'], keyboardEvent)) {\n    return rootKeyForShiftKey(keyboardEvent.key) === keyboardListener.keyOrCode;\n  }\n\n  if (platform === 'Macintosh' && onlyModifiers(['alt'], keyboardListener) && onlyModifiers(['alt'], keyboardEvent)) {\n    return rootKeyForMacAltKey(keyboardEvent.key) === keyboardListener.keyOrCode;\n  }\n\n  if (platform === 'Macintosh' && onlyModifiers(['shift', 'alt'], keyboardListener) && onlyModifiers(['shift', 'alt'], keyboardEvent)) {\n    return rootKeyForMacShiftAltKey(keyboardEvent.key) === keyboardListener.keyOrCode;\n  }\n\n  return false;\n}\n\nconst ALL_MODIFIERS_EXCEPT_CMD = validModifiers.filter(m => m != 'cmd');\n\nfunction onlyModifiers(names, obj) {\n  for (let modifier of ALL_MODIFIERS_EXCEPT_CMD) {\n    if (names.includes(modifier) && !obj[`${modifier}Key`]) {\n      return false;\n    }\n\n    if (!names.includes(modifier) && obj[`${modifier}Key`]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction rootKeyForShiftKey(key) {\n  return SHIFT_KEY_MAP[key] || key;\n}\n\nfunction rootKeyForMacAltKey(key) {\n  return MAC_ALT_KEY_MAP[key] || key;\n}\n\nfunction rootKeyForMacShiftAltKey(key) {\n  return MAC_SHIFT_ALT_KEY_MAP[key] || key;\n}\n\nexport { isKey as default };\n","import { _ as _defineProperty } from '../_rollupPluginBabelHelpers-30c82890.js';\nimport getPlatform from './platform.js';\nimport '@ember/debug';\n\nconst ALT_REGEX = /^alt$/i;\nconst SHIFT_REGEX = /^shift$/i;\nconst CTRL_REGEX = /^ctrl$/i;\nconst META_REGEX = /^meta$/i;\nconst CMD_REGEX = /^cmd$/i;\nclass KeyboardListener {\n  // keydown, keyup, keypress\n  constructor(platform = getPlatform()) {\n    _defineProperty(this, \"type\", void 0);\n\n    _defineProperty(this, \"altKey\", false);\n\n    _defineProperty(this, \"ctrlKey\", false);\n\n    _defineProperty(this, \"shiftKey\", false);\n\n    _defineProperty(this, \"metaKey\", false);\n\n    _defineProperty(this, \"keyOrCode\", void 0);\n\n    _defineProperty(this, \"platform\", void 0);\n\n    this.platform = platform;\n  }\n\n  static parse(s, platform = getPlatform()) {\n    let keyboardListener = new KeyboardListener(platform);\n    let [eventType, ...keyCombo] = s.split(':');\n    keyCombo = keyCombo.join(':'); // allow keyCombo contain semicolon\n\n    keyboardListener.type = eventType;\n\n    if (keyCombo === '+') {\n      keyboardListener.keyOrCode = keyCombo;\n      return keyboardListener;\n    }\n\n    keyCombo.split('+').forEach(part => {\n      if (ALT_REGEX.test(part)) {\n        keyboardListener.altKey = true;\n      } else if (CTRL_REGEX.test(part)) {\n        keyboardListener.ctrlKey = true;\n      } else if (META_REGEX.test(part)) {\n        keyboardListener.metaKey = true;\n      } else if (SHIFT_REGEX.test(part)) {\n        keyboardListener.shiftKey = true;\n      } else if (CMD_REGEX.test(part)) {\n        if (platform.indexOf('Mac') > -1) {\n          keyboardListener.metaKey = true;\n        } else {\n          keyboardListener.ctrlKey = true;\n        }\n      } else {\n        keyboardListener.keyOrCode = part;\n      }\n    });\n    return keyboardListener;\n  }\n\n  createMatchingKeyboardEvent(opts = {}) {\n    return new KeyboardEvent(this.type, Object.assign({\n      // one of these next two will be incorrect. For test usage, if usually\n      // doesn't matter, but you can pass in correct values via opts if needed.\n      key: this.keyOrCode,\n      code: this.keyOrCode,\n      altKey: this.altKey,\n      ctrlKey: this.ctrlKey,\n      metaKey: this.metaKey,\n      shiftKey: this.shiftKey\n    }, opts));\n  }\n\n}\n\nexport { KeyboardListener as default };\n","import getCmdKey from './get-cmd-key.js';\n\nfunction sortedKeys(keyArray) {\n  return keyArray.sort().join('+');\n}\n\nfunction listenerName(type, keyArrayOrString = []) {\n  let keyArray = keyArrayOrString;\n\n  if (typeof keyArrayOrString === 'string') {\n    keyArray = keyArrayOrString.split('+');\n  }\n\n  if (keyArray.indexOf('cmd') > -1) {\n    keyArray[keyArray.indexOf('cmd')] = getCmdKey();\n  }\n\n  let keys = sortedKeys(keyArray || []);\n\n  if (keys === '') {\n    keys = '_all';\n  }\n\n  return `${type}:${keys}`;\n}\n\nexport { listenerName as default };\n","function getCmdKey (platform) {\n  if (typeof FastBoot === 'undefined') {\n    if (platform === undefined) {\n      platform = navigator.platform;\n    }\n\n    if (platform.indexOf('Mac') > -1) {\n      return 'meta';\n    } else {\n      return 'ctrl';\n    }\n  }\n}\n\nexport { getCmdKey as default };\n","import { runInDebug } from '@ember/debug';\n\nlet platform;\nfunction getPlatform(userAgent = navigator.userAgent) {\n  // allow mocking of userAgent in tests, memoize for speed in production\n  runInDebug(() => {\n    platform = null;\n  });\n\n  if (!platform) {\n    let osName = 'Unknown OS';\n    if (userAgent.indexOf('Win') != -1) osName = 'Windows';\n    if (userAgent.indexOf('Mac') != -1) osName = 'Macintosh';\n    if (userAgent.indexOf('Linux') != -1) osName = 'Linux';\n    if (userAgent.indexOf('Android') != -1) osName = 'Android';\n    if (userAgent.indexOf('like Mac') != -1) osName = 'iOS';\n    platform = osName;\n  }\n\n  return platform;\n}\n\nexport { getPlatform as default };\n","/**\n * @function getTask\n * @param obj\n * @param taskOrName\n * @param taskName\n */\nfunction getTask(obj, taskOrName, taskName) {\n  let type = typeof taskOrName;\n  let task;\n\n  if (type === 'function') {\n    task = taskOrName;\n  } else if (type === 'string') {\n    task = obj[taskOrName];\n\n    if (typeof task !== 'function') {\n      throw new TypeError(`The method name '${taskOrName}' passed to ${taskName} does not resolve to a valid function.`);\n    }\n  } else {\n    throw new TypeError(`You must pass a task function or method name to '${taskName}'.`);\n  }\n\n  return task;\n}\n\nexport { getTask as default };\n","import { cancel } from '@ember/runloop';\nimport { registerDestructor } from '@ember/destroyable';\n\nconst NULL_TIMER_ID = -1;\n/**\n * A map of instances/timers that allows us to\n * store cancelIds for scheduled timers per instance.\n *\n * @private\n */\n\nlet registeredTimers = new WeakMap();\n/**\n * Test use only. Allows for swapping out the WeakMap to a Map, giving\n * us the ability to detect whether the timers set is empty.\n *\n * @private\n * @param {*} mapForTesting A map used to ensure correctness when testing.\n */\n\nfunction _setRegisteredTimers(mapForTesting) {\n  registeredTimers = mapForTesting;\n}\nfunction getTimersDisposable(destroyable, timers) {\n  return function () {\n    timers.forEach(cancelId => {\n      cancelTask(destroyable, cancelId);\n    });\n    timers.clear();\n  };\n}\nfunction getTimers(destroyable) {\n  let timers = registeredTimers.get(destroyable);\n\n  if (!timers) {\n    timers = new Set();\n    registeredTimers.set(destroyable, timers);\n    registerDestructor(destroyable, getTimersDisposable(destroyable, timers));\n  }\n\n  return timers;\n}\n/**\n * Cancel a previously scheduled task.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { runTask, cancelTask } from 'ember-lifeline';\n *\n * export default CancelableComponent extends Component {\n *   start() {\n *     this._cancelId = runTask(this, () => {\n *       console.log('This runs after 5 seconds if this component is still displayed');\n *     }, 5000)\n *   },\n *\n *   disable() {\n *     cancelTask(this, this._cancelId);\n *   },\n * }\n * ```\n *\n * @function cancelTask\n * @param { Destroyable } destroyable the entangled object that was provided with the original *Task call\n * @param { Number } cancelId the id returned from the *Task call\n * @public\n */\n\nfunction cancelTask(destroyable, cancelId) {\n  let timers = getTimers(destroyable);\n  timers.delete(cancelId);\n  cancel(cancelId);\n}\n\nexport { NULL_TIMER_ID, _setRegisteredTimers, cancelTask, getTimers, getTimersDisposable };\n","import { later } from '@ember/runloop';\nimport { isDestroying } from '@ember/destroyable';\nimport getTask from './utils/get-task.js';\nimport { NULL_TIMER_ID, getTimers } from './cancel-task.js';\n\n/**\n * Registers and runs the provided task function for the provided object at the specified\n * timeout (defaulting to 0). The timer is properly canceled if the object is destroyed\n * before it is invoked.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { runTask } from 'ember-lifeline';\n *\n * export default RunComponent extends Component {\n *   start() {\n *     runTask(this, () => {\n *       console.log('This runs after 5 seconds if this component is still displayed');\n *     }, 5000)\n *   },\n * });\n * ```\n *\n * @function runTask\n * @param { Destroyable } destroyable the instance to register the task for\n * @param { Function | String } taskOrName a function representing the task, or string\n *                                         specifying a property representing the task,\n *                                         which is run at the provided time specified\n *                                         by timeout\n * @param { Number } [timeout=0] the time in the future to run the task\n * @public\n */\n\nfunction runTask(destroyable, taskOrName, timeout = 0) {\n  if (isDestroying(destroyable)) {\n    return NULL_TIMER_ID;\n  }\n\n  let task = getTask(destroyable, taskOrName, 'runTask');\n  let timers = getTimers(destroyable);\n  let cancelId = later(() => {\n    timers.delete(cancelId);\n    task.call(destroyable);\n  }, timeout);\n  timers.add(cancelId);\n  return cancelId;\n}\n\nexport { runTask };\n","import { assert } from '@ember/debug';\nimport { schedule } from '@ember/runloop';\nimport { isDestroying } from '@ember/destroyable';\nimport { NULL_TIMER_ID, getTimers } from './cancel-task.js';\nimport getTask from './utils/get-task.js';\n\n/**\n * Adds the provided function to the named queue for the provided object. The timer is\n * properly canceled if the object is destroyed before it is invoked.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { scheduleTask } from 'ember-lifeline';\n *\n * export default ScheduledComponent extends Component {\n *   start() {\n *     scheduleTask(this, 'actions', () => {\n *       console.log('This runs at the end of the run loop (via the actions queue) if this component is still displayed');\n *     })\n *   },\n * });\n * ```\n *\n * @function scheduleTask\n * @param { Destroyable } destroyable the instance to register the task for\n * @param { String } queueName the queue to schedule the task into\n * @param { Function | String } taskOrName a function representing the task, or string\n *                                         specifying a property representing the task,\n *                                         which is run at the provided time specified\n *                                         by timeout\n * @param { ...* } args arguments to pass to the task\n * @public\n */\n\nfunction scheduleTask(destroyable, queueName, taskOrName, ...args) {\n  assert(`Called \\`scheduleTask\\` without a string as the first argument on ${destroyable}.`, typeof queueName === 'string');\n  assert(`Called \\`scheduleTask\\` while trying to schedule to the \\`afterRender\\` queue on ${destroyable}.`, queueName !== 'afterRender');\n\n  if (isDestroying(destroyable)) {\n    return NULL_TIMER_ID;\n  }\n\n  let task = getTask(destroyable, taskOrName, 'scheduleTask');\n  let timers = getTimers(destroyable);\n  let cancelId;\n\n  let taskWrapper = (...taskArgs) => {\n    timers.delete(cancelId);\n    task.call(destroyable, ...taskArgs);\n  };\n\n  cancelId = schedule(queueName, destroyable, taskWrapper, ...args);\n  timers.add(cancelId);\n  return cancelId;\n}\n\nexport { scheduleTask };\n","import { assert } from '@ember/debug';\nimport { throttle } from '@ember/runloop';\nimport { isDestroying } from '@ember/destroyable';\nimport { NULL_TIMER_ID, getTimers } from './cancel-task.js';\n\n/**\n * Runs the function with the provided name immediately, and only once in the time window\n * specified by the spacing argument.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { throttleTask } from 'ember-lifeline';\n *\n * export default LoggerComponent extends Component {\n *   logMe() {\n *     console.log('This will run once immediately, then only once every 300ms.');\n *   },\n *\n *   click() {\n *     throttleTask(this, 'logMe', 300);\n *   },\n * });\n * ```\n *\n * @function throttleTask\n * @param { Destroyable } destroyable the instance to register the task for\n * @param { String } taskName the name of the task to throttle\n * @param { ...* } [throttleArgs] arguments to pass to the throttled method\n * @param { Number } spacing the time in the future to run the task\n * @param { Boolean } [immediate] Trigger the function on the leading instead of the trailing edge of the wait interval. Defaults to true.\n * @public\n */\n\nfunction throttleTask(destroyable, taskName, ...throttleArgs) {\n  assert(`Called \\`throttleTask\\` without a string as the first argument on ${destroyable}.`, typeof taskName === 'string');\n  assert(`Called \\`throttleTask('${taskName}')\\` where '${taskName}' is not a function.`, typeof destroyable[taskName] === 'function');\n\n  if (isDestroying(destroyable)) {\n    return NULL_TIMER_ID;\n  }\n\n  const lastArgument = throttleArgs[throttleArgs.length - 1];\n  const spacing = typeof lastArgument === 'boolean' ? throttleArgs[throttleArgs.length - 2] : lastArgument;\n  assert(`Called \\`throttleTask\\` with incorrect \\`spacing\\` argument. Expected Number and received \\`${spacing}\\``, typeof spacing === 'number');\n  let timers = getTimers(destroyable);\n  let cancelId = throttle(destroyable, // @ts-ignore Ignores type mismatch issues with passing rest arguments to throttle.\n  taskName, ...throttleArgs);\n  timers.add(cancelId);\n  return cancelId;\n}\n\nexport { throttleTask };\n","import Ember from 'ember';\nimport getTask from './utils/get-task.js';\nimport { registerDestructor } from '@ember/destroyable';\n\nfunction indexable(input) {\n  return input;\n}\n/**\n * A map of instances/poller functions that allows us to\n * store poller tokens per instance.\n *\n * @private\n *\n */\n\n\nlet registeredPollers = new WeakMap();\n/**\n * Test use only. Allows for swapping out the WeakMap to a Map, giving\n * us the ability to detect whether the pollers set is empty.\n *\n * @private\n * @param {*} mapForTesting A map used to ensure correctness when testing.\n */\n\nfunction _setRegisteredPollers(mapForTesting) {\n  registeredPollers = mapForTesting;\n}\nlet token = 0;\n\nlet _shouldPollOverride;\n\nfunction shouldPoll() {\n  if (_shouldPollOverride) {\n    return _shouldPollOverride();\n  }\n\n  return !Ember.testing;\n}\n/**\n * Allows for overriding of the polling behavior to explicitly control\n * whether polling should occur or not.\n *\n * @param { Function } callback\n * @public\n */\n\n\nfunction setShouldPoll(callback) {\n  _shouldPollOverride = callback;\n}\nfunction getQueuedPollTasks() {\n  let symbol = Symbol.for('LIFELINE_QUEUED_POLL_TASKS');\n  let globalObj = getGlobal();\n  let queuedPollTasks = globalObj[symbol];\n\n  if (!queuedPollTasks) {\n    queuedPollTasks = globalObj[symbol] = new Map();\n  }\n\n  return queuedPollTasks;\n}\n/**\n * Sets up a function that can perform polling logic in a testing safe way.\n * The task is invoked synchronously with an argument (generally called `next`).\n * In normal development/production when `next` is invoked, it will trigger the\n * task again (recursively). However, when in test mode the recursive polling\n * functionality is disabled, and usage of the `pollTaskFor` helper is required.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { pollTask, runTask } from 'ember-lifeline';\n *\n * export default PollingComponent extends Component {\n *   api: injectService(),\n *\n *   init() {\n *     this._super(...arguments);\n *\n *     let token = pollTask(this, (next) => {\n *       this.get('api').request('get', 'some/path')\n *         .then(() => {\n *           runTask(this, next, 1800);\n *         })\n *     });\n *\n *     this._pollToken = token;\n *   },\n * });\n * ```\n *\n * Test Example:\n *\n * ```js\n * import { settled } from '@ember/test-helpers';\n * import { pollTaskFor } from 'ember-lifeline';\n *\n *\n * test('foo-bar watches things', async function(assert) {\n *   await render(hbs`{{foo-bar}}`);\n *\n *   assert.strictEqual(serverRequests, 1, 'called initially');\n *\n *   pollTaskFor(this._pollToken);\n *\n *   await settled();\n *\n *   assert.strictEqual(serverRequests, 2, 'called again');\n *\n *   await settled();\n * });\n * ```\n *\n * @method pollTask\n * @param { Destroyable } destroyable the entangled object that was provided with the original *Task call\n * @param { TaskOrName } taskOrName a function representing the task, or string\n *                                  specifying a property representing the task,\n *                                  which is run at the provided time specified\n *                                  by timeout\n * @param { Token } token the Token for the pollTask, either a string or number\n * @public\n */\n\nfunction pollTask(destroyable, taskOrName, token = getNextToken()) {\n  let next;\n  let task = getTask(destroyable, taskOrName, 'pollTask');\n\n  let tick = () => task.call(destroyable, next);\n\n  let pollers = registeredPollers.get(destroyable);\n\n  if (!pollers) {\n    pollers = new Set();\n    registeredPollers.set(destroyable, pollers);\n    registerDestructor(destroyable, getPollersDisposable(destroyable, pollers));\n  }\n\n  pollers.add(token);\n\n  if (shouldPoll()) {\n    next = tick;\n  } else {\n    next = () => {\n      getQueuedPollTasks().set(token, tick);\n    };\n  }\n\n  task.call(destroyable, next);\n  return token;\n}\n/**\n * Clears a previously setup polling task.\n *\n * NOTE: This does not cancel any nested `runTask` calls. You're required to cancel any\n * cancelable behaviors, including any calls to `runTask` using `cancelTask`.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { inject as service } from '@ember/service';\n * import { pollTask, runTask } from 'ember-lifeline';\n *\n * export default AutoRefreshComponent extends Component {\n *   @service api;\n *\n *   enableAutoRefresh() {\n *     this._pollToken = pollTask(this, (next) => {\n *       this.get('api').request('get', 'some/path')\n *         .then(() => {\n *           runTask(this, next, 1800);\n *         })\n *     });\n *   },\n *\n *   disableAutoRefresh() {\n *     cancelPoll(this, this._pollToken);\n *   },\n * }\n * ```\n *\n * @method cancelPoll\n * @param { Destroyable } destroyable the entangled object that was provided with the original *Task call\n * @param { Token } token the Token for the pollTask to be cleared, either a string or number\n * @public\n */\n\nfunction cancelPoll(destroyable, token) {\n  let pollToken;\n  let pollers = registeredPollers.get(destroyable);\n  pollToken = token;\n\n  if (pollers !== undefined) {\n    pollers.delete(pollToken);\n  }\n\n  getQueuedPollTasks().delete(pollToken);\n}\n\nfunction getGlobal() {\n  // eslint-disable-next-line n/no-unsupported-features/es-builtins\n  if (typeof globalThis !== 'undefined') return indexable(globalThis);\n  if (typeof self !== 'undefined') return indexable(self);\n  if (typeof window !== 'undefined') return indexable(window);\n  if (typeof global !== 'undefined') return indexable(global);\n  throw new Error('unable to locate global object');\n}\n\nfunction getPollersDisposable(destroyable, pollers) {\n  return function () {\n    pollers.forEach(token => {\n      cancelPoll(destroyable, token);\n    });\n  };\n}\n\nfunction getNextToken() {\n  return token++;\n}\n\nexport { _setRegisteredPollers, cancelPoll, getQueuedPollTasks, pollTask, setShouldPoll };\n","import { assert } from '@ember/debug';\nimport { cancel, debounce } from '@ember/runloop';\nimport { registerDestructor } from '@ember/destroyable';\n\n/**\n * A map of instances/debounce functions that allows us to\n * store pending debounces per instance.\n *\n * @private\n */\n\nconst registeredDebounces = new WeakMap();\n/**\n * Runs the function with the provided name after the timeout has expired on the last\n * invocation. The timer is properly canceled if the object is destroyed before it is\n * invoked.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { debounceTask } from 'ember-lifeline';\n *\n * export default LoggerComponent extends Component {\n *   logMe() {\n *     console.log('This will only run once every 300ms.');\n *   },\n *\n *   click() {\n *     debounceTask(this, 'logMe', 300);\n *   },\n * }\n * ```\n *\n * @function debounceTask\n * @param { Destroyable } destroyable the instance to register the task for\n * @param { String } name the name of the task to debounce\n * @param { ...* } debounceArgs arguments to pass to the debounced method\n * @param { Number } spacing the amount of time to wait before calling the method (in milliseconds)\n * @param { Boolean } [immediate] Trigger the function on the leading instead of the trailing edge of the wait interval. Defaults to false.\n * @public\n */\n\nfunction debounceTask(destroyable, name, ...debounceArgs) {\n  assert(`Called \\`debounceTask\\` without a string as the first argument on ${destroyable}.`, typeof name === 'string');\n  assert(`Called \\`destroyable.debounceTask('${name}', ...)\\` where 'destroyable.${name}' is not a function.`, typeof destroyable[name] === 'function');\n\n  if (destroyable.isDestroying) {\n    return;\n  }\n\n  const lastArgument = debounceArgs[debounceArgs.length - 1];\n  const spacing = typeof lastArgument === 'boolean' ? debounceArgs[debounceArgs.length - 2] : lastArgument;\n  assert(`Called \\`debounceTask\\` with incorrect \\`spacing\\` argument. Expected Number and received \\`${spacing}\\``, typeof spacing === 'number');\n  let pendingDebounces = registeredDebounces.get(destroyable);\n\n  if (!pendingDebounces) {\n    pendingDebounces = new Map();\n    registeredDebounces.set(destroyable, pendingDebounces);\n    registerDestructor(destroyable, getDebouncesDisposable(pendingDebounces));\n  }\n\n  let debouncedTask;\n\n  if (!pendingDebounces.has(name)) {\n    debouncedTask = (...args) => {\n      pendingDebounces.delete(name);\n      destroyable[name](...args);\n    };\n  } else {\n    debouncedTask = pendingDebounces.get(name).debouncedTask;\n  } // cancelId is new, even if the debounced function was already present\n\n\n  let cancelId = debounce(destroyable, debouncedTask, ...debounceArgs);\n  pendingDebounces.set(name, {\n    debouncedTask,\n    cancelId\n  });\n}\n/**\n * Cancel a previously debounced task.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { debounceTask, cancelDebounce } from 'ember-lifeline';\n *\n * export default LoggerComponent extends Component {\n *   logMe() {\n *     console.log('This will only run once every 300ms.');\n *   },\n *\n *   click() {\n *     debounceTask(this, 'logMe', 300);\n *   },\n *\n *   disable() {\n *      cancelDebounce(this, 'logMe');\n *   },\n * }\n * ```\n *\n * @function cancelDebounce\n * @param { Destroyable } destroyable the instance to register the task for\n * @param { String } methodName the name of the debounced method to cancel\n * @public\n */\n\nfunction cancelDebounce(destroyable, methodName) {\n  if (!registeredDebounces.has(destroyable)) {\n    return;\n  }\n\n  const pendingDebounces = registeredDebounces.get(destroyable);\n\n  if (!pendingDebounces.has(methodName)) {\n    return;\n  }\n\n  const {\n    cancelId\n  } = pendingDebounces.get(methodName);\n  pendingDebounces.delete(methodName);\n  cancel(cancelId);\n}\n\nfunction getDebouncesDisposable(debounces) {\n  return function () {\n    if (debounces.size === 0) {\n      return;\n    }\n\n    debounces.forEach(p => cancel(p.cancelId));\n  };\n}\n\nexport { cancelDebounce, debounceTask };\n","import Ember from 'ember';\n\n/**\n * @function getTimeoutOrTestFallback\n * @param {number} timeout The timeout value that gets scaled down in case of the test environment.\n * @param {TestTimeoutOptions} [options]\n * @param {number} [options.timeout] The timeout value that needs to be set in the test environment if passed\n * @param {number} [options.scaling] The amount by which the timeout needs to be scaled down\n * @return {number} The adjusted timeout value depending on the environment and scaling factor.\n */\n\nfunction getTimeoutOrTestFallback(timeout, {\n  timeout: testTimeout,\n  scaling = 100\n} = {\n  scaling: 100\n} // Reducing timer value by 100x in test environment by default\n) {\n  if (Ember.testing) {\n    return testTimeout !== undefined ? testTimeout : timeout / scaling;\n  }\n\n  return timeout;\n}\n\nexport { getTimeoutOrTestFallback };\n","import { capabilities } from '@ember/modifier';\nimport { destroy } from '@ember/destroyable';\nimport type Owner from '@ember/owner';\n\nimport type ClassBasedModifier from './modifier';\nimport type { ArgsFor, ElementFor } from '../signature';\n\n/**\n * The state bucket used throughout the life-cycle of the modifier. Basically a\n * state *machine*, where the framework calls us with the version we hand back\n * to it at each phase. The two states are the two `extends` versions of this\n * below.\n *\n * @internal\n */\ninterface State<S> {\n  instance: ClassBasedModifier<S>;\n}\n\n/**\n * The `State` after calling `createModifier`, and therefore the state available\n * at the start of `InstallModifier`.\n * @internal\n */\ninterface CreatedState<S> extends State<S> {\n  element: null;\n}\n\n/**\n * The `State` after calling `installModifier`, and therefore the state\n * available in all `updateModifier` calls and in `destroyModifier`.\n * @internal\n */\ninterface InstalledState<S> extends State<S> {\n  element: ElementFor<S>;\n}\n\n// Wraps the unsafe (b/c it mutates, rather than creating new state) code that\n// TS does not yet understand.\nfunction installElement<S>(\n  state: CreatedState<S>,\n  element: ElementFor<S>,\n): InstalledState<S> {\n  // SAFETY: this cast represents how we are actually handling the state machine\n  // transition: from this point forward in the lifecycle of the modifier, it\n  // always behaves as `InstalledState<S>`. It is safe because, and *only*\n  // because, we immediately initialize `element`. (We cannot create a new state\n  // from the old one because the modifier manager API expects mutation of a\n  // single state bucket rather than updating it at hook calls.)\n  const installedState = state as State<S> as InstalledState<S>;\n  installedState.element = element;\n  return installedState;\n}\n\nexport default class ClassBasedModifierManager<S> {\n  capabilities = capabilities('3.22');\n\n  constructor(private owner: Owner) {}\n\n  createModifier(\n    modifierClass: typeof ClassBasedModifier,\n    args: ArgsFor<S>,\n  ): CreatedState<S> {\n    const instance = new modifierClass(this.owner, args);\n    return { instance, element: null };\n  }\n\n  installModifier(\n    createdState: CreatedState<S>,\n    element: ElementFor<S>,\n    args: ArgsFor<S>,\n  ): void {\n    const state = installElement(createdState, element);\n    state.instance.modify(element, args.positional, args.named);\n  }\n\n  updateModifier(state: InstalledState<S>, args: ArgsFor<S>): void {\n    state.instance.modify(state.element, args.positional, args.named);\n  }\n\n  destroyModifier({ instance }: InstalledState<S>): void {\n    destroy(instance);\n  }\n}\n","import { setOwner } from '@ember/application';\nimport { setModifierManager } from '@ember/modifier';\nimport type Owner from '@ember/owner';\nimport Manager from './modifier-manager.ts';\nimport type {\n  ElementFor,\n  ArgsFor,\n  DefaultSignature,\n  PositionalArgs,\n  NamedArgs,\n} from '../signature';\nimport type Opaque from '../opaque';\n\n// Preserve the signature on a class-based modifier, so it can be plucked off\n// later (by e.g. Glint), using interface merging with an opaque item to\n// preserve it in the type system. The fact that it's an empty interface is\n// actually the point: it *only* hooks the type parameter into the opaque\n// (nominal) type. Note that this is distinct from the function-based modifier\n// type intentionally, because it is actually the static class side of a\n// class-based modifier which corresponds to the result of calling `modifier()`\n// with a callback defining a function-based modifier.\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport default interface ClassBasedModifier<S = DefaultSignature>\n  extends Opaque<S> {}\n\n/**\n * A base class for modifiers which need more capabilities than function-based\n * modifiers. Useful if, for example:\n *\n * 1. You need to inject services and access them\n * 2. You need fine-grained control of updates, either for performance or\n *    convenience reasons, and don't want to teardown the state of your modifier\n *    every time only to set it up again.\n * 3. You need to store some local state within your modifier.\n *\n * The lifecycle hooks of class modifiers are tracked. When they run, they any\n * values they access will be added to the modifier, and the modifier will\n * update if any of those values change.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport default class ClassBasedModifier<S = DefaultSignature> {\n  // `args` is passed here for the sake of subclasses to have access to args in\n  // their constructors while having constructors which are properly asssignable\n  // for the superclass.\n  /**\n   *\n   * @param owner An instance of an Owner (for service injection etc.).\n   * @param args The positional and named arguments passed to the modifier.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  constructor(owner: Owner, args: ArgsFor<S>) {\n    setOwner(this, owner);\n  }\n\n  /**\n   * Called when the modifier is installed and any time any tracked state used\n   * in the modifier changes.\n   *\n   * If you need to do first-time-only setup, create a class field representing\n   * the initialization state and check it when running the hook. That is also\n   * where and when you should use `registerDestructor` for any teardown you\n   * need to do. For example:\n   *\n   * ```js\n   * function disconnect(instance) {\n   *  instance.observer?.disconnect();\n   * }\n   *\n   * class IntersectionObserver extends Modifier {\n   *   observer;\n   *\n   *   constructor(owner, args) {\n   *     super(owner, args);\n   *     registerDestructor(this, disconnect);\n   *   }\n   *\n   *   modify(element, callback, options) {\n   *     disconnect(this);\n   *\n   *     this.observer = new IntersectionObserver(callback, options);\n   *     this.observer.observe(element);\n   *   }\n   * }\n   * ```\n   *\n   * @param element The element to which the modifier is applied.\n   * @param positional The positional arguments to the modifier.\n   * @param named The named arguments to the modifier.\n   */\n  modify(\n    /* eslint-disable @typescript-eslint/no-unused-vars */\n    element: ElementFor<S>,\n    positional: PositionalArgs<S>,\n    named: NamedArgs<S>,\n    /* eslint-enable @typescript-eslint/no-unused-vars */\n  ): void {\n    /* no op, for subclassing */\n  }\n}\n\nsetModifierManager((owner) => new Manager(owner), ClassBasedModifier);\n","import { setModifierManager } from '@ember/modifier';\nimport type {\n  ElementFor,\n  EmptyObject,\n  NamedArgs,\n  PositionalArgs,\n} from '../signature';\nimport type Modifier from '../class-based/modifier';\nimport FunctionBasedModifierManager from './modifier-manager.ts';\n\n// Provide a singleton manager.\nconst MANAGER = new FunctionBasedModifierManager();\n\n// This type exists to provide a non-user-constructible, non-subclassable\n// type representing the conceptual \"instance type\" of a function modifier.\n// The abstract field of type `never` prevents subclassing in userspace of\n// the value returned from `modifier()`. By extending `Modifier<S>`, any\n// augmentations of the `Modifier` type performed by tools like Glint will\n// also apply to function-based modifiers as well.\nexport declare abstract class FunctionBasedModifierInstance<\n  S,\n> extends Modifier<S> {\n  protected abstract __concrete__: never;\n}\n\n// This provides a type whose only purpose here is to represent the runtime\n// type of a function-based modifier: a virtually opaque item. The fact that it's\n// a bare constructor type allows `modifier()` to preserve type parameters from\n// a generic function it's passed, and by making it abstract and impossible to\n// subclass (see above) we prevent users from attempting to instantiate the return\n// value from a `modifier()` call.\nexport type FunctionBasedModifier<S> =\n  abstract new () => FunctionBasedModifierInstance<S>;\n\n/**\n * The (optional) return type for a modifier which needs to perform some kind of\n * cleanup or teardown -- for example, removing an event listener from an\n * element besides the one passed into the modifier.\n */\nexport type Teardown = () => unknown;\n\n/**\n * An API for writing simple modifiers.\n *\n * This function runs the first time when the element the modifier was applied\n * to is inserted into the DOM, and it *autotracks* while running. Any values\n * that it accesses will be tracked, including any of its arguments that it\n * accesses, and if any of them changes, the function will run again.\n *\n * **Note:** this will *not* automatically rerun because an argument changes. It\n * will only rerun if it is *using* that argument (the same as with auto-tracked\n * state in general).\n *\n * The modifier can also optionally return a *destructor*. The destructor\n * function will be run just before the next update, and when the element is\n * being removed entirely. It should generally clean up the changes that the\n * modifier made in the first place.\n *\n * @param fn The function which defines the modifier.\n */\n// This overload allows users to write types directly on the callback passed to\n// the `modifier` function and infer the resulting type correctly.\nexport default function modifier<\n  E extends Element,\n  P extends unknown[],\n  N = EmptyObject,\n>(\n  fn: (element: E, positional: P, named: N) => void | Teardown,\n): FunctionBasedModifier<{\n  Args: {\n    Positional: P;\n    Named: N;\n  };\n  Element: E;\n}>;\n\n/**\n * An API for writing simple modifiers.\n *\n * This function runs the first time when the element the modifier was applied\n * to is inserted into the DOM, and it *autotracks* while running. Any values\n * that it accesses will be tracked, including any of its arguments that it\n * accesses, and if any of them changes, the function will run again.\n *\n * **Note:** this will *not* automatically rerun because an argument changes. It\n * will only rerun if it is *using* that argument (the same as with auto-tracked\n * state in general).\n *\n * The modifier can also optionally return a *destructor*. The destructor\n * function will be run just before the next update, and when the element is\n * being removed entirely. It should generally clean up the changes that the\n * modifier made in the first place.\n *\n * @param fn The function which defines the modifier.\n */\n// This overload allows users to provide a `Signature` type explicitly at the\n// modifier definition site, e.g. `modifier<Sig>((el, pos, named) => {...})`.\n// **Note:** this overload must appear second, since TS' inference engine will\n// not correctly infer the type of `S` here from the types on the supplied\n// callback.\nexport default function modifier<S>(\n  fn: (\n    element: ElementFor<S>,\n    positional: PositionalArgs<S>,\n    named: NamedArgs<S>,\n  ) => void | Teardown,\n): FunctionBasedModifier<{\n  Element: ElementFor<S>;\n  Args: {\n    Named: NamedArgs<S>;\n    Positional: PositionalArgs<S>;\n  };\n}>;\n\n// This is the runtime signature; it performs no inference whatsover and just\n// uses the simplest version of the invocation possible since, for the case of\n// setting it on the modifier manager, we don't *need* any of that info, and\n// the two previous overloads capture all invocations from a type perspective.\nexport default function modifier(\n  fn: (\n    element: Element,\n    positional: unknown[],\n    named: object,\n  ) => void | Teardown,\n  options?: {\n    name: string;\n  },\n): FunctionBasedModifier<{\n  Element: Element;\n  Args: {\n    Named: object;\n    Positional: unknown[];\n  };\n}> {\n  fn.toString = () => options?.name || fn.name;\n  // SAFETY: the cast here is a *lie*, but it is a useful one. The actual return\n  // type of `setModifierManager` today is `void`; we pretend it actually\n  // returns an opaque `Modifier` type so that we can provide a result from this\n  // type which is useful to TS-aware tooling (e.g. Glint).\n  return setModifierManager(\n    () => MANAGER,\n    fn,\n  ) as unknown as FunctionBasedModifier<{\n    Element: Element;\n    Args: {\n      Named: object;\n      Positional: unknown[];\n    };\n  }>;\n}\n\n/**\n * @internal\n */\nexport type FunctionBasedModifierDefinition<S> = (\n  element: ElementFor<S>,\n  positional: PositionalArgs<S>,\n  named: NamedArgs<S>,\n) => void | Teardown;\n","import { capabilities } from '@ember/modifier';\nimport type { FunctionBasedModifierDefinition, Teardown } from './modifier';\nimport type { ArgsFor, ElementFor } from '../signature';\n\ninterface State<S> {\n  instance: FunctionBasedModifierDefinition<S>;\n}\n\ninterface CreatedState<S> extends State<S> {\n  element: null;\n}\n\ninterface InstalledState<S> extends State<S> {\n  element: ElementFor<S>;\n  teardown?: Teardown;\n}\n\n// Wraps the unsafe (b/c it mutates, rather than creating new state) code that\n// TS does not yet understand.\nfunction installElement<S>(\n  state: CreatedState<S>,\n  element: ElementFor<S>,\n): InstalledState<S> {\n  // SAFETY: this cast represents how we are actually handling the state machine\n  // transition: from this point forward in the lifecycle of the modifier, it\n  // always behaves as `InstalledState<S>`. It is safe because, and *only*\n  // because, we immediately initialize `element`. (We cannot create a new state\n  // from the old one because the modifier manager API expects mutation of a\n  // single state bucket rather than updating it at hook calls.)\n  const installedState = state as State<S> as InstalledState<S>;\n  installedState.element = element;\n  return installedState;\n}\n\nexport default class FunctionBasedModifierManager<S> {\n  capabilities = capabilities('3.22');\n\n  createModifier(\n    instance: FunctionBasedModifierDefinition<S>,\n  ): CreatedState<S> {\n    return { element: null, instance };\n  }\n\n  installModifier(\n    createdState: CreatedState<S>,\n    element: ElementFor<S>,\n    args: ArgsFor<S>,\n  ): void {\n    const state = installElement(createdState, element);\n\n    const { positional, named } = args;\n    const teardown = createdState.instance(element, positional, named);\n    if (typeof teardown === 'function') {\n      state.teardown = teardown;\n    }\n  }\n\n  updateModifier(state: InstalledState<S>, args: ArgsFor<S>): void {\n    if (typeof state.teardown === 'function') {\n      state.teardown();\n    }\n\n    const teardown = state.instance(state.element, args.positional, args.named);\n    if (typeof teardown === 'function') {\n      state.teardown = teardown;\n    }\n  }\n\n  destroyModifier(state: InstalledState<S>): void {\n    if (typeof state.teardown === 'function') {\n      state.teardown();\n    }\n  }\n\n  getDebugName(state: InstalledState<S>): string {\n    return state.instance.toString();\n  }\n\n  getDebugInstance(state: InstalledState<S>): InstalledState<S> {\n    return state;\n  }\n}\n","import Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { findMoment } from '../find-moment';\nconst moment = findMoment();\n\nexport default class PikadayInputComponent extends Component {\n  constructor(owner, args) {\n    super(owner, args);\n  }\n\n  get moment() {\n    return this.args.moment || moment;\n  }\n\n  get format() {\n    return this.args.format || 'DD.MM.YYYY';\n  }\n\n  get value() {\n    let { value, useUTC } = this.args;\n    let moment = this.moment;\n    if (useUTC && value) {\n      let format = 'YYYY-MM-DD';\n      value = moment(moment.utc(value).format(format), format).toDate();\n    }\n    return value;\n  }\n\n  get yearRange() {\n    const yearRange = this.args.yearRange;\n    if (!yearRange) {\n      return 10;\n    }\n    if (yearRange.indexOf(',') > -1) {\n      const yearArray = yearRange.split(',');\n      if (yearArray[1] === 'currentYear') {\n        yearArray[1] = new Date().getFullYear();\n      }\n      return yearArray;\n    } else {\n      return yearRange;\n    }\n  }\n\n  get i18n() {\n    let i18n = this.args.i18n;\n    if (!i18n) {\n      return undefined;\n    }\n    if (!i18n.t) {\n      return i18n;\n    }\n    return {\n      previousMonth: i18n.t('previousMonth').toString(),\n      nextMonth: i18n.t('nextMonth').toString(),\n      months: i18n.t('months').toString().split(','),\n      weekdays: i18n.t('weekdays').toString().split(','),\n      weekdaysShort: i18n.t('weekdaysShort').toString().split(','),\n    };\n  }\n\n  get firstDay() {\n    return this.args.firstDay == null ? 1 : parseInt(this.args.firstDay, 10);\n  }\n\n  @action\n  onClose() {\n    if (this.isDestroying) {\n      return;\n    }\n    if (!this.#heardValue) {\n      this.onSelect(null);\n    }\n    this.args.onClose?.();\n  }\n\n  #heardValue;\n\n  @action\n  onDraw() {\n    // this is here because apparently the classic behavior is to pass no\n    // arguments to the onDraw callback, but Pikaday's own ownDraw has an\n    // argument.\n    this.args.onDraw?.();\n  }\n\n  @action\n  didChange(event) {\n    this.#heardValue = event.target.value;\n  }\n\n  @action\n  onSelect(date) {\n    if (this.args.useUTC && date) {\n      date = this.moment\n        .utc([date.getFullYear(), date.getMonth(), date.getDate()])\n        .toDate();\n    }\n    this.args.onSelection?.(date);\n  }\n}\n","import Component from '@glimmer/component';\nimport { modifier } from 'ember-modifier';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class PikadayInputlessComponent extends Component {\n  @tracked container;\n  constructor(owner, args) {\n    super(owner, args);\n    this.setContainer = modifier(\n      (element) => {\n        this.container = element;\n      },\n      { eager: false },\n    );\n  }\n}\n","import {\n  dependencySatisfies,\n  macroCondition,\n  importSync,\n} from '@embroider/macros';\n\nexport function maybeFindMoment() {\n  if (macroCondition(dependencySatisfies('moment-timezone', '*'))) {\n    return importSync('moment-timezone').default;\n  } else if (macroCondition(dependencySatisfies('moment', '*'))) {\n    return importSync('moment').default;\n  } else {\n    return undefined;\n  }\n}\n\nexport function findMoment() {\n  let moment = maybeFindMoment();\n  if (moment) {\n    return moment;\n  }\n  throw new Error(\n    `You're trying to use a feature of ember-pikaday that depends on moment or moment-timezone, but neither was found`,\n  );\n}\n","export default function esCompat(m) {\n  return m?.__esModule ? m : { default: m, ...m };\n}\n","import { registerDestructor } from '@ember/destroyable';\nimport Modifier from 'ember-modifier';\nimport makePikaday from '../../vendor/pikaday';\nimport { maybeFindMoment } from '../find-moment';\nconst Pikaday = makePikaday(maybeFindMoment());\n\nexport default class PikadayModifier extends Modifier {\n  #pikaday;\n  #observer;\n\n  constructor(owner, args) {\n    super(owner, args);\n\n    registerDestructor(this, () => {\n      this.#pikaday.destroy();\n      this.#observer.disconnect();\n    });\n  }\n\n  getPikadayOptions(element, positional, named) {\n    let opts = {\n      // Our element is Pikaday's field\n      field: element,\n\n      // All other named arguments go through to Pikaday\n      ...named,\n\n      // We also optionally accept a bag of arguments as the first positional\n      // argument, because it's hard to do argument splatting in hbs. These are\n      // taking precedence over the named arguments.\n      ...positional[0],\n    };\n\n    if (!opts.i18n) {\n      // Pikaday doesn't like it if you pass an empty value for i18n, whereas\n      // it's hard in HBS to conditionally include a named argument, so we\n      // drop it here.\n      delete opts.i18n;\n    }\n    return opts;\n  }\n\n  modify(element, positional, named) {\n    const pikadayOptions = this.getPikadayOptions(element, positional, named);\n\n    if (!this.#pikaday) {\n      this.#pikaday = new Pikaday(pikadayOptions);\n      let { value, register } = named;\n      if (value) {\n        this.#pikaday.setDate(value, true);\n      }\n      this.syncDisabled(element);\n      this.#observer = new MutationObserver(() => this.syncDisabled(element));\n      this.#observer.observe(element, { attributes: true });\n      register?.(this.#pikaday);\n    } else {\n      let { value } = named;\n\n      this.#pikaday.setDate(value, true);\n      this.#pikaday.config(pikadayOptions);\n    }\n  }\n\n  syncDisabled(element) {\n    if (element.hasAttribute('disabled')) {\n      this.#pikaday.hide();\n    }\n  }\n}\n","/*!\n * Pikaday\n *\n * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/Pikaday/Pikaday\n * \n * Packaging modified by Edward Faulkner for easier integration with ES-module build tooling.\n */\n\nexport default function factory(moment)\n{\n    'use strict';\n\n    /**\n     * feature detection and helper functions\n     */\n    var hasMoment = typeof moment === 'function',\n\n    hasEventListeners = !!window.addEventListener,\n\n    document = window.document,\n\n    sto = window.setTimeout,\n\n    addEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.addEventListener(e, callback, !!capture);\n        } else {\n            el.attachEvent('on' + e, callback);\n        }\n    },\n\n    removeEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.removeEventListener(e, callback, !!capture);\n        } else {\n            el.detachEvent('on' + e, callback);\n        }\n    },\n\n    trim = function(str)\n    {\n        return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g,'');\n    },\n\n    hasClass = function(el, cn)\n    {\n        return (' ' + el.className + ' ').indexOf(' ' + cn + ' ') !== -1;\n    },\n\n    addClass = function(el, cn)\n    {\n        if (!hasClass(el, cn)) {\n            el.className = (el.className === '') ? cn : el.className + ' ' + cn;\n        }\n    },\n\n    removeClass = function(el, cn)\n    {\n        el.className = trim((' ' + el.className + ' ').replace(' ' + cn + ' ', ' '));\n    },\n\n    isArray = function(obj)\n    {\n        return (/Array/).test(Object.prototype.toString.call(obj));\n    },\n\n    isDate = function(obj)\n    {\n        return (/Date/).test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n    },\n\n    isWeekend = function(date)\n    {\n        var day = date.getDay();\n        return day === 0 || day === 6;\n    },\n\n    isLeapYear = function(year)\n    {\n        // solution lifted from date.js (MIT license): https://github.com/datejs/Datejs\n        return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);\n    },\n\n    getDaysInMonth = function(year, month)\n    {\n        return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n    },\n\n    setToStartOfDay = function(date)\n    {\n        if (isDate(date)) date.setHours(0,0,0,0);\n    },\n\n    compareDates = function(a,b)\n    {\n        // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n        return a.getTime() === b.getTime();\n    },\n\n    extend = function(to, from, overwrite)\n    {\n        var prop, hasProp;\n        for (prop in from) {\n            hasProp = to[prop] !== undefined;\n            if (hasProp && typeof from[prop] === 'object' && from[prop] !== null && from[prop].nodeName === undefined) {\n                if (isDate(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = new Date(from[prop].getTime());\n                    }\n                }\n                else if (isArray(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = from[prop].slice(0);\n                    }\n                } else {\n                    to[prop] = extend({}, from[prop], overwrite);\n                }\n            } else if (overwrite || !hasProp) {\n                to[prop] = from[prop];\n            }\n        }\n        return to;\n    },\n\n    fireEvent = function(el, eventName, data)\n    {\n        var ev;\n\n        if (document.createEvent) {\n            ev = document.createEvent('HTMLEvents');\n            ev.initEvent(eventName, true, false);\n            ev = extend(ev, data);\n            el.dispatchEvent(ev);\n        } else if (document.createEventObject) {\n            ev = document.createEventObject();\n            ev = extend(ev, data);\n            el.fireEvent('on' + eventName, ev);\n        }\n    },\n\n    adjustCalendar = function(calendar) {\n        if (calendar.month < 0) {\n            calendar.year -= Math.ceil(Math.abs(calendar.month)/12);\n            calendar.month += 12;\n        }\n        if (calendar.month > 11) {\n            calendar.year += Math.floor(Math.abs(calendar.month)/12);\n            calendar.month -= 12;\n        }\n        return calendar;\n    },\n\n    /**\n     * defaults and localisation\n     */\n    defaults = {\n\n        // bind the picker to a form field\n        field: null,\n\n        // automatically show/hide the picker on `field` focus (default `true` if `field` is set)\n        bound: undefined,\n\n        // data-attribute on the input field with an aria assistance text (only applied when `bound` is set)\n        ariaLabel: 'Use the arrow keys to pick a date',\n\n        // position of the datepicker, relative to the field (default to bottom & left)\n        // ('bottom' & 'left' keywords are not used, 'top' & 'right' are modifier on the bottom/left position)\n        position: 'bottom left',\n\n        // automatically fit in the viewport even if it means repositioning from the position option\n        reposition: true,\n\n        // the default output format for `.toString()` and `field` value\n        format: 'YYYY-MM-DD',\n\n        // the toString function which gets passed a current date object and format\n        // and returns a string\n        toString: null,\n\n        // used to create date object from current input string\n        parse: null,\n\n        // the initial date to view when first opened\n        defaultDate: null,\n\n        // make the `defaultDate` the initial selected value\n        setDefaultDate: false,\n\n        // first day of week (0: Sunday, 1: Monday etc)\n        firstDay: 0,\n\n        // minimum number of days in the week that gets week number one\n        // default ISO 8601, week 01 is the week with the first Thursday (4)\n        firstWeekOfYearMinDays: 4,\n\n        // the default flag for moment's strict date parsing\n        formatStrict: false,\n\n        // the minimum/earliest date that can be selected\n        minDate: null,\n        // the maximum/latest date that can be selected\n        maxDate: null,\n\n        // number of years either side, or array of upper/lower range\n        yearRange: 10,\n\n        // show week numbers at head of row\n        showWeekNumber: false,\n\n        // Week picker mode\n        pickWholeWeek: false,\n\n        // used internally (don't config outside)\n        minYear: 0,\n        maxYear: 9999,\n        minMonth: undefined,\n        maxMonth: undefined,\n\n        startRange: null,\n        endRange: null,\n\n        isRTL: false,\n\n        // Additional text to append to the year in the calendar title\n        yearSuffix: '',\n\n        // Render the month after year in the calendar title\n        showMonthAfterYear: false,\n\n        // Render days of the calendar grid that fall in the next or previous month\n        showDaysInNextAndPreviousMonths: false,\n\n        // Allows user to select days that fall in the next or previous month\n        enableSelectionDaysInNextAndPreviousMonths: false,\n\n        // how many months are visible\n        numberOfMonths: 1,\n\n        // when numberOfMonths is used, this will help you to choose where the main calendar will be (default `left`, can be set to `right`)\n        // only used for the first display or when a selected date is not visible\n        mainCalendar: 'left',\n\n        // Specify a DOM element to render the calendar in\n        container: undefined,\n\n        // Blur field when date is selected\n        blurFieldOnSelect : true,\n\n        // internationalization\n        i18n: {\n            previousMonth : 'Previous Month',\n            nextMonth     : 'Next Month',\n            months        : ['January','February','March','April','May','June','July','August','September','October','November','December'],\n            weekdays      : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],\n            weekdaysShort : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']\n        },\n\n        // Theme Classname\n        theme: null,\n\n        // events array\n        events: [],\n\n        // callback function\n        onSelect: null,\n        onOpen: null,\n        onClose: null,\n        onDraw: null,\n\n        // Enable keyboard input\n        keyboardInput: true\n    },\n\n\n    /**\n     * templating functions to abstract HTML rendering\n     */\n    renderDayName = function(opts, day, abbr)\n    {\n        day += opts.firstDay;\n        while (day >= 7) {\n            day -= 7;\n        }\n        return abbr ? opts.i18n.weekdaysShort[day] : opts.i18n.weekdays[day];\n    },\n\n    renderDay = function(opts)\n    {\n        var arr = [];\n        var ariaSelected = 'false';\n        if (opts.isEmpty) {\n            if (opts.showDaysInNextAndPreviousMonths) {\n                arr.push('is-outside-current-month');\n\n                if(!opts.enableSelectionDaysInNextAndPreviousMonths) {\n                    arr.push('is-selection-disabled');\n                }\n\n            } else {\n                return '<td class=\"is-empty\"></td>';\n            }\n        }\n        if (opts.isDisabled) {\n            arr.push('is-disabled');\n        }\n        if (opts.isToday) {\n            arr.push('is-today');\n        }\n        if (opts.isSelected) {\n            arr.push('is-selected');\n            ariaSelected = 'true';\n        }\n        if (opts.hasEvent) {\n            arr.push('has-event');\n        }\n        if (opts.isInRange) {\n            arr.push('is-inrange');\n        }\n        if (opts.isStartRange) {\n            arr.push('is-startrange');\n        }\n        if (opts.isEndRange) {\n            arr.push('is-endrange');\n        }\n        return '<td data-day=\"' + opts.day + '\" class=\"' + arr.join(' ') + '\" aria-selected=\"' + ariaSelected + '\">' +\n                 '<button class=\"pika-button pika-day\" type=\"button\" ' +\n                    'data-pika-year=\"' + opts.year + '\" data-pika-month=\"' + opts.month + '\" data-pika-day=\"' + opts.day + '\">' +\n                        opts.day +\n                 '</button>' +\n               '</td>';\n    },\n\n    isoWeek = function(date, firstWeekOfYearMinDays) {\n        // Ensure we're at the start of the day.\n        date.setHours(0, 0, 0, 0);\n\n        // Thursday in current week decides the year because January 4th\n        // is always in the first week according to ISO8601.\n        var yearDay        = date.getDate(),\n            weekDay        = date.getDay(),\n            dayInFirstWeek = firstWeekOfYearMinDays,\n            dayShift       = dayInFirstWeek - 1, // counting starts at 0\n            daysPerWeek    = 7,\n            prevWeekDay    = function(day) { return (day + daysPerWeek - 1) % daysPerWeek; };\n\n        // Adjust to Thursday in week 1 and count number of weeks from date to week 1.\n        date.setDate(yearDay + dayShift - prevWeekDay(weekDay));\n\n        var jan4th      = new Date(date.getFullYear(), 0, dayInFirstWeek),\n            msPerDay    = 24 * 60 * 60 * 1000,\n            daysBetween = (date.getTime() - jan4th.getTime()) / msPerDay,\n            weekNum     = 1 + Math.round((daysBetween - dayShift + prevWeekDay(jan4th.getDay())) / daysPerWeek);\n\n        return weekNum;\n    },\n\n    renderWeek = function (d, m, y, firstWeekOfYearMinDays) {\n        var date = new Date(y, m, d),\n            week = hasMoment ? moment(date).isoWeek() : isoWeek(date, firstWeekOfYearMinDays);\n\n        return '<td class=\"pika-week\">' + week + '</td>';\n    },\n\n    renderRow = function(days, isRTL, pickWholeWeek, isRowSelected)\n    {\n        return '<tr class=\"pika-row' + (pickWholeWeek ? ' pick-whole-week' : '') + (isRowSelected ? ' is-selected' : '') + '\">' + (isRTL ? days.reverse() : days).join('') + '</tr>';\n    },\n\n    renderBody = function(rows)\n    {\n        return '<tbody>' + rows.join('') + '</tbody>';\n    },\n\n    renderHead = function(opts)\n    {\n        var i, arr = [];\n        if (opts.showWeekNumber) {\n            arr.push('<th></th>');\n        }\n        for (i = 0; i < 7; i++) {\n            arr.push('<th scope=\"col\"><abbr title=\"' + renderDayName(opts, i) + '\">' + renderDayName(opts, i, true) + '</abbr></th>');\n        }\n        return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n    },\n\n    renderTitle = function(instance, c, year, month, refYear, randId)\n    {\n        var i, j, arr,\n            opts = instance._o,\n            isMinYear = year === opts.minYear,\n            isMaxYear = year === opts.maxYear,\n            html = '<div id=\"' + randId + '\" class=\"pika-title\" role=\"heading\" aria-live=\"assertive\">',\n            monthHtml,\n            yearHtml,\n            prev = true,\n            next = true;\n\n        for (arr = [], i = 0; i < 12; i++) {\n            arr.push('<option value=\"' + (year === refYear ? i - c : 12 + i - c) + '\"' +\n                (i === month ? ' selected=\"selected\"': '') +\n                ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth) ? ' disabled=\"disabled\"' : '') + '>' +\n                opts.i18n.months[i] + '</option>');\n        }\n\n        monthHtml = '<div class=\"pika-label\">' + opts.i18n.months[month] + '<select class=\"pika-select pika-select-month\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (isArray(opts.yearRange)) {\n            i = opts.yearRange[0];\n            j = opts.yearRange[1] + 1;\n        } else {\n            i = year - opts.yearRange;\n            j = 1 + year + opts.yearRange;\n        }\n\n        for (arr = []; i < j && i <= opts.maxYear; i++) {\n            if (i >= opts.minYear) {\n                arr.push('<option value=\"' + i + '\"' + (i === year ? ' selected=\"selected\"': '') + '>' + (i) + '</option>');\n            }\n        }\n        yearHtml = '<div class=\"pika-label\">' + year + opts.yearSuffix + '<select class=\"pika-select pika-select-year\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (opts.showMonthAfterYear) {\n            html += yearHtml + monthHtml;\n        } else {\n            html += monthHtml + yearHtml;\n        }\n\n        if (isMinYear && (month === 0 || opts.minMonth >= month)) {\n            prev = false;\n        }\n\n        if (isMaxYear && (month === 11 || opts.maxMonth <= month)) {\n            next = false;\n        }\n\n        if (c === 0) {\n            html += '<button class=\"pika-prev' + (prev ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.previousMonth + '</button>';\n        }\n        if (c === (instance._o.numberOfMonths - 1) ) {\n            html += '<button class=\"pika-next' + (next ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.nextMonth + '</button>';\n        }\n\n        return html += '</div>';\n    },\n\n    renderTable = function(opts, data, randId)\n    {\n        return '<table cellpadding=\"0\" cellspacing=\"0\" class=\"pika-table\" role=\"grid\" aria-labelledby=\"' + randId + '\">' + renderHead(opts) + renderBody(data) + '</table>';\n    },\n\n\n    /**\n     * Pikaday constructor\n     */\n    Pikaday = function(options)\n    {\n        var self = this,\n            opts = self.config(options);\n\n        self._onMouseDown = function(e)\n        {\n            if (!self._v) {\n                return;\n            }\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n\n            if (!hasClass(target, 'is-disabled')) {\n                if (hasClass(target, 'pika-button') && !hasClass(target, 'is-empty') && !hasClass(target.parentNode, 'is-disabled')) {\n                    self.setDate(new Date(target.getAttribute('data-pika-year'), target.getAttribute('data-pika-month'), target.getAttribute('data-pika-day')));\n                    if (opts.bound) {\n                        sto(function() {\n                            self.hide();\n                            if (opts.blurFieldOnSelect && opts.field) {\n                                opts.field.blur();\n                            }\n                        }, 100);\n                    }\n                }\n                else if (hasClass(target, 'pika-prev')) {\n                    self.prevMonth();\n                }\n                else if (hasClass(target, 'pika-next')) {\n                    self.nextMonth();\n                }\n            }\n            if (!hasClass(target, 'pika-select')) {\n                // if this is touch event prevent mouse events emulation\n                if (e.preventDefault) {\n                    e.preventDefault();\n                } else {\n                    e.returnValue = false;\n                    return false;\n                }\n            } else {\n                self._c = true;\n            }\n        };\n\n        self._onChange = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n            if (hasClass(target, 'pika-select-month')) {\n                self.gotoMonth(target.value);\n            }\n            else if (hasClass(target, 'pika-select-year')) {\n                self.gotoYear(target.value);\n            }\n        };\n\n        self._onKeyChange = function(e)\n        {\n            e = e || window.event;\n\n            if (self.isVisible()) {\n\n                switch(e.keyCode){\n                    case 13:\n                    case 27:\n                        if (opts.field) {\n                            opts.field.blur();\n                        }\n                        break;\n                    case 37:\n                        self.adjustDate('subtract', 1);\n                        break;\n                    case 38:\n                        self.adjustDate('subtract', 7);\n                        break;\n                    case 39:\n                        self.adjustDate('add', 1);\n                        break;\n                    case 40:\n                        self.adjustDate('add', 7);\n                        break;\n                    case 8:\n                    case 46:\n                        self.setDate(null);\n                        break;\n                }\n            }\n        };\n\n        self._parseFieldValue = function()\n        {\n            if (opts.parse) {\n                return opts.parse(opts.field.value, opts.format);\n            } else if (hasMoment) {\n                var date = moment(opts.field.value, opts.format, opts.formatStrict);\n                return (date && date.isValid()) ? date.toDate() : null;\n            } else {\n                return new Date(Date.parse(opts.field.value));\n            }\n        };\n\n        self._onInputChange = function(e)\n        {\n            var date;\n\n            if (e.firedBy === self) {\n                return;\n            }\n            date = self._parseFieldValue();\n            if (isDate(date)) {\n              self.setDate(date);\n            }\n            if (!self._v) {\n                self.show();\n            }\n        };\n\n        self._onInputFocus = function()\n        {\n            self.show();\n        };\n\n        self._onInputClick = function()\n        {\n            self.show();\n        };\n\n        self._onInputBlur = function()\n        {\n            // IE allows pika div to gain focus; catch blur the input field\n            var pEl = document.activeElement;\n            do {\n                if (hasClass(pEl, 'pika-single')) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n\n            if (!self._c) {\n                self._b = sto(function() {\n                    self.hide();\n                }, 50);\n            }\n            self._c = false;\n        };\n\n        self._onClick = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement,\n                pEl = target;\n            if (!target) {\n                return;\n            }\n            if (!hasEventListeners && hasClass(target, 'pika-select')) {\n                if (!target.onchange) {\n                    target.setAttribute('onchange', 'return;');\n                    addEvent(target, 'change', self._onChange);\n                }\n            }\n            do {\n                if (hasClass(pEl, 'pika-single') || pEl === opts.trigger) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n            if (self._v && target !== opts.trigger && pEl !== opts.trigger) {\n                self.hide();\n            }\n        };\n\n        self.el = document.createElement('div');\n        self.el.className = 'pika-single' + (opts.isRTL ? ' is-rtl' : '') + (opts.theme ? ' ' + opts.theme : '');\n\n        addEvent(self.el, 'mousedown', self._onMouseDown, true);\n        addEvent(self.el, 'touchend', self._onMouseDown, true);\n        addEvent(self.el, 'change', self._onChange);\n\n        if (opts.keyboardInput) {\n            addEvent(document, 'keydown', self._onKeyChange);\n        }\n\n        if (opts.field) {\n            if (opts.container) {\n                opts.container.appendChild(self.el);\n            } else if (opts.bound) {\n                document.body.appendChild(self.el);\n            } else {\n                opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling);\n            }\n            addEvent(opts.field, 'change', self._onInputChange);\n\n            if (!opts.defaultDate) {\n                opts.defaultDate = self._parseFieldValue();\n                opts.setDefaultDate = true;\n            }\n        }\n\n        var defDate = opts.defaultDate;\n\n        if (isDate(defDate)) {\n            if (opts.setDefaultDate) {\n                self.setDate(defDate, true);\n            } else {\n                self.gotoDate(defDate);\n            }\n        } else {\n            self.gotoDate(new Date());\n        }\n\n        if (opts.bound) {\n            this.hide();\n            self.el.className += ' is-bound';\n            addEvent(opts.trigger, 'click', self._onInputClick);\n            addEvent(opts.trigger, 'focus', self._onInputFocus);\n            addEvent(opts.trigger, 'blur', self._onInputBlur);\n        } else {\n            this.show();\n        }\n    };\n\n\n    /**\n     * public Pikaday API\n     */\n    Pikaday.prototype = {\n\n\n        /**\n         * configure functionality\n         */\n        config: function(options)\n        {\n            if (!this._o) {\n                this._o = extend({}, defaults, true);\n            }\n\n            var opts = extend(this._o, options, true);\n\n            opts.isRTL = !!opts.isRTL;\n\n            opts.field = (opts.field && opts.field.nodeName) ? opts.field : null;\n\n            opts.theme = (typeof opts.theme) === 'string' && opts.theme ? opts.theme : null;\n\n            opts.bound = !!(opts.bound !== undefined ? opts.field && opts.bound : opts.field);\n\n            opts.trigger = (opts.trigger && opts.trigger.nodeName) ? opts.trigger : opts.field;\n\n            opts.disableWeekends = !!opts.disableWeekends;\n\n            opts.disableDayFn = (typeof opts.disableDayFn) === 'function' ? opts.disableDayFn : null;\n\n            var nom = parseInt(opts.numberOfMonths, 10) || 1;\n            opts.numberOfMonths = nom > 4 ? 4 : nom;\n\n            if (!isDate(opts.minDate)) {\n                opts.minDate = false;\n            }\n            if (!isDate(opts.maxDate)) {\n                opts.maxDate = false;\n            }\n            if ((opts.minDate && opts.maxDate) && opts.maxDate < opts.minDate) {\n                opts.maxDate = opts.minDate = false;\n            }\n            if (opts.minDate) {\n                this.setMinDate(opts.minDate);\n            }\n            if (opts.maxDate) {\n                this.setMaxDate(opts.maxDate);\n            }\n\n            if (isArray(opts.yearRange)) {\n                var fallback = new Date().getFullYear() - 10;\n                opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback;\n                opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback;\n            } else {\n                opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults.yearRange;\n                if (opts.yearRange > 100) {\n                    opts.yearRange = 100;\n                }\n            }\n\n            return opts;\n        },\n\n        /**\n         * return a formatted string of the current selection (using Moment.js if available)\n         */\n        toString: function(format)\n        {\n            format = format || this._o.format;\n            if (!isDate(this._d)) {\n                return '';\n            }\n            if (this._o.toString) {\n              return this._o.toString(this._d, format);\n            }\n            if (hasMoment) {\n              return moment(this._d).format(format);\n            }\n            return this._d.toDateString();\n        },\n\n        /**\n         * return a Moment.js object of the current selection (if available)\n         */\n        getMoment: function()\n        {\n            return hasMoment ? moment(this._d) : null;\n        },\n\n        /**\n         * set the current selection from a Moment.js object (if available)\n         */\n        setMoment: function(date, preventOnSelect)\n        {\n            if (hasMoment && moment.isMoment(date)) {\n                this.setDate(date.toDate(), preventOnSelect);\n            }\n        },\n\n        /**\n         * return a Date object of the current selection\n         */\n        getDate: function()\n        {\n            return isDate(this._d) ? new Date(this._d.getTime()) : null;\n        },\n\n        /**\n         * set the current selection\n         */\n        setDate: function(date, preventOnSelect)\n        {\n            if (!date) {\n                this._d = null;\n\n                if (this._o.field) {\n                    this._o.field.value = '';\n                    fireEvent(this._o.field, 'change', { firedBy: this });\n                }\n\n                return this.draw();\n            }\n            if (typeof date === 'string') {\n                date = new Date(Date.parse(date));\n            }\n            if (!isDate(date)) {\n                return;\n            }\n\n            var min = this._o.minDate,\n                max = this._o.maxDate;\n\n            if (isDate(min) && date < min) {\n                date = min;\n            } else if (isDate(max) && date > max) {\n                date = max;\n            }\n\n            this._d = new Date(date.getTime());\n            setToStartOfDay(this._d);\n            this.gotoDate(this._d);\n\n            if (this._o.field) {\n                this._o.field.value = this.toString();\n                fireEvent(this._o.field, 'change', { firedBy: this });\n            }\n            if (!preventOnSelect && typeof this._o.onSelect === 'function') {\n                this._o.onSelect.call(this, this.getDate());\n            }\n        },\n\n        /**\n         * clear and reset the date\n         */\n        clear: function()\n        {\n            this.setDate(null);\n        },\n\n        /**\n         * change view to a specific date\n         */\n        gotoDate: function(date)\n        {\n            var newCalendar = true;\n\n            if (!isDate(date)) {\n                return;\n            }\n\n            if (this.calendars) {\n                var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n                    lastVisibleDate = new Date(this.calendars[this.calendars.length-1].year, this.calendars[this.calendars.length-1].month, 1),\n                    visibleDate = date.getTime();\n                // get the end of the month\n                lastVisibleDate.setMonth(lastVisibleDate.getMonth()+1);\n                lastVisibleDate.setDate(lastVisibleDate.getDate()-1);\n                newCalendar = (visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate);\n            }\n\n            if (newCalendar) {\n                this.calendars = [{\n                    month: date.getMonth(),\n                    year: date.getFullYear()\n                }];\n                if (this._o.mainCalendar === 'right') {\n                    this.calendars[0].month += 1 - this._o.numberOfMonths;\n                }\n            }\n\n            this.adjustCalendars();\n        },\n\n        adjustDate: function(sign, days) {\n\n            var day = this.getDate() || new Date();\n            var difference = parseInt(days)*24*60*60*1000;\n\n            var newDay;\n\n            if (sign === 'add') {\n                newDay = new Date(day.valueOf() + difference);\n            } else if (sign === 'subtract') {\n                newDay = new Date(day.valueOf() - difference);\n            }\n\n            this.setDate(newDay);\n        },\n\n        adjustCalendars: function() {\n            this.calendars[0] = adjustCalendar(this.calendars[0]);\n            for (var c = 1; c < this._o.numberOfMonths; c++) {\n                this.calendars[c] = adjustCalendar({\n                    month: this.calendars[0].month + c,\n                    year: this.calendars[0].year\n                });\n            }\n            this.draw();\n        },\n\n        gotoToday: function()\n        {\n            this.gotoDate(new Date());\n        },\n\n        /**\n         * change view to a specific month (zero-index, e.g. 0: January)\n         */\n        gotoMonth: function(month)\n        {\n            if (!isNaN(month)) {\n                this.calendars[0].month = parseInt(month, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        nextMonth: function()\n        {\n            this.calendars[0].month++;\n            this.adjustCalendars();\n        },\n\n        prevMonth: function()\n        {\n            this.calendars[0].month--;\n            this.adjustCalendars();\n        },\n\n        /**\n         * change view to a specific full year (e.g. \"2012\")\n         */\n        gotoYear: function(year)\n        {\n            if (!isNaN(year)) {\n                this.calendars[0].year = parseInt(year, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        /**\n         * change the minDate\n         */\n        setMinDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.minDate = value;\n                this._o.minYear  = value.getFullYear();\n                this._o.minMonth = value.getMonth();\n            } else {\n                this._o.minDate = defaults.minDate;\n                this._o.minYear  = defaults.minYear;\n                this._o.minMonth = defaults.minMonth;\n                this._o.startRange = defaults.startRange;\n            }\n\n            this.draw();\n        },\n\n        /**\n         * change the maxDate\n         */\n        setMaxDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.maxDate = value;\n                this._o.maxYear = value.getFullYear();\n                this._o.maxMonth = value.getMonth();\n            } else {\n                this._o.maxDate = defaults.maxDate;\n                this._o.maxYear = defaults.maxYear;\n                this._o.maxMonth = defaults.maxMonth;\n                this._o.endRange = defaults.endRange;\n            }\n\n            this.draw();\n        },\n\n        setStartRange: function(value)\n        {\n            this._o.startRange = value;\n        },\n\n        setEndRange: function(value)\n        {\n            this._o.endRange = value;\n        },\n\n        /**\n         * refresh the HTML\n         */\n        draw: function(force)\n        {\n            if (!this._v && !force) {\n                return;\n            }\n            var opts = this._o,\n                minYear = opts.minYear,\n                maxYear = opts.maxYear,\n                minMonth = opts.minMonth,\n                maxMonth = opts.maxMonth,\n                html = '',\n                randId;\n\n            if (this._y <= minYear) {\n                this._y = minYear;\n                if (!isNaN(minMonth) && this._m < minMonth) {\n                    this._m = minMonth;\n                }\n            }\n            if (this._y >= maxYear) {\n                this._y = maxYear;\n                if (!isNaN(maxMonth) && this._m > maxMonth) {\n                    this._m = maxMonth;\n                }\n            }\n\n            for (var c = 0; c < opts.numberOfMonths; c++) {\n                randId = 'pika-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2);\n                html += '<div class=\"pika-lendar\">' + renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId) + '</div>';\n            }\n\n            this.el.innerHTML = html;\n\n            if (opts.bound) {\n                if(opts.field.type !== 'hidden') {\n                    sto(function() {\n                        opts.trigger.focus();\n                    }, 1);\n                }\n            }\n\n            if (typeof this._o.onDraw === 'function') {\n                this._o.onDraw(this);\n            }\n\n            if (opts.bound) {\n                // let the screen reader user know to use arrow keys\n                opts.field.setAttribute('aria-label', opts.ariaLabel);\n            }\n        },\n\n        adjustPosition: function()\n        {\n            var field, pEl, width, height, viewportWidth, viewportHeight, scrollTop, left, top, clientRect, leftAligned, bottomAligned;\n\n            if (this._o.container) return;\n\n            this.el.style.position = 'absolute';\n\n            field = this._o.trigger;\n            pEl = field;\n            width = this.el.offsetWidth;\n            height = this.el.offsetHeight;\n            viewportWidth = window.innerWidth || document.documentElement.clientWidth;\n            viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n            scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;\n            leftAligned = true;\n            bottomAligned = true;\n\n            if (typeof field.getBoundingClientRect === 'function') {\n                clientRect = field.getBoundingClientRect();\n                left = clientRect.left + window.pageXOffset;\n                top = clientRect.bottom + window.pageYOffset;\n            } else {\n                left = pEl.offsetLeft;\n                top  = pEl.offsetTop + pEl.offsetHeight;\n                while((pEl = pEl.offsetParent)) {\n                    left += pEl.offsetLeft;\n                    top  += pEl.offsetTop;\n                }\n            }\n\n            // default position is bottom & left\n            if ((this._o.reposition && left + width > viewportWidth) ||\n                (\n                    this._o.position.indexOf('right') > -1 &&\n                    left - width + field.offsetWidth > 0\n                )\n            ) {\n                left = left - width + field.offsetWidth;\n                leftAligned = false;\n            }\n            if ((this._o.reposition && top + height > viewportHeight + scrollTop) ||\n                (\n                    this._o.position.indexOf('top') > -1 &&\n                    top - height - field.offsetHeight > 0\n                )\n            ) {\n                top = top - height - field.offsetHeight;\n                bottomAligned = false;\n            }\n            \n            if (left < 0) {\n                left = 0;\n            }\n\n            if (top < 0) {\n                top = 0;\n            }\n\n            this.el.style.left = left + 'px';\n            this.el.style.top = top + 'px';\n\n            addClass(this.el, leftAligned ? 'left-aligned' : 'right-aligned');\n            addClass(this.el, bottomAligned ? 'bottom-aligned' : 'top-aligned');\n            removeClass(this.el, !leftAligned ? 'left-aligned' : 'right-aligned');\n            removeClass(this.el, !bottomAligned ? 'bottom-aligned' : 'top-aligned');\n        },\n\n        /**\n         * render HTML for a particular month\n         */\n        render: function(year, month, randId)\n        {\n            var opts   = this._o,\n                now    = new Date(),\n                days   = getDaysInMonth(year, month),\n                before = new Date(year, month, 1).getDay(),\n                data   = [],\n                row    = [];\n            setToStartOfDay(now);\n            if (opts.firstDay > 0) {\n                before -= opts.firstDay;\n                if (before < 0) {\n                    before += 7;\n                }\n            }\n            var previousMonth = month === 0 ? 11 : month - 1,\n                nextMonth = month === 11 ? 0 : month + 1,\n                yearOfPreviousMonth = month === 0 ? year - 1 : year,\n                yearOfNextMonth = month === 11 ? year + 1 : year,\n                daysInPreviousMonth = getDaysInMonth(yearOfPreviousMonth, previousMonth);\n            var cells = days + before,\n                after = cells;\n            while(after > 7) {\n                after -= 7;\n            }\n            cells += 7 - after;\n            var isWeekSelected = false;\n            for (var i = 0, r = 0; i < cells; i++)\n            {\n                var day = new Date(year, month, 1 + (i - before)),\n                    isSelected = isDate(this._d) ? compareDates(day, this._d) : false,\n                    isToday = compareDates(day, now),\n                    hasEvent = opts.events.indexOf(day.toDateString()) !== -1 ? true : false,\n                    isEmpty = i < before || i >= (days + before),\n                    dayNumber = 1 + (i - before),\n                    monthNumber = month,\n                    yearNumber = year,\n                    isStartRange = opts.startRange && compareDates(opts.startRange, day),\n                    isEndRange = opts.endRange && compareDates(opts.endRange, day),\n                    isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange,\n                    isDisabled = (opts.minDate && day < opts.minDate) ||\n                                 (opts.maxDate && day > opts.maxDate) ||\n                                 (opts.disableWeekends && isWeekend(day)) ||\n                                 (opts.disableDayFn && opts.disableDayFn(day));\n\n                if (isEmpty) {\n                    if (i < before) {\n                        dayNumber = daysInPreviousMonth + dayNumber;\n                        monthNumber = previousMonth;\n                        yearNumber = yearOfPreviousMonth;\n                    } else {\n                        dayNumber = dayNumber - days;\n                        monthNumber = nextMonth;\n                        yearNumber = yearOfNextMonth;\n                    }\n                }\n\n                var dayConfig = {\n                        day: dayNumber,\n                        month: monthNumber,\n                        year: yearNumber,\n                        hasEvent: hasEvent,\n                        isSelected: isSelected,\n                        isToday: isToday,\n                        isDisabled: isDisabled,\n                        isEmpty: isEmpty,\n                        isStartRange: isStartRange,\n                        isEndRange: isEndRange,\n                        isInRange: isInRange,\n                        showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths,\n                        enableSelectionDaysInNextAndPreviousMonths: opts.enableSelectionDaysInNextAndPreviousMonths\n                    };\n\n                if (opts.pickWholeWeek && isSelected) {\n                    isWeekSelected = true;\n                }\n\n                row.push(renderDay(dayConfig));\n\n                if (++r === 7) {\n                    if (opts.showWeekNumber) {\n                        row.unshift(renderWeek(i - before, month, year, opts.firstWeekOfYearMinDays));\n                    }\n                    data.push(renderRow(row, opts.isRTL, opts.pickWholeWeek, isWeekSelected));\n                    row = [];\n                    r = 0;\n                    isWeekSelected = false;\n                }\n            }\n            return renderTable(opts, data, randId);\n        },\n\n        isVisible: function()\n        {\n            return this._v;\n        },\n\n        show: function()\n        {\n            if (!this.isVisible()) {\n                this._v = true;\n                this.draw();\n                removeClass(this.el, 'is-hidden');\n                if (this._o.bound) {\n                    addEvent(document, 'click', this._onClick);\n                    this.adjustPosition();\n                }\n                if (typeof this._o.onOpen === 'function') {\n                    this._o.onOpen.call(this);\n                }\n            }\n        },\n\n        hide: function()\n        {\n            var v = this._v;\n            if (v !== false) {\n                if (this._o.bound) {\n                    removeEvent(document, 'click', this._onClick);\n                }\n\n                if (!this._o.container) {\n                    this.el.style.position = 'static'; // reset\n                    this.el.style.left = 'auto';\n                    this.el.style.top = 'auto';\n                }\n                addClass(this.el, 'is-hidden');\n                this._v = false;\n                if (v !== undefined && typeof this._o.onClose === 'function') {\n                    this._o.onClose.call(this);\n                }\n            }\n        },\n\n        /**\n         * GAME OVER\n         */\n        destroy: function()\n        {\n            var opts = this._o;\n\n            this.hide();\n            removeEvent(this.el, 'mousedown', this._onMouseDown, true);\n            removeEvent(this.el, 'touchend', this._onMouseDown, true);\n            removeEvent(this.el, 'change', this._onChange);\n            if (opts.keyboardInput) {\n                removeEvent(document, 'keydown', this._onKeyChange);\n            }\n            if (opts.field) {\n                removeEvent(opts.field, 'change', this._onInputChange);\n                if (opts.bound) {\n                    removeEvent(opts.trigger, 'click', this._onInputClick);\n                    removeEvent(opts.trigger, 'focus', this._onInputFocus);\n                    removeEvent(opts.trigger, 'blur', this._onInputBlur);\n                }\n            }\n            if (this.el.parentNode) {\n                this.el.parentNode.removeChild(this.el);\n            }\n        }\n\n    };\n\n    return Pikaday;\n}\n","import Modifier from 'ember-modifier';\nimport { assert } from '@ember/debug';\nimport { typeOf } from '@ember/utils';\nimport type * as CSS from 'csstype';\n\n// Cannot be typed as `Partial<CSSStyleDeclaration>` because `CSSStyleDeclaration`\n// interface does _not_ included dashed CSS property names. It only includes the\n// camelCase version of a CSS property.\n// https://github.com/microsoft/TypeScript-DOM-lib-generator/issues/1672\ntype CSSStyles =\n  | Partial<CSS.Properties>\n  | Partial<CSS.PropertiesHyphen>\n  | { readonly [key: `--${string}`]: string };\n\nfunction isObject(o: unknown): boolean {\n  return typeof o === 'object' && Boolean(o);\n}\n\nconst DASHERIZE_REGEX = /([a-z\\d])([A-Z])/g;\nconst DASHERIZE_REPLACEMENT = '$1-$2';\n\nfunction dasherize(str: string): string {\n  return str.replace(DASHERIZE_REGEX, DASHERIZE_REPLACEMENT).toLowerCase();\n}\n\n/**\n * Returns a two-dimensional array, like:\n *\n * ```js\n * [\n *   ['font-size', '16px'],\n *   ['text-align', 'center'],\n *   ['color', 'red']\n * ]\n * ```\n *\n * This data structure is slightly faster to process than an object / dictionary.\n */\nfunction compileStyles(\n  positional: CSSStyles[],\n  named: CSSStyles,\n): [string, string][] {\n  return [...positional.filter(isObject), named]\n    .map((obj) =>\n      Object.entries(obj).map(\n        ([k, v]) => [dasherize(k), v] as [string, string],\n      ),\n    )\n    .flat();\n}\n\nexport interface StyleModifierSignature {\n  Element: Element & ElementCSSInlineStyle;\n  Args: {\n    Positional: CSSStyles[];\n    Named: CSSStyles;\n  };\n}\n\nexport default class StyleModifier extends Modifier<StyleModifierSignature> {\n  existingStyles: Set<string> = new Set();\n\n  setStyles(\n    element: StyleModifierSignature['Element'],\n    newStyles: [string, string][],\n  ) {\n    const { existingStyles } = this;\n    const rulesToRemove: Set<string> = new Set(existingStyles);\n\n    // clear cache of existing styles\n    existingStyles.clear();\n\n    newStyles.forEach(([property, value]) => {\n      assert(\n        `Your given value for property '${property}' is ${value} (${typeOf(\n          value,\n        )}). ` +\n          'Accepted types are string and undefined. Please change accordingly.',\n        typeof value === 'undefined' || typeOf(value) === 'string',\n      );\n\n      // priority must be specified as separate argument\n      // value must not contain \"!important\"\n      let priority = '';\n      if (value && value.includes('!important')) {\n        priority = 'important';\n        value = value.replace('!important', '');\n      }\n\n      // update CSSOM\n      element.style.setProperty(property, value, priority);\n\n      // should not remove rules that have been updated in this cycle\n      rulesToRemove.delete(property);\n\n      // cache styles that have been set for potential clean-up when argument changes\n      existingStyles.add(property);\n    });\n\n    // remove rules that were present in last cycle but aren't present in this one\n    rulesToRemove.forEach((rule) => element.style.removeProperty(rule));\n  }\n\n  modify(\n    element: StyleModifierSignature['Element'],\n    positional: [CSSStyles] | [],\n    named: CSSStyles,\n  ) {\n    this.setStyles(element, compileStyles(positional, named));\n  }\n}\n","import Helper from '@ember/component/helper';\nimport truthConvert, {\n  MaybeTruthy,\n  TruthConvert,\n} from '../utils/truth-convert.ts';\n\ntype FirstFalsy<T> = T extends [infer Item]\n  ? Item\n  : T extends [infer Head, ...infer Tail]\n  ? TruthConvert<Head> extends false\n    ? Head\n    : TruthConvert<Head> extends true\n    ? FirstFalsy<Tail>\n    : Head | FirstFalsy<Tail>\n  : undefined;\n\ninterface AndSignature<T extends MaybeTruthy[]> {\n  Args: {\n    Positional: T;\n  };\n  Return: FirstFalsy<T>;\n}\n\n// We use class-based helper to ensure arguments are lazy-evaluated\n// and helper short-circuits like native JavaScript `&&` (logical AND).\nexport default class AndHelper<const T extends MaybeTruthy[]> extends Helper<\n  AndSignature<T>\n> {\n  public compute(params: T): FirstFalsy<T>;\n  public compute(params: T) {\n    for (let i = 0, len = params.length; i < len; i++) {\n      if (truthConvert(params[i]) === false) {\n        return params[i];\n      }\n    }\n    return params[params.length - 1];\n  }\n}\n","export default function eq(left: unknown, right: unknown): boolean {\n  return left === right;\n}\n","export default function gt(\n  left: unknown,\n  right: unknown,\n  options?: { forceNumber?: boolean }\n) {\n  if (options?.forceNumber) {\n    if (typeof left !== 'number') {\n      left = Number(left);\n    }\n    if (typeof right !== 'number') {\n      right = Number(right);\n    }\n  }\n  return (left as number) > (right as number);\n}\n","export default function gte(\n  left: unknown,\n  right: unknown,\n  options?: { forceNumber?: boolean }\n) {\n  if (options?.forceNumber) {\n    if (typeof left !== 'number') {\n      left = Number(left);\n    }\n    if (typeof right !== 'number') {\n      right = Number(right);\n    }\n  }\n  return (left as number) >= (right as number);\n}\n","import { isArray as isEmberArray } from '@ember/array';\n\nexport default function isArray(...params: unknown[]) {\n  return params.every(isEmberArray);\n}\n","export default function lt(\n  left: unknown,\n  right: unknown,\n  options?: { forceNumber?: boolean }\n) {\n  if (options?.forceNumber) {\n    if (typeof left !== 'number') {\n      left = Number(left);\n    }\n    if (typeof right !== 'number') {\n      right = Number(right);\n    }\n  }\n  return (left as number) < (right as number);\n}\n","export default function lte(\n  left: unknown,\n  right: unknown,\n  options?: { forceNumber?: boolean }\n) {\n  if (options?.forceNumber) {\n    if (typeof left !== 'number') {\n      left = Number(left);\n    }\n    if (typeof right !== 'number') {\n      right = Number(right);\n    }\n  }\n  return (left as number) <= (right as number);\n}\n","export default function notEq(left: unknown, right: unknown) {\n  return left !== right;\n}\n","import truthConvert, { MaybeTruthy } from '../utils/truth-convert.ts';\n\nexport default function not(...params: MaybeTruthy[]) {\n  return params.every((param) => !truthConvert(param));\n}\n","import truthConvert, {\n  Falsy,\n  MaybeTruthy,\n  TruthConvert,\n} from '../utils/truth-convert.ts';\nimport Helper from '@ember/component/helper';\n\ntype FirstTruthy<T> = T extends [infer Item]\n  ? Item\n  : T extends [infer Head, ...infer Tail]\n  ? TruthConvert<Head> extends true\n    ? Head\n    : TruthConvert<Head> extends false\n    ? FirstTruthy<Tail>\n    : Exclude<Head, Falsy> | FirstTruthy<Tail>\n  : undefined;\n\ninterface OrSignature<T extends MaybeTruthy[]> {\n  Args: {\n    Positional: T;\n  };\n  Return: FirstTruthy<T>;\n}\n\n// We use class-based helper to ensure arguments are lazy-evaluated\n// and helper short-circuits like native JavaScript `||` (logical OR).\nexport default class OrHelper<T extends MaybeTruthy[]> extends Helper<\n  OrSignature<T>\n> {\n  public compute(params: T): FirstTruthy<T>;\n  public compute(params: T) {\n    for (let i = 0, len = params.length; i < len; i++) {\n      if (truthConvert(params[i]) === true) {\n        return params[i];\n      }\n    }\n    return params[params.length - 1];\n  }\n}\n","import truthConvert from '../utils/truth-convert.ts';\n\nexport default function xor(left: unknown, right: unknown) {\n  return truthConvert(left) !== truthConvert(right);\n}\n","import { isArray } from '@ember/array';\n\nexport type Falsy =\n  | { isTruthy: false }\n  | undefined\n  | null\n  | false\n  | 0\n  | -0\n  | 0n\n  | ''\n  | never[];\n\n// We check here in the order of the following function to maintain parity\n// Note that this will not handle EmberArray correctly.\n// We don't use Falsy since we want to be able to more definitively determine\n// truthy results.\nexport type TruthConvert<T> = T extends { isTruthy: true }\n  ? true\n  : T extends { isTruthy: false }\n  ? false\n  : T extends { isTruthy: boolean }\n  ? boolean\n  : T extends undefined | null\n  ? false\n  : T extends boolean\n  ? T\n  : T extends number\n  ? T extends 0 | -0\n    ? false\n    : number extends T\n    ? boolean\n    : true\n  : T extends bigint\n  ? T extends 0n\n    ? false\n    : bigint extends T\n    ? boolean\n    : true\n  : T extends string\n  ? T extends ''\n    ? false\n    : string extends T\n    ? boolean\n    : true\n  : T extends never[]\n  ? false\n  : T extends ArrayLike<unknown>\n  ? boolean\n  : T extends object\n  ? true\n  : boolean;\n\nexport type MaybeTruthy =\n  | { isTruthy: boolean }\n  | undefined\n  | null\n  | boolean\n  | number\n  | bigint\n  | string\n  | unknown[]\n  | object;\n\n// We also have to do individual overloads for each specific type so that we\n// don't lose specificity.\nexport default function truthConvert<T extends true | { isTruthy: true }>(\n  result: T\n): true;\nexport default function truthConvert<T extends { isTruthy: false }>(\n  result: T\n): false;\nexport default function truthConvert<T extends undefined | null | false>(\n  result: T\n): false;\nexport default function truthConvert<T extends number>(\n  result: T\n): T extends 0 | -0 ? false : true;\nexport default function truthConvert<T extends bigint>(\n  result: T\n): T extends 0n ? false : true;\nexport default function truthConvert<T extends string>(\n  result: T\n): T extends '' ? false : true;\nexport default function truthConvert<T>(result: T): TruthConvert<T>;\nexport default function truthConvert(result: unknown): boolean {\n  if (\n    typeof result === 'object' &&\n    result &&\n    'isTruthy' in result &&\n    typeof result.isTruthy === 'boolean'\n  ) {\n    return result.isTruthy;\n  }\n\n  if (isArray(result)) {\n    return result.length !== 0;\n  } else {\n    return !!result;\n  }\n}\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","/*\n* FileSaver.js\n* A saveAs() FileSaver implementation.\n*\n* By Eli Grey, http://eligrey.com\n*\n* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\n* source  : http://purl.eligrey.com/github/FileSaver.js\n*/\n\n// The one and only way of getting global scope in all environments\n// https://stackoverflow.com/q/3277182/1008999\nvar _global = typeof window === 'object' && window.window === window\n  ? window : typeof self === 'object' && self.self === self\n  ? self : typeof global === 'object' && global.global === global\n  ? global\n  : this\n\nfunction bom (blob, opts) {\n  if (typeof opts === 'undefined') opts = { autoBom: false }\n  else if (typeof opts !== 'object') {\n    console.warn('Deprecated: Expected third argument to be a object')\n    opts = { autoBom: !opts }\n  }\n\n  // prepend BOM for UTF-8 XML and text/* types (including HTML)\n  // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n  if (opts.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n    return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type })\n  }\n  return blob\n}\n\nfunction download (url, name, opts) {\n  var xhr = new XMLHttpRequest()\n  xhr.open('GET', url)\n  xhr.responseType = 'blob'\n  xhr.onload = function () {\n    saveAs(xhr.response, name, opts)\n  }\n  xhr.onerror = function () {\n    console.error('could not download file')\n  }\n  xhr.send()\n}\n\nfunction corsEnabled (url) {\n  var xhr = new XMLHttpRequest()\n  // use sync to avoid popup blocker\n  xhr.open('HEAD', url, false)\n  try {\n    xhr.send()\n  } catch (e) {}\n  return xhr.status >= 200 && xhr.status <= 299\n}\n\n// `a.click()` doesn't work for all browsers (#465)\nfunction click (node) {\n  try {\n    node.dispatchEvent(new MouseEvent('click'))\n  } catch (e) {\n    var evt = document.createEvent('MouseEvents')\n    evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80,\n                          20, false, false, false, false, 0, null)\n    node.dispatchEvent(evt)\n  }\n}\n\n// Detect WebView inside a native macOS app by ruling out all browsers\n// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too\n// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos\nvar isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent)\n\nvar saveAs = _global.saveAs || (\n  // probably in some web worker\n  (typeof window !== 'object' || window !== _global)\n    ? function saveAs () { /* noop */ }\n\n  // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView\n  : ('download' in HTMLAnchorElement.prototype && !isMacOSWebView)\n  ? function saveAs (blob, name, opts) {\n    var URL = _global.URL || _global.webkitURL\n    var a = document.createElement('a')\n    name = name || blob.name || 'download'\n\n    a.download = name\n    a.rel = 'noopener' // tabnabbing\n\n    // TODO: detect chrome extensions & packaged apps\n    // a.target = '_blank'\n\n    if (typeof blob === 'string') {\n      // Support regular links\n      a.href = blob\n      if (a.origin !== location.origin) {\n        corsEnabled(a.href)\n          ? download(blob, name, opts)\n          : click(a, a.target = '_blank')\n      } else {\n        click(a)\n      }\n    } else {\n      // Support blobs\n      a.href = URL.createObjectURL(blob)\n      setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s\n      setTimeout(function () { click(a) }, 0)\n    }\n  }\n\n  // Use msSaveOrOpenBlob as a second approach\n  : 'msSaveOrOpenBlob' in navigator\n  ? function saveAs (blob, name, opts) {\n    name = name || blob.name || 'download'\n\n    if (typeof blob === 'string') {\n      if (corsEnabled(blob)) {\n        download(blob, name, opts)\n      } else {\n        var a = document.createElement('a')\n        a.href = blob\n        a.target = '_blank'\n        setTimeout(function () { click(a) })\n      }\n    } else {\n      navigator.msSaveOrOpenBlob(bom(blob, opts), name)\n    }\n  }\n\n  // Fallback to using FileReader and a popup\n  : function saveAs (blob, name, opts, popup) {\n    // Open a popup immediately do go around popup blocker\n    // Mostly only available on user interaction and the fileReader is async so...\n    popup = popup || open('', '_blank')\n    if (popup) {\n      popup.document.title =\n      popup.document.body.innerText = 'downloading...'\n    }\n\n    if (typeof blob === 'string') return download(blob, name, opts)\n\n    var force = blob.type === 'application/octet-stream'\n    var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari\n    var isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent)\n\n    if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') {\n      // Safari doesn't allow downloading of blob URLs\n      var reader = new FileReader()\n      reader.onloadend = function () {\n        var url = reader.result\n        url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;')\n        if (popup) popup.location.href = url\n        else location = url\n        popup = null // reverse-tabnabbing #460\n      }\n      reader.readAsDataURL(blob)\n    } else {\n      var URL = _global.URL || _global.webkitURL\n      var url = URL.createObjectURL(blob)\n      if (popup) popup.location = url\n      else location.href = url\n      popup = null // reverse-tabnabbing #460\n      setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s\n    }\n  }\n)\n\n_global.saveAs = saveAs.saveAs = saveAs\n\nif (typeof module !== 'undefined') {\n  module.exports = saveAs;\n}\n","/*!\n * jQuery JavaScript Library v3.7.1\n * https://jquery.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-08-28T13:37Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar version = \"3.7.1\",\n\n\trhtmlSuffix = /HTML$/i,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\n\t// Retrieve the text value of an array of DOM nodes\n\ttext: function( elem ) {\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += jQuery.text( node );\n\t\t\t}\n\t\t}\n\t\tif ( nodeType === 1 || nodeType === 11 ) {\n\t\t\treturn elem.textContent;\n\t\t}\n\t\tif ( nodeType === 9 ) {\n\t\t\treturn elem.documentElement.textContent;\n\t\t}\n\t\tif ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tisXMLDoc: function( elem ) {\n\t\tvar namespace = elem && elem.namespaceURI,\n\t\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t\t// Assume HTML when documentElement doesn't yet exist, such as inside\n\t\t// document fragments.\n\t\treturn !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar pop = arr.pop;\n\n\nvar sort = arr.sort;\n\n\nvar splice = arr.splice;\n\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n// Note: an element does not contain itself\njQuery.contains = function( a, b ) {\n\tvar bup = b && b.parentNode;\n\n\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE doesn't have `contains` on SVG.\n\t\ta.contains ?\n\t\t\ta.contains( bup ) :\n\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t) );\n};\n\n\n\n\n// CSS string/identifier serialization\n// https://drafts.csswg.org/cssom/#common-serializing-idioms\nvar rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n\nfunction fcssescape( ch, asCodePoint ) {\n\tif ( asCodePoint ) {\n\n\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\tif ( ch === \"\\0\" ) {\n\t\t\treturn \"\\uFFFD\";\n\t\t}\n\n\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t}\n\n\t// Other potentially-special ASCII characters get backslash-escaped\n\treturn \"\\\\\" + ch;\n}\n\njQuery.escapeSelector = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\n\n\n\nvar preferredDoc = document,\n\tpushNative = push;\n\n( function() {\n\nvar i,\n\tExpr,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\tpush = pushNative,\n\n\t// Local document vars\n\tdocument,\n\tdocumentElement,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\tmatches,\n\n\t// Instance-specific data\n\texpando = jQuery.expando,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|\" +\n\t\t\"loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trleadingCombinator = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" +\n\t\twhitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\tID: new RegExp( \"^#(\" + identifier + \")\" ),\n\t\tCLASS: new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\tTAG: new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\tATTR: new RegExp( \"^\" + attributes ),\n\t\tPSEUDO: new RegExp( \"^\" + pseudos ),\n\t\tCHILD: new RegExp(\n\t\t\t\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\tbool: new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\tneedsContext: new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\tif ( nonHex ) {\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\treturn nonHex;\n\t\t}\n\n\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t// Support: IE <=11+\n\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t// surrogate pair\n\t\treturn high < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes; see `setDocument`.\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE/Edge.\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && nodeName( elem, \"fieldset\" );\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android <=4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = {\n\t\tapply: function( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t},\n\t\tcall: function( target ) {\n\t\t\tpushNative.apply( target, slice.call( arguments, 1 ) );\n\t\t}\n\t};\n}\n\nfunction find( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tfind.contains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( !nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when\n\t\t\t\t\t// strict-comparing two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( newContext != context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = jQuery.escapeSelector( nid );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrimCSS, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties\n\t\t// (see https://github.com/jquery/sizzle/issues/157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by jQuery selector module\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn nodeName( elem, \"input\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn ( nodeName( elem, \"input\" ) || nodeName( elem, \"button\" ) ) &&\n\t\t\telem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11+\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a jQuery selector context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [node] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nfunction setDocument( node ) {\n\tvar subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocumentElement = document.documentElement;\n\tdocumentIsHTML = !jQuery.isXMLDoc( document );\n\n\t// Support: iOS 7 only, IE 9 - 11+\n\t// Older browsers didn't support unprefixed `matches`.\n\tmatches = documentElement.matches ||\n\t\tdocumentElement.webkitMatchesSelector ||\n\t\tdocumentElement.msMatchesSelector;\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors\n\t// (see trac-13936).\n\t// Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,\n\t// all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.\n\tif ( documentElement.msMatchesSelector &&\n\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tpreferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t\tsubWindow.addEventListener( \"unload\", unloadHandler );\n\t}\n\n\t// Support: IE <10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocumentElement.appendChild( el ).id = jQuery.expando;\n\t\treturn !document.getElementsByName ||\n\t\t\t!document.getElementsByName( jQuery.expando ).length;\n\t} );\n\n\t// Support: IE 9 only\n\t// Check to see if it's possible to do matchesSelector\n\t// on a disconnected node.\n\tsupport.disconnectedMatch = assert( function( el ) {\n\t\treturn matches.call( el, \"*\" );\n\t} );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// IE/Edge don't support the :scope pseudo-class.\n\tsupport.scope = assert( function() {\n\t\treturn document.querySelectorAll( \":scope\" );\n\t} );\n\n\t// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only\n\t// Make sure the `:has()` argument is parsed unforgivingly.\n\t// We include `*` in the test to detect buggy implementations that are\n\t// _selectively_ forgiving (specifically when the list includes at least\n\t// one valid selector).\n\t// Note that we treat complete lack of support for `:has()` as if it were\n\t// spec-compliant support, which is fine because use of `:has()` in such\n\t// environments will fail in the qSA path and fall back to jQuery traversal\n\t// anyway.\n\tsupport.cssHas = assert( function() {\n\t\ttry {\n\t\t\tdocument.querySelector( \":has(*,:jqfake)\" );\n\t\t\treturn false;\n\t\t} catch ( e ) {\n\t\t\treturn true;\n\t\t}\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter.ID =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find.TAG = function( tag, context ) {\n\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t// DocumentFragment nodes don't have gEBTN\n\t\t} else {\n\t\t\treturn context.querySelectorAll( tag );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find.CLASS = function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\trbuggyQSA = [];\n\n\t// Build QSA regex\n\t// Regex strategy adopted from Diego Perini\n\tassert( function( el ) {\n\n\t\tvar input;\n\n\t\tdocumentElement.appendChild( el ).innerHTML =\n\t\t\t\"<a id='\" + expando + \"' href='' disabled='disabled'></a>\" +\n\t\t\t\"<select id='\" + expando + \"-\\r\\\\' disabled='disabled'>\" +\n\t\t\t\"<option selected=''></option></select>\";\n\n\t\t// Support: iOS <=7 - 8 only\n\t\t// Boolean attributes and \"value\" are not treated correctly in some XML documents\n\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t}\n\n\t\t// Support: iOS <=7 - 8 only\n\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\trbuggyQSA.push( \"~=\" );\n\t\t}\n\n\t\t// Support: iOS 8 only\n\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t}\n\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\trbuggyQSA.push( \":checked\" );\n\t\t}\n\n\t\t// Support: Windows 8 Native Apps\n\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tdocumentElement.appendChild( el ).disabled = true;\n\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t}\n\n\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t// Adding a temporary attribute to the document before the selection works\n\t\t// around the issue.\n\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"name\", \"\" );\n\t\tel.appendChild( input );\n\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t}\n\t} );\n\n\tif ( !support.cssHas ) {\n\n\t\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t\t// Our regular `try-catch` mechanism fails to detect natively-unsupported\n\t\t// pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n\t\t// in browsers that parse the `:has()` argument as a forgiving selector list.\n\t\t// https://drafts.csswg.org/selectors/#relational now requires the argument\n\t\t// to be parsed unforgivingly, but browsers have not yet fully adjusted.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = function( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a === document || a.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b === document || b.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t};\n\n\treturn document;\n}\n\nfind.matches = function( expr, elements ) {\n\treturn find( expr, null, null, elements );\n};\n\nfind.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn find( expr, document, null, [ elem ] ).length > 0;\n};\n\nfind.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn jQuery.contains( context, elem );\n};\n\n\nfind.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (see trac-13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\tif ( val !== undefined ) {\n\t\treturn val;\n\t}\n\n\treturn elem.getAttribute( name );\n};\n\nfind.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\njQuery.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\t//\n\t// Support: Android <=4.0+\n\t// Testing for detecting duplicates is unpredictable so instead assume we can't\n\t// depend on duplicate detection in all browsers without a stable sort.\n\thasDuplicate = !support.sortStable;\n\tsortInput = !support.sortStable && slice.call( results, 0 );\n\tsort.call( results, sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tsplice.call( results, duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\njQuery.fn.uniqueSort = function() {\n\treturn this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );\n};\n\nExpr = jQuery.expr = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\tATTR: function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || \"\" )\n\t\t\t\t.replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\tCHILD: function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" )\n\t\t\t\t);\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr.CHILD.test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\tTAG: function( nodeNameSelector ) {\n\t\t\tvar expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn nodeName( elem, expectedNodeName );\n\t\t\t\t};\n\t\t},\n\n\t\tCLASS: function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace + \")\" + className +\n\t\t\t\t\t\"(\" + whitespace + \"|$)\" ) ) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\tATTR: function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = find.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\tif ( operator === \"=\" ) {\n\t\t\t\t\treturn result === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"!=\" ) {\n\t\t\t\t\treturn result !== check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"^=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) === 0;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"*=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"$=\" ) {\n\t\t\t\t\treturn check && result.slice( -check.length ) === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"~=\" ) {\n\t\t\t\t\treturn ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" )\n\t\t\t\t\t\t.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"|=\" ) {\n\t\t\t\t\treturn result === check || result.slice( 0, check.length + 1 ) === check + \"-\";\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t},\n\n\t\tCHILD: function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || ( parent[ expando ] = {} );\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\t\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\t\t\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\tPSEUDO: function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// https://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tfind.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as jQuery does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\tnot: markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrimCSS, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element\n\t\t\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\thas: markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn find( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\tcontains: markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// https://www.w3.org/TR/selectors/#lang-pseudo\n\t\tlang: markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tfind.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\ttarget: function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\troot: function( elem ) {\n\t\t\treturn elem === documentElement;\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === safeActiveElement() &&\n\t\t\t\tdocument.hasFocus() &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\tenabled: createDisabledPseudo( false ),\n\t\tdisabled: createDisabledPseudo( true ),\n\n\t\tchecked: function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\treturn ( nodeName( elem, \"input\" ) && !!elem.checked ) ||\n\t\t\t\t( nodeName( elem, \"option\" ) && !!elem.selected );\n\t\t},\n\n\t\tselected: function( elem ) {\n\n\t\t\t// Support: IE <=11+\n\t\t\t// Accessing the selectedIndex property\n\t\t\t// forces the browser to treat the default option as\n\t\t\t// selected when in an optgroup.\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\tempty: function( elem ) {\n\n\t\t\t// https://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !Expr.pseudos.empty( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\theader: function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"button\" ||\n\t\t\t\tnodeName( elem, \"button\" );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"text\" &&\n\n\t\t\t\t// Support: IE <10 only\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear\n\t\t\t\t// with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\tfirst: createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\tlast: createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\teq: createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\teven: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\todd: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tlt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i;\n\n\t\t\tif ( argument < 0 ) {\n\t\t\t\ti = argument + length;\n\t\t\t} else if ( argument > length ) {\n\t\t\t\ti = length;\n\t\t\t} else {\n\t\t\t\ti = argument;\n\t\t\t}\n\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tgt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos.nth = Expr.pseudos.eq;\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rleadingCombinator.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrimCSS, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\tif ( parseOnly ) {\n\t\treturn soFar.length;\n\t}\n\n\treturn soFar ?\n\t\tfind.error( selector ) :\n\n\t\t// Cache the tokens\n\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\tif ( skip && nodeName( elem, skip ) ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = outerCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tfind( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem, matcherOut,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed ||\n\t\t\t\tmultipleContexts( selector || \"*\",\n\t\t\t\t\tcontext.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems;\n\n\t\tif ( matcher ) {\n\n\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter\n\t\t\t// or preexisting results,\n\t\t\tmatcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t[] :\n\n\t\t\t\t// ...otherwise use results directly\n\t\t\t\tresults;\n\n\t\t\t// Find primary matches\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t} else {\n\t\t\tmatcherOut = matcherIn;\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tvar ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element\n\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 )\n\t\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrimCSS, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find.TAG( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: iOS <=7 - 9 only\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching\n\t\t\t// elements by id. (see trac-14142)\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tjQuery.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\nfunction compile( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n}\n\n/**\n * A low-level selection function that works with jQuery's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with jQuery selector compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find.ID(\n\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\tcontext\n\t\t\t) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) &&\n\t\t\t\t\t\ttestContext( context.parentNode ) || context\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Support: Android <=4.0 - 4.1+\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Android <=4.0 - 4.1+\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\njQuery.find = find;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.unique = jQuery.uniqueSort;\n\n// These have always been private, but they used to be documented as part of\n// Sizzle so let's maintain them for now for backwards compatibility purposes.\nfind.compile = compile;\nfind.select = select;\nfind.setDocument = setDocument;\nfind.tokenize = tokenize;\n\nfind.escape = jQuery.escapeSelector;\nfind.getText = jQuery.text;\nfind.isXML = jQuery.isXMLDoc;\nfind.selectors = jQuery.expr;\nfind.support = jQuery.support;\nfind.uniqueSort = jQuery.uniqueSort;\n\n\t/* eslint-enable */\n\n} )();\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to jQuery#find\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.error );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the error, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getErrorHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getErrorHook();\n\n\t\t\t\t\t\t\t\t// The deprecated alias of the above. While the name suggests\n\t\t\t\t\t\t\t\t// returning the stack, not an error instance, jQuery just passes\n\t\t\t\t\t\t\t\t// it directly to `console.warn` so both will work; an instance\n\t\t\t\t\t\t\t\t// just better cooperates with source maps.\n\t\t\t\t\t\t\t\t} else if ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\n// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error\n// captured before the async barrier to get the original error cause\n// which may otherwise be hidden.\njQuery.Deferred.exceptionHook = function( error, asyncError ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message,\n\t\t\terror.stack, asyncError );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", true );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, isSetup ) {\n\n\t// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !isSetup ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\tif ( !saved ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tdataPriv.set( this, type, false );\n\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering\n\t\t\t\t// the native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, jQuery.event.trigger(\n\t\t\t\t\tsaved[ 0 ],\n\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\tthis\n\t\t\t\t) );\n\n\t\t\t\t// Abort handling of the native event by all jQuery handlers while allowing\n\t\t\t\t// native handlers on the same element to run. On target, this is achieved\n\t\t\t\t// by stopping immediate propagation just on the jQuery event. However,\n\t\t\t\t// the native event is re-wrapped by a jQuery one on each level of the\n\t\t\t\t// propagation so the only way to stop it for jQuery is to stop it for\n\t\t\t\t// everyone via native `stopPropagation()`. This is not a problem for\n\t\t\t\t// focus/blur which don't bubble, but it does also stop click on checkboxes\n\t\t\t\t// and radios. We accept this limitation.\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.isImmediatePropagationStopped = returnTrue;\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\n\tfunction focusMappedHandler( nativeEvent ) {\n\t\tif ( document.documentMode ) {\n\n\t\t\t// Support: IE 11+\n\t\t\t// Attach a single focusin/focusout handler on the document while someone wants\n\t\t\t// focus/blur. This is because the former are synchronous in IE while the latter\n\t\t\t// are async. In other browsers, all those handlers are invoked synchronously.\n\n\t\t\t// `handle` from private data would already wrap the event, but we need\n\t\t\t// to change the `type` here.\n\t\t\tvar handle = dataPriv.get( this, \"handle\" ),\n\t\t\t\tevent = jQuery.event.fix( nativeEvent );\n\t\t\tevent.type = nativeEvent.type === \"focusin\" ? \"focus\" : \"blur\";\n\t\t\tevent.isSimulated = true;\n\n\t\t\t// First, handle focusin/focusout\n\t\t\thandle( nativeEvent );\n\n\t\t\t// ...then, handle focus/blur\n\t\t\t//\n\t\t\t// focus/blur don't bubble while focusin/focusout do; simulate the former by only\n\t\t\t// invoking the handler at the lower level.\n\t\t\tif ( event.target === event.currentTarget ) {\n\n\t\t\t\t// The setup part calls `leverageNative`, which, in turn, calls\n\t\t\t\t// `jQuery.event.add`, so event handle will already have been set\n\t\t\t\t// by this point.\n\t\t\t\thandle( event );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// For non-IE browsers, attach a single capturing handler on the document\n\t\t\t// while someone wants focusin/focusout.\n\t\t\tjQuery.event.simulate( delegateType, nativeEvent.target,\n\t\t\t\tjQuery.event.fix( nativeEvent ) );\n\t\t}\n\t}\n\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\tvar attaches;\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, true );\n\n\t\t\tif ( document.documentMode ) {\n\n\t\t\t\t// Support: IE 9 - 11+\n\t\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\t\tattaches = dataPriv.get( this, delegateType );\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t}\n\t\t\t\tdataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );\n\t\t\t} else {\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tvar attaches;\n\n\t\t\tif ( document.documentMode ) {\n\t\t\t\tattaches = dataPriv.get( this, delegateType ) - 1;\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t\tdataPriv.remove( this, delegateType );\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.set( this, delegateType, attaches );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Return false to indicate standard teardown should be applied\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n\n\t// Support: Firefox <=44\n\t// Firefox doesn't have focus(in | out) events\n\t// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n\t//\n\t// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n\t// focus(in | out) events fire after focus & blur events,\n\t// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n\t// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n\t//\n\t// Support: IE 9 - 11+\n\t// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,\n\t// attach a single handler for both events in IE.\n\tjQuery.event.special[ delegateType ] = {\n\t\tsetup: function() {\n\n\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType );\n\n\t\t\t// Support: IE 9 - 11+\n\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.addEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\tdataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );\n\t\t},\n\t\tteardown: function() {\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType ) - 1;\n\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.removeEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( dataHolder, delegateType );\n\t\t\t} else {\n\t\t\t\tdataPriv.set( dataHolder, delegateType, attaches );\n\t\t\t}\n\t\t}\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\n\trcleanScript = /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Re-enable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew jQuery#find here for performance reasons:\n\t\t\t// https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"box-sizing:content-box;border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is `display: block`\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, trac-12537)\n\t//   .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0,\n\t\tmarginDelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\t// Count margin delta separately to only add it after scroll gutter adjustment.\n\t\t// This is needed to make negative margins work with `outerHeight( true )` (gh-3982).\n\t\tif ( box === \"margin\" ) {\n\t\t\tmarginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta + marginDelta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\tanimationIterationCount: true,\n\t\taspectRatio: true,\n\t\tborderImageSlice: true,\n\t\tcolumnCount: true,\n\t\tflexGrow: true,\n\t\tflexShrink: true,\n\t\tfontWeight: true,\n\t\tgridArea: true,\n\t\tgridColumn: true,\n\t\tgridColumnEnd: true,\n\t\tgridColumnStart: true,\n\t\tgridRow: true,\n\t\tgridRowEnd: true,\n\t\tgridRowStart: true,\n\t\tlineHeight: true,\n\t\topacity: true,\n\t\torder: true,\n\t\torphans: true,\n\t\tscale: true,\n\t\twidows: true,\n\t\tzIndex: true,\n\t\tzoom: true,\n\n\t\t// SVG-related\n\t\tfillOpacity: true,\n\t\tfloodOpacity: true,\n\t\tstopOpacity: true,\n\t\tstrokeMiterlimit: true,\n\t\tstrokeOpacity: true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this\n\t\t\t.on( \"mouseenter\", fnOver )\n\t\t\t.on( \"mouseleave\", fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\n// Require that the \"whitespace run\" starts from a non-whitespace\n// to avoid O(N^2) behavior when the engine would try matching \"\\s+$\" at each space position.\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"$1\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (trac-13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","//\n// THIS FILE IS AUTOMATICALLY GENERATED! DO NOT EDIT BY HAND!\n//\n;\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined'\n        ? module.exports = factory()\n        : typeof define === 'function' && define.amd\n            ? define(factory) :\n            // cf. https://github.com/dankogai/js-base64/issues/119\n            (function () {\n                // existing version for noConflict()\n                var _Base64 = global.Base64;\n                var gBase64 = factory();\n                gBase64.noConflict = function () {\n                    global.Base64 = _Base64;\n                    return gBase64;\n                };\n                if (global.Meteor) { // Meteor.js\n                    Base64 = gBase64;\n                }\n                global.Base64 = gBase64;\n            })();\n}((typeof self !== 'undefined' ? self\n    : typeof window !== 'undefined' ? window\n        : typeof global !== 'undefined' ? global\n            : this), function () {\n    'use strict';\n    /**\n     *  base64.ts\n     *\n     *  Licensed under the BSD 3-Clause License.\n     *    http://opensource.org/licenses/BSD-3-Clause\n     *\n     *  References:\n     *    http://en.wikipedia.org/wiki/Base64\n     *\n     * @author Dan Kogai (https://github.com/dankogai)\n     */\n    var version = '3.7.8';\n    /**\n     * @deprecated use lowercase `version`.\n     */\n    var VERSION = version;\n    var _hasBuffer = typeof Buffer === 'function';\n    var _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;\n    var _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;\n    var b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    var b64chs = Array.prototype.slice.call(b64ch);\n    var b64tab = (function (a) {\n        var tab = {};\n        a.forEach(function (c, i) { return tab[c] = i; });\n        return tab;\n    })(b64chs);\n    var b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\n    var _fromCC = String.fromCharCode.bind(String);\n    var _U8Afrom = typeof Uint8Array.from === 'function'\n        ? Uint8Array.from.bind(Uint8Array)\n        : function (it) { return new Uint8Array(Array.prototype.slice.call(it, 0)); };\n    var _mkUriSafe = function (src) { return src\n        .replace(/=/g, '').replace(/[+\\/]/g, function (m0) { return m0 == '+' ? '-' : '_'; }); };\n    var _tidyB64 = function (s) { return s.replace(/[^A-Za-z0-9\\+\\/]/g, ''); };\n    /**\n     * polyfill version of `btoa`\n     */\n    var btoaPolyfill = function (bin) {\n        // console.log('polyfilled');\n        var u32, c0, c1, c2, asc = '';\n        var pad = bin.length % 3;\n        for (var i = 0; i < bin.length;) {\n            if ((c0 = bin.charCodeAt(i++)) > 255 ||\n                (c1 = bin.charCodeAt(i++)) > 255 ||\n                (c2 = bin.charCodeAt(i++)) > 255)\n                throw new TypeError('invalid character found');\n            u32 = (c0 << 16) | (c1 << 8) | c2;\n            asc += b64chs[u32 >> 18 & 63]\n                + b64chs[u32 >> 12 & 63]\n                + b64chs[u32 >> 6 & 63]\n                + b64chs[u32 & 63];\n        }\n        return pad ? asc.slice(0, pad - 3) + \"===\".substring(pad) : asc;\n    };\n    /**\n     * does what `window.btoa` of web browsers do.\n     * @param {String} bin binary string\n     * @returns {string} Base64-encoded string\n     */\n    var _btoa = typeof btoa === 'function' ? function (bin) { return btoa(bin); }\n        : _hasBuffer ? function (bin) { return Buffer.from(bin, 'binary').toString('base64'); }\n            : btoaPolyfill;\n    var _fromUint8Array = _hasBuffer\n        ? function (u8a) { return Buffer.from(u8a).toString('base64'); }\n        : function (u8a) {\n            // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326\n            var maxargs = 0x1000;\n            var strs = [];\n            for (var i = 0, l = u8a.length; i < l; i += maxargs) {\n                strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));\n            }\n            return _btoa(strs.join(''));\n        };\n    /**\n     * converts a Uint8Array to a Base64 string.\n     * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5\n     * @returns {string} Base64 string\n     */\n    var fromUint8Array = function (u8a, urlsafe) {\n        if (urlsafe === void 0) { urlsafe = false; }\n        return urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);\n    };\n    // This trick is found broken https://github.com/dankogai/js-base64/issues/130\n    // const utob = (src: string) => unescape(encodeURIComponent(src));\n    // reverting good old fationed regexp\n    var cb_utob = function (c) {\n        if (c.length < 2) {\n            var cc = c.charCodeAt(0);\n            return cc < 0x80 ? c\n                : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))\n                    + _fromCC(0x80 | (cc & 0x3f)))\n                    : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))\n                        + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n                        + _fromCC(0x80 | (cc & 0x3f)));\n        }\n        else {\n            var cc = 0x10000\n                + (c.charCodeAt(0) - 0xD800) * 0x400\n                + (c.charCodeAt(1) - 0xDC00);\n            return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))\n                + _fromCC(0x80 | ((cc >>> 12) & 0x3f))\n                + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n                + _fromCC(0x80 | (cc & 0x3f)));\n        }\n    };\n    var re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n    /**\n     * @deprecated should have been internal use only.\n     * @param {string} src UTF-8 string\n     * @returns {string} UTF-16 string\n     */\n    var utob = function (u) { return u.replace(re_utob, cb_utob); };\n    //\n    var _encode = _hasBuffer\n        ? function (s) { return Buffer.from(s, 'utf8').toString('base64'); }\n        : _TE\n            ? function (s) { return _fromUint8Array(_TE.encode(s)); }\n            : function (s) { return _btoa(utob(s)); };\n    /**\n     * converts a UTF-8-encoded string to a Base64 string.\n     * @param {boolean} [urlsafe] if `true` make the result URL-safe\n     * @returns {string} Base64 string\n     */\n    var encode = function (src, urlsafe) {\n        if (urlsafe === void 0) { urlsafe = false; }\n        return urlsafe\n            ? _mkUriSafe(_encode(src))\n            : _encode(src);\n    };\n    /**\n     * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.\n     * @returns {string} Base64 string\n     */\n    var encodeURI = function (src) { return encode(src, true); };\n    // This trick is found broken https://github.com/dankogai/js-base64/issues/130\n    // const btou = (src: string) => decodeURIComponent(escape(src));\n    // reverting good old fationed regexp\n    var re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\n    var cb_btou = function (cccc) {\n        switch (cccc.length) {\n            case 4:\n                var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n                    | ((0x3f & cccc.charCodeAt(1)) << 12)\n                    | ((0x3f & cccc.charCodeAt(2)) << 6)\n                    | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;\n                return (_fromCC((offset >>> 10) + 0xD800)\n                    + _fromCC((offset & 0x3FF) + 0xDC00));\n            case 3:\n                return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)\n                    | ((0x3f & cccc.charCodeAt(1)) << 6)\n                    | (0x3f & cccc.charCodeAt(2)));\n            default:\n                return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)\n                    | (0x3f & cccc.charCodeAt(1)));\n        }\n    };\n    /**\n     * @deprecated should have been internal use only.\n     * @param {string} src UTF-16 string\n     * @returns {string} UTF-8 string\n     */\n    var btou = function (b) { return b.replace(re_btou, cb_btou); };\n    /**\n     * polyfill version of `atob`\n     */\n    var atobPolyfill = function (asc) {\n        // console.log('polyfilled');\n        asc = asc.replace(/\\s+/g, '');\n        if (!b64re.test(asc))\n            throw new TypeError('malformed base64.');\n        asc += '=='.slice(2 - (asc.length & 3));\n        var u24, r1, r2;\n        var binArray = []; // use array to avoid minor gc in loop\n        for (var i = 0; i < asc.length;) {\n            u24 = b64tab[asc.charAt(i++)] << 18\n                | b64tab[asc.charAt(i++)] << 12\n                | (r1 = b64tab[asc.charAt(i++)]) << 6\n                | (r2 = b64tab[asc.charAt(i++)]);\n            if (r1 === 64) {\n                binArray.push(_fromCC(u24 >> 16 & 255));\n            }\n            else if (r2 === 64) {\n                binArray.push(_fromCC(u24 >> 16 & 255, u24 >> 8 & 255));\n            }\n            else {\n                binArray.push(_fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255));\n            }\n        }\n        return binArray.join('');\n    };\n    /**\n     * does what `window.atob` of web browsers do.\n     * @param {String} asc Base64-encoded string\n     * @returns {string} binary string\n     */\n    var _atob = typeof atob === 'function' ? function (asc) { return atob(_tidyB64(asc)); }\n        : _hasBuffer ? function (asc) { return Buffer.from(asc, 'base64').toString('binary'); }\n            : atobPolyfill;\n    //\n    var _toUint8Array = _hasBuffer\n        ? function (a) { return _U8Afrom(Buffer.from(a, 'base64')); }\n        : function (a) { return _U8Afrom(_atob(a).split('').map(function (c) { return c.charCodeAt(0); })); };\n    /**\n     * converts a Base64 string to a Uint8Array.\n     */\n    var toUint8Array = function (a) { return _toUint8Array(_unURI(a)); };\n    //\n    var _decode = _hasBuffer\n        ? function (a) { return Buffer.from(a, 'base64').toString('utf8'); }\n        : _TD\n            ? function (a) { return _TD.decode(_toUint8Array(a)); }\n            : function (a) { return btou(_atob(a)); };\n    var _unURI = function (a) { return _tidyB64(a.replace(/[-_]/g, function (m0) { return m0 == '-' ? '+' : '/'; })); };\n    /**\n     * converts a Base64 string to a UTF-8 string.\n     * @param {String} src Base64 string.  Both normal and URL-safe are supported\n     * @returns {string} UTF-8 string\n     */\n    var decode = function (src) { return _decode(_unURI(src)); };\n    /**\n     * check if a value is a valid Base64 string\n     * @param {String} src a value to check\n      */\n    var isValid = function (src) {\n        if (typeof src !== 'string')\n            return false;\n        var s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n        return !/[^\\s0-9a-zA-Z\\+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n    };\n    //\n    var _noEnum = function (v) {\n        return {\n            value: v, enumerable: false, writable: true, configurable: true\n        };\n    };\n    /**\n     * extend String.prototype with relevant methods\n     */\n    var extendString = function () {\n        var _add = function (name, body) { return Object.defineProperty(String.prototype, name, _noEnum(body)); };\n        _add('fromBase64', function () { return decode(this); });\n        _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });\n        _add('toBase64URI', function () { return encode(this, true); });\n        _add('toBase64URL', function () { return encode(this, true); });\n        _add('toUint8Array', function () { return toUint8Array(this); });\n    };\n    /**\n     * extend Uint8Array.prototype with relevant methods\n     */\n    var extendUint8Array = function () {\n        var _add = function (name, body) { return Object.defineProperty(Uint8Array.prototype, name, _noEnum(body)); };\n        _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });\n        _add('toBase64URI', function () { return fromUint8Array(this, true); });\n        _add('toBase64URL', function () { return fromUint8Array(this, true); });\n    };\n    /**\n     * extend Builtin prototypes with relevant methods\n     */\n    var extendBuiltins = function () {\n        extendString();\n        extendUint8Array();\n    };\n    var gBase64 = {\n        version: version,\n        VERSION: VERSION,\n        atob: _atob,\n        atobPolyfill: atobPolyfill,\n        btoa: _btoa,\n        btoaPolyfill: btoaPolyfill,\n        fromBase64: decode,\n        toBase64: encode,\n        encode: encode,\n        encodeURI: encodeURI,\n        encodeURL: encodeURI,\n        utob: utob,\n        btou: btou,\n        decode: decode,\n        isValid: isValid,\n        fromUint8Array: fromUint8Array,\n        toUint8Array: toUint8Array,\n        extendString: extendString,\n        extendUint8Array: extendUint8Array,\n        extendBuiltins: extendBuiltins\n    };\n    //\n    // export Base64 to the namespace\n    //\n    // ES5 is yet to have Object.assign() that may make transpilers unhappy.\n    // gBase64.Base64 = Object.assign({}, gBase64);\n    gBase64.Base64 = {};\n    Object.keys(gBase64).forEach(function (k) { return gBase64.Base64[k] = gBase64[k]; });\n    return gBase64;\n}));\n","// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid DateTime: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid Interval: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid Duration: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n  constructor(unit) {\n    super(`Invalid unit ${unit}`);\n  }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n  constructor() {\n    super(\"Zone is an abstract class\");\n  }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n  s = \"short\",\n  l = \"long\";\n\nexport const DATE_SHORT = {\n  year: n,\n  month: n,\n  day: n,\n};\n\nexport const DATE_MED = {\n  year: n,\n  month: s,\n  day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n  year: n,\n  month: s,\n  day: n,\n  weekday: s,\n};\n\nexport const DATE_FULL = {\n  year: n,\n  month: l,\n  day: n,\n};\n\nexport const DATE_HUGE = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n  hour: n,\n  minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n  hour: n,\n  minute: n,\n  hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n  timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n  timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n  year: n,\n  month: n,\n  day: n,\n  hour: n,\n  minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n  year: n,\n  month: n,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nexport const DATETIME_MED = {\n  year: n,\n  month: s,\n  day: n,\n  hour: n,\n  minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n  year: n,\n  month: s,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n  year: n,\n  month: s,\n  day: n,\n  weekday: s,\n  hour: n,\n  minute: n,\n};\n\nexport const DATETIME_FULL = {\n  year: n,\n  month: l,\n  day: n,\n  hour: n,\n  minute: n,\n  timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n  year: n,\n  month: l,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n  hour: n,\n  minute: n,\n  timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n  /**\n   * The type of zone\n   * @abstract\n   * @type {string}\n   */\n  get type() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * The name of this zone.\n   * @abstract\n   * @type {string}\n   */\n  get name() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * The IANA name of this zone.\n   * Defaults to `name` if not overwritten by a subclass.\n   * @abstract\n   * @type {string}\n   */\n  get ianaName() {\n    return this.name;\n  }\n\n  /**\n   * Returns whether the offset is known to be fixed for the whole year.\n   * @abstract\n   * @type {boolean}\n   */\n  get isUniversal() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Returns the offset's common name (such as EST) at the specified timestamp\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to get the name\n   * @param {Object} opts - Options to affect the format\n   * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n   * @param {string} opts.locale - What locale to return the offset name in.\n   * @return {string}\n   */\n  offsetName(ts, opts) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Returns the offset's value as a string\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to get the offset\n   * @param {string} format - What style of offset to return.\n   *                          Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n   * @return {string}\n   */\n  formatOffset(ts, format) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return the offset in minutes for this zone at the specified timestamp.\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to compute the offset\n   * @return {number}\n   */\n  offset(ts) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return whether this Zone is equal to another zone\n   * @abstract\n   * @param {Zone} otherZone - the zone to compare\n   * @return {boolean}\n   */\n  equals(otherZone) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return whether this Zone is valid.\n   * @abstract\n   * @type {boolean}\n   */\n  get isValid() {\n    throw new ZoneIsAbstractError();\n  }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n  /**\n   * Get a singleton instance of the local zone\n   * @return {SystemZone}\n   */\n  static get instance() {\n    if (singleton === null) {\n      singleton = new SystemZone();\n    }\n    return singleton;\n  }\n\n  /** @override **/\n  get type() {\n    return \"system\";\n  }\n\n  /** @override **/\n  get name() {\n    return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return false;\n  }\n\n  /** @override **/\n  offsetName(ts, { format, locale }) {\n    return parseZoneInfo(ts, format, locale);\n  }\n\n  /** @override **/\n  formatOffset(ts, format) {\n    return formatOffset(this.offset(ts), format);\n  }\n\n  /** @override **/\n  offset(ts) {\n    return -new Date(ts).getTimezoneOffset();\n  }\n\n  /** @override **/\n  equals(otherZone) {\n    return otherZone.type === \"system\";\n  }\n\n  /** @override **/\n  get isValid() {\n    return true;\n  }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n  let dtf = dtfCache.get(zoneName);\n  if (dtf === undefined) {\n    dtf = new Intl.DateTimeFormat(\"en-US\", {\n      hour12: false,\n      timeZone: zoneName,\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n      second: \"2-digit\",\n      era: \"short\",\n    });\n    dtfCache.set(zoneName, dtf);\n  }\n  return dtf;\n}\n\nconst typeToPos = {\n  year: 0,\n  month: 1,\n  day: 2,\n  era: 3,\n  hour: 4,\n  minute: 5,\n  second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n  const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n    parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n    [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n  return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n  const formatted = dtf.formatToParts(date);\n  const filled = [];\n  for (let i = 0; i < formatted.length; i++) {\n    const { type, value } = formatted[i];\n    const pos = typeToPos[type];\n\n    if (type === \"era\") {\n      filled[pos] = value;\n    } else if (!isUndefined(pos)) {\n      filled[pos] = parseInt(value, 10);\n    }\n  }\n  return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n  /**\n   * @param {string} name - Zone name\n   * @return {IANAZone}\n   */\n  static create(name) {\n    let zone = ianaZoneCache.get(name);\n    if (zone === undefined) {\n      ianaZoneCache.set(name, (zone = new IANAZone(name)));\n    }\n    return zone;\n  }\n\n  /**\n   * Reset local caches. Should only be necessary in testing scenarios.\n   * @return {void}\n   */\n  static resetCache() {\n    ianaZoneCache.clear();\n    dtfCache.clear();\n  }\n\n  /**\n   * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n   * @param {string} s - The string to check validity on\n   * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n   * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n   * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n   * @return {boolean}\n   */\n  static isValidSpecifier(s) {\n    return this.isValidZone(s);\n  }\n\n  /**\n   * Returns whether the provided string identifies a real zone\n   * @param {string} zone - The string to check\n   * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n   * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n   * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n   * @return {boolean}\n   */\n  static isValidZone(zone) {\n    if (!zone) {\n      return false;\n    }\n    try {\n      new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  constructor(name) {\n    super();\n    /** @private **/\n    this.zoneName = name;\n    /** @private **/\n    this.valid = IANAZone.isValidZone(name);\n  }\n\n  /**\n   * The type of zone. `iana` for all instances of `IANAZone`.\n   * @override\n   * @type {string}\n   */\n  get type() {\n    return \"iana\";\n  }\n\n  /**\n   * The name of this zone (i.e. the IANA zone name).\n   * @override\n   * @type {string}\n   */\n  get name() {\n    return this.zoneName;\n  }\n\n  /**\n   * Returns whether the offset is known to be fixed for the whole year:\n   * Always returns false for all IANA zones.\n   * @override\n   * @type {boolean}\n   */\n  get isUniversal() {\n    return false;\n  }\n\n  /**\n   * Returns the offset's common name (such as EST) at the specified timestamp\n   * @override\n   * @param {number} ts - Epoch milliseconds for which to get the name\n   * @param {Object} opts - Options to affect the format\n   * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n   * @param {string} opts.locale - What locale to return the offset name in.\n   * @return {string}\n   */\n  offsetName(ts, { format, locale }) {\n    return parseZoneInfo(ts, format, locale, this.name);\n  }\n\n  /**\n   * Returns the offset's value as a string\n   * @override\n   * @param {number} ts - Epoch milliseconds for which to get the offset\n   * @param {string} format - What style of offset to return.\n   *                          Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n   * @return {string}\n   */\n  formatOffset(ts, format) {\n    return formatOffset(this.offset(ts), format);\n  }\n\n  /**\n   * Return the offset in minutes for this zone at the specified timestamp.\n   * @override\n   * @param {number} ts - Epoch milliseconds for which to compute the offset\n   * @return {number}\n   */\n  offset(ts) {\n    if (!this.valid) return NaN;\n    const date = new Date(ts);\n\n    if (isNaN(date)) return NaN;\n\n    const dtf = makeDTF(this.name);\n    let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n      ? partsOffset(dtf, date)\n      : hackyOffset(dtf, date);\n\n    if (adOrBc === \"BC\") {\n      year = -Math.abs(year) + 1;\n    }\n\n    // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n    const adjustedHour = hour === 24 ? 0 : hour;\n\n    const asUTC = objToLocalTS({\n      year,\n      month,\n      day,\n      hour: adjustedHour,\n      minute,\n      second,\n      millisecond: 0,\n    });\n\n    let asTS = +date;\n    const over = asTS % 1000;\n    asTS -= over >= 0 ? over : 1000 + over;\n    return (asUTC - asTS) / (60 * 1000);\n  }\n\n  /**\n   * Return whether this Zone is equal to another zone\n   * @override\n   * @param {Zone} otherZone - the zone to compare\n   * @return {boolean}\n   */\n  equals(otherZone) {\n    return otherZone.type === \"iana\" && otherZone.name === this.name;\n  }\n\n  /**\n   * Return whether this Zone is valid.\n   * @override\n   * @type {boolean}\n   */\n  get isValid() {\n    return this.valid;\n  }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let dtf = intlLFCache[key];\n  if (!dtf) {\n    dtf = new Intl.ListFormat(locString, opts);\n    intlLFCache[key] = dtf;\n  }\n  return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let dtf = intlDTCache.get(key);\n  if (dtf === undefined) {\n    dtf = new Intl.DateTimeFormat(locString, opts);\n    intlDTCache.set(key, dtf);\n  }\n  return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let inf = intlNumCache.get(key);\n  if (inf === undefined) {\n    inf = new Intl.NumberFormat(locString, opts);\n    intlNumCache.set(key, inf);\n  }\n  return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n  const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n  const key = JSON.stringify([locString, cacheKeyOpts]);\n  let inf = intlRelCache.get(key);\n  if (inf === undefined) {\n    inf = new Intl.RelativeTimeFormat(locString, opts);\n    intlRelCache.set(key, inf);\n  }\n  return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n  if (sysLocaleCache) {\n    return sysLocaleCache;\n  } else {\n    sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n    return sysLocaleCache;\n  }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n  let opts = intlResolvedOptionsCache.get(locString);\n  if (opts === undefined) {\n    opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n    intlResolvedOptionsCache.set(locString, opts);\n  }\n  return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n  let data = weekInfoCache.get(locString);\n  if (!data) {\n    const locale = new Intl.Locale(locString);\n    // browsers currently implement this as a property, but spec says it should be a getter function\n    data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n    // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n    if (!(\"minimalDays\" in data)) {\n      data = { ...fallbackWeekSettings, ...data };\n    }\n    weekInfoCache.set(locString, data);\n  }\n  return data;\n}\n\nfunction parseLocaleString(localeStr) {\n  // I really want to avoid writing a BCP 47 parser\n  // see, e.g. https://github.com/wooorm/bcp-47\n  // Instead, we'll do this:\n\n  // a) if the string has no -u extensions, just leave it alone\n  // b) if it does, use Intl to resolve everything\n  // c) if Intl fails, try again without the -u\n\n  // private subtags and unicode subtags have ordering requirements,\n  // and we're not properly parsing this, so just strip out the\n  // private ones if they exist.\n  const xIndex = localeStr.indexOf(\"-x-\");\n  if (xIndex !== -1) {\n    localeStr = localeStr.substring(0, xIndex);\n  }\n\n  const uIndex = localeStr.indexOf(\"-u-\");\n  if (uIndex === -1) {\n    return [localeStr];\n  } else {\n    let options;\n    let selectedStr;\n    try {\n      options = getCachedDTF(localeStr).resolvedOptions();\n      selectedStr = localeStr;\n    } catch (e) {\n      const smaller = localeStr.substring(0, uIndex);\n      options = getCachedDTF(smaller).resolvedOptions();\n      selectedStr = smaller;\n    }\n\n    const { numberingSystem, calendar } = options;\n    return [selectedStr, numberingSystem, calendar];\n  }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n  if (outputCalendar || numberingSystem) {\n    if (!localeStr.includes(\"-u-\")) {\n      localeStr += \"-u\";\n    }\n\n    if (outputCalendar) {\n      localeStr += `-ca-${outputCalendar}`;\n    }\n\n    if (numberingSystem) {\n      localeStr += `-nu-${numberingSystem}`;\n    }\n    return localeStr;\n  } else {\n    return localeStr;\n  }\n}\n\nfunction mapMonths(f) {\n  const ms = [];\n  for (let i = 1; i <= 12; i++) {\n    const dt = DateTime.utc(2009, i, 1);\n    ms.push(f(dt));\n  }\n  return ms;\n}\n\nfunction mapWeekdays(f) {\n  const ms = [];\n  for (let i = 1; i <= 7; i++) {\n    const dt = DateTime.utc(2016, 11, 13 + i);\n    ms.push(f(dt));\n  }\n  return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n  const mode = loc.listingMode();\n\n  if (mode === \"error\") {\n    return null;\n  } else if (mode === \"en\") {\n    return englishFn(length);\n  } else {\n    return intlFn(length);\n  }\n}\n\nfunction supportsFastNumbers(loc) {\n  if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n    return false;\n  } else {\n    return (\n      loc.numberingSystem === \"latn\" ||\n      !loc.locale ||\n      loc.locale.startsWith(\"en\") ||\n      getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n    );\n  }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n  constructor(intl, forceSimple, opts) {\n    this.padTo = opts.padTo || 0;\n    this.floor = opts.floor || false;\n\n    const { padTo, floor, ...otherOpts } = opts;\n\n    if (!forceSimple || Object.keys(otherOpts).length > 0) {\n      const intlOpts = { useGrouping: false, ...opts };\n      if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n      this.inf = getCachedINF(intl, intlOpts);\n    }\n  }\n\n  format(i) {\n    if (this.inf) {\n      const fixed = this.floor ? Math.floor(i) : i;\n      return this.inf.format(fixed);\n    } else {\n      // to match the browser's numberformatter defaults\n      const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n      return padStart(fixed, this.padTo);\n    }\n  }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n  constructor(dt, intl, opts) {\n    this.opts = opts;\n    this.originalZone = undefined;\n\n    let z = undefined;\n    if (this.opts.timeZone) {\n      // Don't apply any workarounds if a timeZone is explicitly provided in opts\n      this.dt = dt;\n    } else if (dt.zone.type === \"fixed\") {\n      // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n      // That is why fixed-offset TZ is set to that unless it is:\n      // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n      // 2. Unsupported by the browser:\n      //    - some do not support Etc/\n      //    - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n      const gmtOffset = -1 * (dt.offset / 60);\n      const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n      if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n        z = offsetZ;\n        this.dt = dt;\n      } else {\n        // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n        // we manually apply the offset and substitute the zone as needed.\n        z = \"UTC\";\n        this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n        this.originalZone = dt.zone;\n      }\n    } else if (dt.zone.type === \"system\") {\n      this.dt = dt;\n    } else if (dt.zone.type === \"iana\") {\n      this.dt = dt;\n      z = dt.zone.name;\n    } else {\n      // Custom zones can have any offset / offsetName so we just manually\n      // apply the offset and substitute the zone as needed.\n      z = \"UTC\";\n      this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n      this.originalZone = dt.zone;\n    }\n\n    const intlOpts = { ...this.opts };\n    intlOpts.timeZone = intlOpts.timeZone || z;\n    this.dtf = getCachedDTF(intl, intlOpts);\n  }\n\n  format() {\n    if (this.originalZone) {\n      // If we have to substitute in the actual zone name, we have to use\n      // formatToParts so that the timezone can be replaced.\n      return this.formatToParts()\n        .map(({ value }) => value)\n        .join(\"\");\n    }\n    return this.dtf.format(this.dt.toJSDate());\n  }\n\n  formatToParts() {\n    const parts = this.dtf.formatToParts(this.dt.toJSDate());\n    if (this.originalZone) {\n      return parts.map((part) => {\n        if (part.type === \"timeZoneName\") {\n          const offsetName = this.originalZone.offsetName(this.dt.ts, {\n            locale: this.dt.locale,\n            format: this.opts.timeZoneName,\n          });\n          return {\n            ...part,\n            value: offsetName,\n          };\n        } else {\n          return part;\n        }\n      });\n    }\n    return parts;\n  }\n\n  resolvedOptions() {\n    return this.dtf.resolvedOptions();\n  }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n  constructor(intl, isEnglish, opts) {\n    this.opts = { style: \"long\", ...opts };\n    if (!isEnglish && hasRelative()) {\n      this.rtf = getCachedRTF(intl, opts);\n    }\n  }\n\n  format(count, unit) {\n    if (this.rtf) {\n      return this.rtf.format(count, unit);\n    } else {\n      return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n    }\n  }\n\n  formatToParts(count, unit) {\n    if (this.rtf) {\n      return this.rtf.formatToParts(count, unit);\n    } else {\n      return [];\n    }\n  }\n}\n\nconst fallbackWeekSettings = {\n  firstDay: 1,\n  minimalDays: 4,\n  weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n  static fromOpts(opts) {\n    return Locale.create(\n      opts.locale,\n      opts.numberingSystem,\n      opts.outputCalendar,\n      opts.weekSettings,\n      opts.defaultToEN\n    );\n  }\n\n  static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n    const specifiedLocale = locale || Settings.defaultLocale;\n    // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n    const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n    const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n    const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n    const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n    return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n  }\n\n  static resetCache() {\n    sysLocaleCache = null;\n    intlDTCache.clear();\n    intlNumCache.clear();\n    intlRelCache.clear();\n    intlResolvedOptionsCache.clear();\n    weekInfoCache.clear();\n  }\n\n  static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n    return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n  }\n\n  constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n    const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n    this.locale = parsedLocale;\n    this.numberingSystem = numbering || parsedNumberingSystem || null;\n    this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n    this.weekSettings = weekSettings;\n    this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n    this.weekdaysCache = { format: {}, standalone: {} };\n    this.monthsCache = { format: {}, standalone: {} };\n    this.meridiemCache = null;\n    this.eraCache = {};\n\n    this.specifiedLocale = specifiedLocale;\n    this.fastNumbersCached = null;\n  }\n\n  get fastNumbers() {\n    if (this.fastNumbersCached == null) {\n      this.fastNumbersCached = supportsFastNumbers(this);\n    }\n\n    return this.fastNumbersCached;\n  }\n\n  listingMode() {\n    const isActuallyEn = this.isEnglish();\n    const hasNoWeirdness =\n      (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n      (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n    return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n  }\n\n  clone(alts) {\n    if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n      return this;\n    } else {\n      return Locale.create(\n        alts.locale || this.specifiedLocale,\n        alts.numberingSystem || this.numberingSystem,\n        alts.outputCalendar || this.outputCalendar,\n        validateWeekSettings(alts.weekSettings) || this.weekSettings,\n        alts.defaultToEN || false\n      );\n    }\n  }\n\n  redefaultToEN(alts = {}) {\n    return this.clone({ ...alts, defaultToEN: true });\n  }\n\n  redefaultToSystem(alts = {}) {\n    return this.clone({ ...alts, defaultToEN: false });\n  }\n\n  months(length, format = false) {\n    return listStuff(this, length, English.months, () => {\n      // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n      // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n      // As such, just use format() instead of formatToParts() and take the whole string\n      const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n      format &= !monthSpecialCase;\n      const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n        formatStr = format ? \"format\" : \"standalone\";\n      if (!this.monthsCache[formatStr][length]) {\n        const mapper = !monthSpecialCase\n          ? (dt) => this.extract(dt, intl, \"month\")\n          : (dt) => this.dtFormatter(dt, intl).format();\n        this.monthsCache[formatStr][length] = mapMonths(mapper);\n      }\n      return this.monthsCache[formatStr][length];\n    });\n  }\n\n  weekdays(length, format = false) {\n    return listStuff(this, length, English.weekdays, () => {\n      const intl = format\n          ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n          : { weekday: length },\n        formatStr = format ? \"format\" : \"standalone\";\n      if (!this.weekdaysCache[formatStr][length]) {\n        this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n          this.extract(dt, intl, \"weekday\")\n        );\n      }\n      return this.weekdaysCache[formatStr][length];\n    });\n  }\n\n  meridiems() {\n    return listStuff(\n      this,\n      undefined,\n      () => English.meridiems,\n      () => {\n        // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n        // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n        if (!this.meridiemCache) {\n          const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n          this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n            (dt) => this.extract(dt, intl, \"dayperiod\")\n          );\n        }\n\n        return this.meridiemCache;\n      }\n    );\n  }\n\n  eras(length) {\n    return listStuff(this, length, English.eras, () => {\n      const intl = { era: length };\n\n      // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n      // to definitely enumerate them.\n      if (!this.eraCache[length]) {\n        this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n          this.extract(dt, intl, \"era\")\n        );\n      }\n\n      return this.eraCache[length];\n    });\n  }\n\n  extract(dt, intlOpts, field) {\n    const df = this.dtFormatter(dt, intlOpts),\n      results = df.formatToParts(),\n      matching = results.find((m) => m.type.toLowerCase() === field);\n    return matching ? matching.value : null;\n  }\n\n  numberFormatter(opts = {}) {\n    // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n    // (in contrast, the rest of the condition is used heavily)\n    return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n  }\n\n  dtFormatter(dt, intlOpts = {}) {\n    return new PolyDateFormatter(dt, this.intl, intlOpts);\n  }\n\n  relFormatter(opts = {}) {\n    return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n  }\n\n  listFormatter(opts = {}) {\n    return getCachedLF(this.intl, opts);\n  }\n\n  isEnglish() {\n    return (\n      this.locale === \"en\" ||\n      this.locale.toLowerCase() === \"en-us\" ||\n      getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n    );\n  }\n\n  getWeekSettings() {\n    if (this.weekSettings) {\n      return this.weekSettings;\n    } else if (!hasLocaleWeekInfo()) {\n      return fallbackWeekSettings;\n    } else {\n      return getCachedWeekInfo(this.locale);\n    }\n  }\n\n  getStartOfWeek() {\n    return this.getWeekSettings().firstDay;\n  }\n\n  getMinDaysInFirstWeek() {\n    return this.getWeekSettings().minimalDays;\n  }\n\n  getWeekendDays() {\n    return this.getWeekSettings().weekend;\n  }\n\n  equals(other) {\n    return (\n      this.locale === other.locale &&\n      this.numberingSystem === other.numberingSystem &&\n      this.outputCalendar === other.outputCalendar\n    );\n  }\n\n  toString() {\n    return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n  }\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n  return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n  \"January\",\n  \"February\",\n  \"March\",\n  \"April\",\n  \"May\",\n  \"June\",\n  \"July\",\n  \"August\",\n  \"September\",\n  \"October\",\n  \"November\",\n  \"December\",\n];\n\nexport const monthsShort = [\n  \"Jan\",\n  \"Feb\",\n  \"Mar\",\n  \"Apr\",\n  \"May\",\n  \"Jun\",\n  \"Jul\",\n  \"Aug\",\n  \"Sep\",\n  \"Oct\",\n  \"Nov\",\n  \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...monthsNarrow];\n    case \"short\":\n      return [...monthsShort];\n    case \"long\":\n      return [...monthsLong];\n    case \"numeric\":\n      return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n    case \"2-digit\":\n      return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n    default:\n      return null;\n  }\n}\n\nexport const weekdaysLong = [\n  \"Monday\",\n  \"Tuesday\",\n  \"Wednesday\",\n  \"Thursday\",\n  \"Friday\",\n  \"Saturday\",\n  \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...weekdaysNarrow];\n    case \"short\":\n      return [...weekdaysShort];\n    case \"long\":\n      return [...weekdaysLong];\n    case \"numeric\":\n      return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n    default:\n      return null;\n  }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...erasNarrow];\n    case \"short\":\n      return [...erasShort];\n    case \"long\":\n      return [...erasLong];\n    default:\n      return null;\n  }\n}\n\nexport function meridiemForDateTime(dt) {\n  return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n  return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n  return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n  return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n  const units = {\n    years: [\"year\", \"yr.\"],\n    quarters: [\"quarter\", \"qtr.\"],\n    months: [\"month\", \"mo.\"],\n    weeks: [\"week\", \"wk.\"],\n    days: [\"day\", \"day\", \"days\"],\n    hours: [\"hour\", \"hr.\"],\n    minutes: [\"minute\", \"min.\"],\n    seconds: [\"second\", \"sec.\"],\n  };\n\n  const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n  if (numeric === \"auto\" && lastable) {\n    const isDay = unit === \"days\";\n    switch (count) {\n      case 1:\n        return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n      case -1:\n        return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n      case 0:\n        return isDay ? \"today\" : `this ${units[unit][0]}`;\n      default: // fall through\n    }\n  }\n\n  const isInPast = Object.is(count, -0) || count < 0,\n    fmtValue = Math.abs(count),\n    singular = fmtValue === 1,\n    lilUnits = units[unit],\n    fmtUnit = narrow\n      ? singular\n        ? lilUnits[1]\n        : lilUnits[2] || lilUnits[1]\n      : singular\n      ? units[unit][0]\n      : unit;\n  return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n  // these all have the offsets removed because we don't have access to them\n  // without all the intl stuff this is backfilling\n  const filtered = pick(knownFormat, [\n      \"weekday\",\n      \"era\",\n      \"year\",\n      \"month\",\n      \"day\",\n      \"hour\",\n      \"minute\",\n      \"second\",\n      \"timeZoneName\",\n      \"hourCycle\",\n    ]),\n    key = stringify(filtered),\n    dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n  switch (key) {\n    case stringify(Formats.DATE_SHORT):\n      return \"M/d/yyyy\";\n    case stringify(Formats.DATE_MED):\n      return \"LLL d, yyyy\";\n    case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n      return \"EEE, LLL d, yyyy\";\n    case stringify(Formats.DATE_FULL):\n      return \"LLLL d, yyyy\";\n    case stringify(Formats.DATE_HUGE):\n      return \"EEEE, LLLL d, yyyy\";\n    case stringify(Formats.TIME_SIMPLE):\n      return \"h:mm a\";\n    case stringify(Formats.TIME_WITH_SECONDS):\n      return \"h:mm:ss a\";\n    case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n      return \"h:mm a\";\n    case stringify(Formats.TIME_WITH_LONG_OFFSET):\n      return \"h:mm a\";\n    case stringify(Formats.TIME_24_SIMPLE):\n      return \"HH:mm\";\n    case stringify(Formats.TIME_24_WITH_SECONDS):\n      return \"HH:mm:ss\";\n    case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n      return \"HH:mm\";\n    case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n      return \"HH:mm\";\n    case stringify(Formats.DATETIME_SHORT):\n      return \"M/d/yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_MED):\n      return \"LLL d, yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_FULL):\n      return \"LLLL d, yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_HUGE):\n      return dateTimeHuge;\n    case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n      return \"M/d/yyyy, h:mm:ss a\";\n    case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n      return \"LLL d, yyyy, h:mm:ss a\";\n    case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n      return \"EEE, d LLL yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n      return \"LLLL d, yyyy, h:mm:ss a\";\n    case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n      return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n    default:\n      return dateTimeHuge;\n  }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n  /**\n   * Get a singleton instance of UTC\n   * @return {FixedOffsetZone}\n   */\n  static get utcInstance() {\n    if (singleton === null) {\n      singleton = new FixedOffsetZone(0);\n    }\n    return singleton;\n  }\n\n  /**\n   * Get an instance with a specified offset\n   * @param {number} offset - The offset in minutes\n   * @return {FixedOffsetZone}\n   */\n  static instance(offset) {\n    return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n  }\n\n  /**\n   * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n   * @param {string} s - The offset string to parse\n   * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n   * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n   * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n   * @return {FixedOffsetZone}\n   */\n  static parseSpecifier(s) {\n    if (s) {\n      const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n      if (r) {\n        return new FixedOffsetZone(signedOffset(r[1], r[2]));\n      }\n    }\n    return null;\n  }\n\n  constructor(offset) {\n    super();\n    /** @private **/\n    this.fixed = offset;\n  }\n\n  /**\n   * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n   * @override\n   * @type {string}\n   */\n  get type() {\n    return \"fixed\";\n  }\n\n  /**\n   * The name of this zone.\n   * All fixed zones' names always start with \"UTC\" (plus optional offset)\n   * @override\n   * @type {string}\n   */\n  get name() {\n    return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n  }\n\n  /**\n   * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n   *\n   * @override\n   * @type {string}\n   */\n  get ianaName() {\n    if (this.fixed === 0) {\n      return \"Etc/UTC\";\n    } else {\n      return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n    }\n  }\n\n  /**\n   * Returns the offset's common name at the specified timestamp.\n   *\n   * For fixed offset zones this equals to the zone name.\n   * @override\n   */\n  offsetName() {\n    return this.name;\n  }\n\n  /**\n   * Returns the offset's value as a string\n   * @override\n   * @param {number} ts - Epoch milliseconds for which to get the offset\n   * @param {string} format - What style of offset to return.\n   *                          Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n   * @return {string}\n   */\n  formatOffset(ts, format) {\n    return formatOffset(this.fixed, format);\n  }\n\n  /**\n   * Returns whether the offset is known to be fixed for the whole year:\n   * Always returns true for all fixed offset zones.\n   * @override\n   * @type {boolean}\n   */\n  get isUniversal() {\n    return true;\n  }\n\n  /**\n   * Return the offset in minutes for this zone at the specified timestamp.\n   *\n   * For fixed offset zones, this is constant and does not depend on a timestamp.\n   * @override\n   * @return {number}\n   */\n  offset() {\n    return this.fixed;\n  }\n\n  /**\n   * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n   * @override\n   * @param {Zone} otherZone - the zone to compare\n   * @return {boolean}\n   */\n  equals(otherZone) {\n    return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n  }\n\n  /**\n   * Return whether this Zone is valid:\n   * All fixed offset zones are valid.\n   * @override\n   * @type {boolean}\n   */\n  get isValid() {\n    return true;\n  }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n  constructor(zoneName) {\n    super();\n    /**  @private */\n    this.zoneName = zoneName;\n  }\n\n  /** @override **/\n  get type() {\n    return \"invalid\";\n  }\n\n  /** @override **/\n  get name() {\n    return this.zoneName;\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return false;\n  }\n\n  /** @override **/\n  offsetName() {\n    return null;\n  }\n\n  /** @override **/\n  formatOffset() {\n    return \"\";\n  }\n\n  /** @override **/\n  offset() {\n    return NaN;\n  }\n\n  /** @override **/\n  equals() {\n    return false;\n  }\n\n  /** @override **/\n  get isValid() {\n    return false;\n  }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n  let offset;\n  if (isUndefined(input) || input === null) {\n    return defaultZone;\n  } else if (input instanceof Zone) {\n    return input;\n  } else if (isString(input)) {\n    const lowered = input.toLowerCase();\n    if (lowered === \"default\") return defaultZone;\n    else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n    else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n    else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n  } else if (isNumber(input)) {\n    return FixedOffsetZone.instance(input);\n  } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n    // This is dumb, but the instanceof check above doesn't seem to really work\n    // so we're duck checking it\n    return input;\n  } else {\n    return new InvalidZone(input);\n  }\n}\n","/*\n  This is just a junk drawer, containing anything used across multiple classes.\n  Because Luxon is small(ish), this should stay small and we won't worry about splitting\n  it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n  return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n  return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n  return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n  return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n  return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n  try {\n    return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n  } catch (e) {\n    return false;\n  }\n}\n\nexport function hasLocaleWeekInfo() {\n  try {\n    return (\n      typeof Intl !== \"undefined\" &&\n      !!Intl.Locale &&\n      (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n    );\n  } catch (e) {\n    return false;\n  }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n  return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n  if (arr.length === 0) {\n    return undefined;\n  }\n  return arr.reduce((best, next) => {\n    const pair = [by(next), next];\n    if (!best) {\n      return pair;\n    } else if (compare(best[0], pair[0]) === best[0]) {\n      return best;\n    } else {\n      return pair;\n    }\n  }, null)[1];\n}\n\nexport function pick(obj, keys) {\n  return keys.reduce((a, k) => {\n    a[k] = obj[k];\n    return a;\n  }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n  if (settings == null) {\n    return null;\n  } else if (typeof settings !== \"object\") {\n    throw new InvalidArgumentError(\"Week settings must be an object\");\n  } else {\n    if (\n      !integerBetween(settings.firstDay, 1, 7) ||\n      !integerBetween(settings.minimalDays, 1, 7) ||\n      !Array.isArray(settings.weekend) ||\n      settings.weekend.some((v) => !integerBetween(v, 1, 7))\n    ) {\n      throw new InvalidArgumentError(\"Invalid week settings\");\n    }\n    return {\n      firstDay: settings.firstDay,\n      minimalDays: settings.minimalDays,\n      weekend: Array.from(settings.weekend),\n    };\n  }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n  return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n  return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n  const isNeg = input < 0;\n  let padded;\n  if (isNeg) {\n    padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n  } else {\n    padded = (\"\" + input).padStart(n, \"0\");\n  }\n  return padded;\n}\n\nexport function parseInteger(string) {\n  if (isUndefined(string) || string === null || string === \"\") {\n    return undefined;\n  } else {\n    return parseInt(string, 10);\n  }\n}\n\nexport function parseFloating(string) {\n  if (isUndefined(string) || string === null || string === \"\") {\n    return undefined;\n  } else {\n    return parseFloat(string);\n  }\n}\n\nexport function parseMillis(fraction) {\n  // Return undefined (instead of 0) in these cases, where fraction is not set\n  if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n    return undefined;\n  } else {\n    const f = parseFloat(\"0.\" + fraction) * 1000;\n    return Math.floor(f);\n  }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n  const factor = 10 ** digits;\n  switch (rounding) {\n    case \"expand\":\n      return number > 0\n        ? Math.ceil(number * factor) / factor\n        : Math.floor(number * factor) / factor;\n    case \"trunc\":\n      return Math.trunc(number * factor) / factor;\n    case \"round\":\n      return Math.round(number * factor) / factor;\n    case \"floor\":\n      return Math.floor(number * factor) / factor;\n    case \"ceil\":\n      return Math.ceil(number * factor) / factor;\n    default:\n      throw new RangeError(`Value rounding ${rounding} is out of range`);\n  }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n  return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n  return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n  const modMonth = floorMod(month - 1, 12) + 1,\n    modYear = year + (month - modMonth) / 12;\n\n  if (modMonth === 2) {\n    return isLeapYear(modYear) ? 29 : 28;\n  } else {\n    return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n  }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n  let d = Date.UTC(\n    obj.year,\n    obj.month - 1,\n    obj.day,\n    obj.hour,\n    obj.minute,\n    obj.second,\n    obj.millisecond\n  );\n\n  // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n  if (obj.year < 100 && obj.year >= 0) {\n    d = new Date(d);\n    // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n    // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n    // the calculations done by Date.UTC are using year 2000 - which is incorrect\n    d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n  }\n  return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n  const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n  return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n  const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n  return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n  if (year > 99) {\n    return year;\n  } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n  const date = new Date(ts),\n    intlOpts = {\n      hourCycle: \"h23\",\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n    };\n\n  if (timeZone) {\n    intlOpts.timeZone = timeZone;\n  }\n\n  const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n  const parsed = new Intl.DateTimeFormat(locale, modified)\n    .formatToParts(date)\n    .find((m) => m.type.toLowerCase() === \"timezonename\");\n  return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n  let offHour = parseInt(offHourStr, 10);\n\n  // don't || this because we want to preserve -0\n  if (Number.isNaN(offHour)) {\n    offHour = 0;\n  }\n\n  const offMin = parseInt(offMinuteStr, 10) || 0,\n    offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n  return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n  const numericValue = Number(value);\n  if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n    throw new InvalidArgumentError(`Invalid unit value ${value}`);\n  return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n  const normalized = {};\n  for (const u in obj) {\n    if (hasOwnProperty(obj, u)) {\n      const v = obj[u];\n      if (v === undefined || v === null) continue;\n      normalized[normalizer(u)] = asNumber(v);\n    }\n  }\n  return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n *                          Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n  const hours = Math.trunc(Math.abs(offset / 60)),\n    minutes = Math.trunc(Math.abs(offset % 60)),\n    sign = offset >= 0 ? \"+\" : \"-\";\n\n  switch (format) {\n    case \"short\":\n      return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n    case \"narrow\":\n      return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n    case \"techie\":\n      return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n    default:\n      throw new RangeError(`Value format ${format} is out of range for property format`);\n  }\n}\n\nexport function timeObject(obj) {\n  return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","const numberingSystems = {\n  arab: \"[\\u0660-\\u0669]\",\n  arabext: \"[\\u06F0-\\u06F9]\",\n  bali: \"[\\u1B50-\\u1B59]\",\n  beng: \"[\\u09E6-\\u09EF]\",\n  deva: \"[\\u0966-\\u096F]\",\n  fullwide: \"[\\uFF10-\\uFF19]\",\n  gujr: \"[\\u0AE6-\\u0AEF]\",\n  hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n  khmr: \"[\\u17E0-\\u17E9]\",\n  knda: \"[\\u0CE6-\\u0CEF]\",\n  laoo: \"[\\u0ED0-\\u0ED9]\",\n  limb: \"[\\u1946-\\u194F]\",\n  mlym: \"[\\u0D66-\\u0D6F]\",\n  mong: \"[\\u1810-\\u1819]\",\n  mymr: \"[\\u1040-\\u1049]\",\n  orya: \"[\\u0B66-\\u0B6F]\",\n  tamldec: \"[\\u0BE6-\\u0BEF]\",\n  telu: \"[\\u0C66-\\u0C6F]\",\n  thai: \"[\\u0E50-\\u0E59]\",\n  tibt: \"[\\u0F20-\\u0F29]\",\n  latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n  arab: [1632, 1641],\n  arabext: [1776, 1785],\n  bali: [6992, 7001],\n  beng: [2534, 2543],\n  deva: [2406, 2415],\n  fullwide: [65296, 65303],\n  gujr: [2790, 2799],\n  khmr: [6112, 6121],\n  knda: [3302, 3311],\n  laoo: [3792, 3801],\n  limb: [6470, 6479],\n  mlym: [3430, 3439],\n  mong: [6160, 6169],\n  mymr: [4160, 4169],\n  orya: [2918, 2927],\n  tamldec: [3046, 3055],\n  telu: [3174, 3183],\n  thai: [3664, 3673],\n  tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n  let value = parseInt(str, 10);\n  if (isNaN(value)) {\n    value = \"\";\n    for (let i = 0; i < str.length; i++) {\n      const code = str.charCodeAt(i);\n\n      if (str[i].search(numberingSystems.hanidec) !== -1) {\n        value += hanidecChars.indexOf(str[i]);\n      } else {\n        for (const key in numberingSystemsUTF16) {\n          const [min, max] = numberingSystemsUTF16[key];\n          if (code >= min && code <= max) {\n            value += code - min;\n          }\n        }\n      }\n    }\n    return parseInt(value, 10);\n  } else {\n    return value;\n  }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n  digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n  const ns = numberingSystem || \"latn\";\n\n  let appendCache = digitRegexCache.get(ns);\n  if (appendCache === undefined) {\n    appendCache = new Map();\n    digitRegexCache.set(ns, appendCache);\n  }\n  let regex = appendCache.get(append);\n  if (regex === undefined) {\n    regex = new RegExp(`${numberingSystems[ns]}${append}`);\n    appendCache.set(append, regex);\n  }\n\n  return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n  defaultZone = \"system\",\n  defaultLocale = null,\n  defaultNumberingSystem = null,\n  defaultOutputCalendar = null,\n  twoDigitCutoffYear = 60,\n  throwOnInvalid,\n  defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n  /**\n   * Get the callback for returning the current timestamp.\n   * @type {function}\n   */\n  static get now() {\n    return now;\n  }\n\n  /**\n   * Set the callback for returning the current timestamp.\n   * The function should return a number, which will be interpreted as an Epoch millisecond count\n   * @type {function}\n   * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n   * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n   */\n  static set now(n) {\n    now = n;\n  }\n\n  /**\n   * Set the default time zone to create DateTimes in. Does not affect existing instances.\n   * Use the value \"system\" to reset this value to the system's time zone.\n   * @type {string}\n   */\n  static set defaultZone(zone) {\n    defaultZone = zone;\n  }\n\n  /**\n   * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n   * The default value is the system's time zone (the one set on the machine that runs this code).\n   * @type {Zone}\n   */\n  static get defaultZone() {\n    return normalizeZone(defaultZone, SystemZone.instance);\n  }\n\n  /**\n   * Get the default locale to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultLocale() {\n    return defaultLocale;\n  }\n\n  /**\n   * Set the default locale to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultLocale(locale) {\n    defaultLocale = locale;\n  }\n\n  /**\n   * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultNumberingSystem() {\n    return defaultNumberingSystem;\n  }\n\n  /**\n   * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultNumberingSystem(numberingSystem) {\n    defaultNumberingSystem = numberingSystem;\n  }\n\n  /**\n   * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultOutputCalendar() {\n    return defaultOutputCalendar;\n  }\n\n  /**\n   * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultOutputCalendar(outputCalendar) {\n    defaultOutputCalendar = outputCalendar;\n  }\n\n  /**\n   * @typedef {Object} WeekSettings\n   * @property {number} firstDay\n   * @property {number} minimalDays\n   * @property {number[]} weekend\n   */\n\n  /**\n   * @return {WeekSettings|null}\n   */\n  static get defaultWeekSettings() {\n    return defaultWeekSettings;\n  }\n\n  /**\n   * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n   * how many days are required in the first week of a year.\n   * Does not affect existing instances.\n   *\n   * @param {WeekSettings|null} weekSettings\n   */\n  static set defaultWeekSettings(weekSettings) {\n    defaultWeekSettings = validateWeekSettings(weekSettings);\n  }\n\n  /**\n   * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n   * @type {number}\n   */\n  static get twoDigitCutoffYear() {\n    return twoDigitCutoffYear;\n  }\n\n  /**\n   * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n   * @type {number}\n   * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n   * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n   * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n   * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n   * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n   */\n  static set twoDigitCutoffYear(cutoffYear) {\n    twoDigitCutoffYear = cutoffYear % 100;\n  }\n\n  /**\n   * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n   * @type {boolean}\n   */\n  static get throwOnInvalid() {\n    return throwOnInvalid;\n  }\n\n  /**\n   * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n   * @type {boolean}\n   */\n  static set throwOnInvalid(t) {\n    throwOnInvalid = t;\n  }\n\n  /**\n   * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n   * @return {void}\n   */\n  static resetCaches() {\n    Locale.resetCache();\n    IANAZone.resetCache();\n    DateTime.resetCache();\n    resetDigitRegexCache();\n  }\n}\n","export default class Invalid {\n  constructor(reason, explanation) {\n    this.reason = reason;\n    this.explanation = explanation;\n  }\n\n  toMessage() {\n    if (this.explanation) {\n      return `${this.reason}: ${this.explanation}`;\n    } else {\n      return this.reason;\n    }\n  }\n}\n","import {\n  integerBetween,\n  isLeapYear,\n  timeObject,\n  daysInYear,\n  daysInMonth,\n  weeksInWeekYear,\n  isInteger,\n  isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n  leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n  return new Invalid(\n    \"unit out of range\",\n    `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n  );\n}\n\nexport function dayOfWeek(year, month, day) {\n  const d = new Date(Date.UTC(year, month - 1, day));\n\n  if (year < 100 && year >= 0) {\n    d.setUTCFullYear(d.getUTCFullYear() - 1900);\n  }\n\n  const js = d.getUTCDay();\n\n  return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n  return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n  const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n    month0 = table.findIndex((i) => i < ordinal),\n    day = ordinal - table[month0];\n  return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n  return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const { year, month, day } = gregObj,\n    ordinal = computeOrdinal(year, month, day),\n    weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n  let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n    weekYear;\n\n  if (weekNumber < 1) {\n    weekYear = year - 1;\n    weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n  } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n    weekYear = year + 1;\n    weekNumber = 1;\n  } else {\n    weekYear = year;\n  }\n\n  return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const { weekYear, weekNumber, weekday } = weekData,\n    weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n    yearInDays = daysInYear(weekYear);\n\n  let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n    year;\n\n  if (ordinal < 1) {\n    year = weekYear - 1;\n    ordinal += daysInYear(year);\n  } else if (ordinal > yearInDays) {\n    year = weekYear + 1;\n    ordinal -= daysInYear(weekYear);\n  } else {\n    year = weekYear;\n  }\n\n  const { month, day } = uncomputeOrdinal(year, ordinal);\n  return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n  const { year, month, day } = gregData;\n  const ordinal = computeOrdinal(year, month, day);\n  return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n  const { year, ordinal } = ordinalData;\n  const { month, day } = uncomputeOrdinal(year, ordinal);\n  return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n  const hasLocaleWeekData =\n    !isUndefined(obj.localWeekday) ||\n    !isUndefined(obj.localWeekNumber) ||\n    !isUndefined(obj.localWeekYear);\n  if (hasLocaleWeekData) {\n    const hasIsoWeekData =\n      !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n    if (hasIsoWeekData) {\n      throw new ConflictingSpecificationError(\n        \"Cannot mix locale-based week fields with ISO-based week fields\"\n      );\n    }\n    if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n    if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n    if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n    delete obj.localWeekday;\n    delete obj.localWeekNumber;\n    delete obj.localWeekYear;\n    return {\n      minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n      startOfWeek: loc.getStartOfWeek(),\n    };\n  } else {\n    return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n  }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const validYear = isInteger(obj.weekYear),\n    validWeek = integerBetween(\n      obj.weekNumber,\n      1,\n      weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n    ),\n    validWeekday = integerBetween(obj.weekday, 1, 7);\n\n  if (!validYear) {\n    return unitOutOfRange(\"weekYear\", obj.weekYear);\n  } else if (!validWeek) {\n    return unitOutOfRange(\"week\", obj.weekNumber);\n  } else if (!validWeekday) {\n    return unitOutOfRange(\"weekday\", obj.weekday);\n  } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n  const validYear = isInteger(obj.year),\n    validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n  if (!validYear) {\n    return unitOutOfRange(\"year\", obj.year);\n  } else if (!validOrdinal) {\n    return unitOutOfRange(\"ordinal\", obj.ordinal);\n  } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n  const validYear = isInteger(obj.year),\n    validMonth = integerBetween(obj.month, 1, 12),\n    validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n  if (!validYear) {\n    return unitOutOfRange(\"year\", obj.year);\n  } else if (!validMonth) {\n    return unitOutOfRange(\"month\", obj.month);\n  } else if (!validDay) {\n    return unitOutOfRange(\"day\", obj.day);\n  } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n  const { hour, minute, second, millisecond } = obj;\n  const validHour =\n      integerBetween(hour, 0, 23) ||\n      (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n    validMinute = integerBetween(minute, 0, 59),\n    validSecond = integerBetween(second, 0, 59),\n    validMillisecond = integerBetween(millisecond, 0, 999);\n\n  if (!validHour) {\n    return unitOutOfRange(\"hour\", hour);\n  } else if (!validMinute) {\n    return unitOutOfRange(\"minute\", minute);\n  } else if (!validSecond) {\n    return unitOutOfRange(\"second\", second);\n  } else if (!validMillisecond) {\n    return unitOutOfRange(\"millisecond\", millisecond);\n  } else return false;\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n  let s = \"\";\n  for (const token of splits) {\n    if (token.literal) {\n      s += token.val;\n    } else {\n      s += tokenToString(token.val);\n    }\n  }\n  return s;\n}\n\nconst macroTokenToFormatOpts = {\n  D: Formats.DATE_SHORT,\n  DD: Formats.DATE_MED,\n  DDD: Formats.DATE_FULL,\n  DDDD: Formats.DATE_HUGE,\n  t: Formats.TIME_SIMPLE,\n  tt: Formats.TIME_WITH_SECONDS,\n  ttt: Formats.TIME_WITH_SHORT_OFFSET,\n  tttt: Formats.TIME_WITH_LONG_OFFSET,\n  T: Formats.TIME_24_SIMPLE,\n  TT: Formats.TIME_24_WITH_SECONDS,\n  TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n  TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n  f: Formats.DATETIME_SHORT,\n  ff: Formats.DATETIME_MED,\n  fff: Formats.DATETIME_FULL,\n  ffff: Formats.DATETIME_HUGE,\n  F: Formats.DATETIME_SHORT_WITH_SECONDS,\n  FF: Formats.DATETIME_MED_WITH_SECONDS,\n  FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n  FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n  static create(locale, opts = {}) {\n    return new Formatter(locale, opts);\n  }\n\n  static parseFormat(fmt) {\n    // white-space is always considered a literal in user-provided formats\n    // the \" \" token has a special meaning (see unitForToken)\n\n    let current = null,\n      currentFull = \"\",\n      bracketed = false;\n    const splits = [];\n    for (let i = 0; i < fmt.length; i++) {\n      const c = fmt.charAt(i);\n      if (c === \"'\") {\n        // turn '' into a literal signal quote instead of just skipping the empty literal\n        if (currentFull.length > 0 || bracketed) {\n          splits.push({\n            literal: bracketed || /^\\s+$/.test(currentFull),\n            val: currentFull === \"\" ? \"'\" : currentFull,\n          });\n        }\n        current = null;\n        currentFull = \"\";\n        bracketed = !bracketed;\n      } else if (bracketed) {\n        currentFull += c;\n      } else if (c === current) {\n        currentFull += c;\n      } else {\n        if (currentFull.length > 0) {\n          splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n        }\n        currentFull = c;\n        current = c;\n      }\n    }\n\n    if (currentFull.length > 0) {\n      splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n    }\n\n    return splits;\n  }\n\n  static macroTokenToFormatOpts(token) {\n    return macroTokenToFormatOpts[token];\n  }\n\n  constructor(locale, formatOpts) {\n    this.opts = formatOpts;\n    this.loc = locale;\n    this.systemLoc = null;\n  }\n\n  formatWithSystemDefault(dt, opts) {\n    if (this.systemLoc === null) {\n      this.systemLoc = this.loc.redefaultToSystem();\n    }\n    const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n    return df.format();\n  }\n\n  dtFormatter(dt, opts = {}) {\n    return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n  }\n\n  formatDateTime(dt, opts) {\n    return this.dtFormatter(dt, opts).format();\n  }\n\n  formatDateTimeParts(dt, opts) {\n    return this.dtFormatter(dt, opts).formatToParts();\n  }\n\n  formatInterval(interval, opts) {\n    const df = this.dtFormatter(interval.start, opts);\n    return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n  }\n\n  resolvedOptions(dt, opts) {\n    return this.dtFormatter(dt, opts).resolvedOptions();\n  }\n\n  num(n, p = 0, signDisplay = undefined) {\n    // we get some perf out of doing this here, annoyingly\n    if (this.opts.forceSimple) {\n      return padStart(n, p);\n    }\n\n    const opts = { ...this.opts };\n\n    if (p > 0) {\n      opts.padTo = p;\n    }\n    if (signDisplay) {\n      opts.signDisplay = signDisplay;\n    }\n\n    return this.loc.numberFormatter(opts).format(n);\n  }\n\n  formatDateTimeFromString(dt, fmt) {\n    const knownEnglish = this.loc.listingMode() === \"en\",\n      useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n      string = (opts, extract) => this.loc.extract(dt, opts, extract),\n      formatOffset = (opts) => {\n        if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n          return \"Z\";\n        }\n\n        return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n      },\n      meridiem = () =>\n        knownEnglish\n          ? English.meridiemForDateTime(dt)\n          : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n      month = (length, standalone) =>\n        knownEnglish\n          ? English.monthForDateTime(dt, length)\n          : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n      weekday = (length, standalone) =>\n        knownEnglish\n          ? English.weekdayForDateTime(dt, length)\n          : string(\n              standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n              \"weekday\"\n            ),\n      maybeMacro = (token) => {\n        const formatOpts = Formatter.macroTokenToFormatOpts(token);\n        if (formatOpts) {\n          return this.formatWithSystemDefault(dt, formatOpts);\n        } else {\n          return token;\n        }\n      },\n      era = (length) =>\n        knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n      tokenToString = (token) => {\n        // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n        switch (token) {\n          // ms\n          case \"S\":\n            return this.num(dt.millisecond);\n          case \"u\":\n          // falls through\n          case \"SSS\":\n            return this.num(dt.millisecond, 3);\n          // seconds\n          case \"s\":\n            return this.num(dt.second);\n          case \"ss\":\n            return this.num(dt.second, 2);\n          // fractional seconds\n          case \"uu\":\n            return this.num(Math.floor(dt.millisecond / 10), 2);\n          case \"uuu\":\n            return this.num(Math.floor(dt.millisecond / 100));\n          // minutes\n          case \"m\":\n            return this.num(dt.minute);\n          case \"mm\":\n            return this.num(dt.minute, 2);\n          // hours\n          case \"h\":\n            return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n          case \"hh\":\n            return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n          case \"H\":\n            return this.num(dt.hour);\n          case \"HH\":\n            return this.num(dt.hour, 2);\n          // offset\n          case \"Z\":\n            // like +6\n            return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n          case \"ZZ\":\n            // like +06:00\n            return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n          case \"ZZZ\":\n            // like +0600\n            return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n          case \"ZZZZ\":\n            // like EST\n            return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n          case \"ZZZZZ\":\n            // like Eastern Standard Time\n            return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n          // zone\n          case \"z\":\n            // like America/New_York\n            return dt.zoneName;\n          // meridiems\n          case \"a\":\n            return meridiem();\n          // dates\n          case \"d\":\n            return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n          case \"dd\":\n            return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n          // weekdays - standalone\n          case \"c\":\n            // like 1\n            return this.num(dt.weekday);\n          case \"ccc\":\n            // like 'Tues'\n            return weekday(\"short\", true);\n          case \"cccc\":\n            // like 'Tuesday'\n            return weekday(\"long\", true);\n          case \"ccccc\":\n            // like 'T'\n            return weekday(\"narrow\", true);\n          // weekdays - format\n          case \"E\":\n            // like 1\n            return this.num(dt.weekday);\n          case \"EEE\":\n            // like 'Tues'\n            return weekday(\"short\", false);\n          case \"EEEE\":\n            // like 'Tuesday'\n            return weekday(\"long\", false);\n          case \"EEEEE\":\n            // like 'T'\n            return weekday(\"narrow\", false);\n          // months - standalone\n          case \"L\":\n            // like 1\n            return useDateTimeFormatter\n              ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n              : this.num(dt.month);\n          case \"LL\":\n            // like 01, doesn't seem to work\n            return useDateTimeFormatter\n              ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n              : this.num(dt.month, 2);\n          case \"LLL\":\n            // like Jan\n            return month(\"short\", true);\n          case \"LLLL\":\n            // like January\n            return month(\"long\", true);\n          case \"LLLLL\":\n            // like J\n            return month(\"narrow\", true);\n          // months - format\n          case \"M\":\n            // like 1\n            return useDateTimeFormatter\n              ? string({ month: \"numeric\" }, \"month\")\n              : this.num(dt.month);\n          case \"MM\":\n            // like 01\n            return useDateTimeFormatter\n              ? string({ month: \"2-digit\" }, \"month\")\n              : this.num(dt.month, 2);\n          case \"MMM\":\n            // like Jan\n            return month(\"short\", false);\n          case \"MMMM\":\n            // like January\n            return month(\"long\", false);\n          case \"MMMMM\":\n            // like J\n            return month(\"narrow\", false);\n          // years\n          case \"y\":\n            // like 2014\n            return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n          case \"yy\":\n            // like 14\n            return useDateTimeFormatter\n              ? string({ year: \"2-digit\" }, \"year\")\n              : this.num(dt.year.toString().slice(-2), 2);\n          case \"yyyy\":\n            // like 0012\n            return useDateTimeFormatter\n              ? string({ year: \"numeric\" }, \"year\")\n              : this.num(dt.year, 4);\n          case \"yyyyyy\":\n            // like 000012\n            return useDateTimeFormatter\n              ? string({ year: \"numeric\" }, \"year\")\n              : this.num(dt.year, 6);\n          // eras\n          case \"G\":\n            // like AD\n            return era(\"short\");\n          case \"GG\":\n            // like Anno Domini\n            return era(\"long\");\n          case \"GGGGG\":\n            return era(\"narrow\");\n          case \"kk\":\n            return this.num(dt.weekYear.toString().slice(-2), 2);\n          case \"kkkk\":\n            return this.num(dt.weekYear, 4);\n          case \"W\":\n            return this.num(dt.weekNumber);\n          case \"WW\":\n            return this.num(dt.weekNumber, 2);\n          case \"n\":\n            return this.num(dt.localWeekNumber);\n          case \"nn\":\n            return this.num(dt.localWeekNumber, 2);\n          case \"ii\":\n            return this.num(dt.localWeekYear.toString().slice(-2), 2);\n          case \"iiii\":\n            return this.num(dt.localWeekYear, 4);\n          case \"o\":\n            return this.num(dt.ordinal);\n          case \"ooo\":\n            return this.num(dt.ordinal, 3);\n          case \"q\":\n            // like 1\n            return this.num(dt.quarter);\n          case \"qq\":\n            // like 01\n            return this.num(dt.quarter, 2);\n          case \"X\":\n            return this.num(Math.floor(dt.ts / 1000));\n          case \"x\":\n            return this.num(dt.ts);\n          default:\n            return maybeMacro(token);\n        }\n      };\n\n    return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n  }\n\n  formatDurationFromString(dur, fmt) {\n    const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n    const tokenToField = (token) => {\n        switch (token[0]) {\n          case \"S\":\n            return \"milliseconds\";\n          case \"s\":\n            return \"seconds\";\n          case \"m\":\n            return \"minutes\";\n          case \"h\":\n            return \"hours\";\n          case \"d\":\n            return \"days\";\n          case \"w\":\n            return \"weeks\";\n          case \"M\":\n            return \"months\";\n          case \"y\":\n            return \"years\";\n          default:\n            return null;\n        }\n      },\n      tokenToString = (lildur, info) => (token) => {\n        const mapped = tokenToField(token);\n        if (mapped) {\n          const inversionFactor =\n            info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n          let signDisplay;\n          if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n            signDisplay = \"never\";\n          } else if (this.opts.signMode === \"all\") {\n            signDisplay = \"always\";\n          } else {\n            // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n            signDisplay = \"auto\";\n          }\n          return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n        } else {\n          return token;\n        }\n      },\n      tokens = Formatter.parseFormat(fmt),\n      realTokens = tokens.reduce(\n        (found, { literal, val }) => (literal ? found : found.concat(val)),\n        []\n      ),\n      collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n      durationInfo = {\n        isNegativeDuration: collapsed < 0,\n        // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n        // in order\n        largestUnit: Object.keys(collapsed.values)[0],\n      };\n    return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n  }\n}\n","import {\n  untruncateYear,\n  signedOffset,\n  parseInteger,\n  parseMillis,\n  isUndefined,\n  parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n  const full = regexes.reduce((f, r) => f + r.source, \"\");\n  return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n  return (m) =>\n    extractors\n      .reduce(\n        ([mergedVals, mergedZone, cursor], ex) => {\n          const [val, zone, next] = ex(m, cursor);\n          return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n        },\n        [{}, null, 1]\n      )\n      .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n  if (s == null) {\n    return [null, null];\n  }\n\n  for (const [regex, extractor] of patterns) {\n    const m = regex.exec(s);\n    if (m) {\n      return extractor(m);\n    }\n  }\n  return [null, null];\n}\n\nfunction simpleParse(...keys) {\n  return (match, cursor) => {\n    const ret = {};\n    let i;\n\n    for (i = 0; i < keys.length; i++) {\n      ret[keys[i]] = parseInteger(match[cursor + i]);\n    }\n    return [ret, null, cursor + i];\n  };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n  `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n  const m = match[pos];\n  return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n  const item = {\n    year: int(match, cursor),\n    month: int(match, cursor + 1, 1),\n    day: int(match, cursor + 2, 1),\n  };\n\n  return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n  const item = {\n    hours: int(match, cursor, 0),\n    minutes: int(match, cursor + 1, 0),\n    seconds: int(match, cursor + 2, 0),\n    milliseconds: parseMillis(match[cursor + 3]),\n  };\n\n  return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n  const local = !match[cursor] && !match[cursor + 1],\n    fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n    zone = local ? null : FixedOffsetZone.instance(fullOffset);\n  return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n  const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n  return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n  /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n  const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n    match;\n\n  const hasNegativePrefix = s[0] === \"-\";\n  const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n  const maybeNegate = (num, force = false) =>\n    num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n  return [\n    {\n      years: maybeNegate(parseFloating(yearStr)),\n      months: maybeNegate(parseFloating(monthStr)),\n      weeks: maybeNegate(parseFloating(weekStr)),\n      days: maybeNegate(parseFloating(dayStr)),\n      hours: maybeNegate(parseFloating(hourStr)),\n      minutes: maybeNegate(parseFloating(minuteStr)),\n      seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n      milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n    },\n  ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n  GMT: 0,\n  EDT: -4 * 60,\n  EST: -5 * 60,\n  CDT: -5 * 60,\n  CST: -6 * 60,\n  MDT: -6 * 60,\n  MST: -7 * 60,\n  PDT: -7 * 60,\n  PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n  const result = {\n    year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n    month: English.monthsShort.indexOf(monthStr) + 1,\n    day: parseInteger(dayStr),\n    hour: parseInteger(hourStr),\n    minute: parseInteger(minuteStr),\n  };\n\n  if (secondStr) result.second = parseInteger(secondStr);\n  if (weekdayStr) {\n    result.weekday =\n      weekdayStr.length > 3\n        ? English.weekdaysLong.indexOf(weekdayStr) + 1\n        : English.weekdaysShort.indexOf(weekdayStr) + 1;\n  }\n\n  return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n  /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n  const [\n      ,\n      weekdayStr,\n      dayStr,\n      monthStr,\n      yearStr,\n      hourStr,\n      minuteStr,\n      secondStr,\n      obsOffset,\n      milOffset,\n      offHourStr,\n      offMinuteStr,\n    ] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n  let offset;\n  if (obsOffset) {\n    offset = obsOffsets[obsOffset];\n  } else if (milOffset) {\n    offset = 0;\n  } else {\n    offset = signedOffset(offHourStr, offMinuteStr);\n  }\n\n  return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n  // Remove comments and folding whitespace and replace multiple-spaces with a single space\n  return s\n    .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n    .replace(/(\\s\\s+)/g, \" \")\n    .trim();\n}\n\n// http date\n\nconst rfc1123 =\n    /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n  rfc850 =\n    /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n  ascii =\n    /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n  const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n  return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n  const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n  return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n  extractISOYmd,\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n  extractISOWeekData,\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n  extractISOOrdinalData,\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n  return parse(\n    s,\n    [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n    [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n    [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n    [isoTimeCombinedRegex, extractISOTimeAndOffset]\n  );\n}\n\nexport function parseRFC2822Date(s) {\n  return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n  return parse(\n    s,\n    [rfc1123, extractRFC1123Or850],\n    [rfc850, extractRFC1123Or850],\n    [ascii, extractASCII]\n  );\n}\n\nexport function parseISODuration(s) {\n  return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n  return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\n\nexport function parseSQL(s) {\n  return parse(\n    s,\n    [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n    [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n  );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n  asNumber,\n  hasOwnProperty,\n  isNumber,\n  isUndefined,\n  normalizeObject,\n  roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n    weeks: {\n      days: 7,\n      hours: 7 * 24,\n      minutes: 7 * 24 * 60,\n      seconds: 7 * 24 * 60 * 60,\n      milliseconds: 7 * 24 * 60 * 60 * 1000,\n    },\n    days: {\n      hours: 24,\n      minutes: 24 * 60,\n      seconds: 24 * 60 * 60,\n      milliseconds: 24 * 60 * 60 * 1000,\n    },\n    hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n    minutes: { seconds: 60, milliseconds: 60 * 1000 },\n    seconds: { milliseconds: 1000 },\n  },\n  casualMatrix = {\n    years: {\n      quarters: 4,\n      months: 12,\n      weeks: 52,\n      days: 365,\n      hours: 365 * 24,\n      minutes: 365 * 24 * 60,\n      seconds: 365 * 24 * 60 * 60,\n      milliseconds: 365 * 24 * 60 * 60 * 1000,\n    },\n    quarters: {\n      months: 3,\n      weeks: 13,\n      days: 91,\n      hours: 91 * 24,\n      minutes: 91 * 24 * 60,\n      seconds: 91 * 24 * 60 * 60,\n      milliseconds: 91 * 24 * 60 * 60 * 1000,\n    },\n    months: {\n      weeks: 4,\n      days: 30,\n      hours: 30 * 24,\n      minutes: 30 * 24 * 60,\n      seconds: 30 * 24 * 60 * 60,\n      milliseconds: 30 * 24 * 60 * 60 * 1000,\n    },\n\n    ...lowOrderMatrix,\n  },\n  daysInYearAccurate = 146097.0 / 400,\n  daysInMonthAccurate = 146097.0 / 4800,\n  accurateMatrix = {\n    years: {\n      quarters: 4,\n      months: 12,\n      weeks: daysInYearAccurate / 7,\n      days: daysInYearAccurate,\n      hours: daysInYearAccurate * 24,\n      minutes: daysInYearAccurate * 24 * 60,\n      seconds: daysInYearAccurate * 24 * 60 * 60,\n      milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n    },\n    quarters: {\n      months: 3,\n      weeks: daysInYearAccurate / 28,\n      days: daysInYearAccurate / 4,\n      hours: (daysInYearAccurate * 24) / 4,\n      minutes: (daysInYearAccurate * 24 * 60) / 4,\n      seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n      milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n    },\n    months: {\n      weeks: daysInMonthAccurate / 7,\n      days: daysInMonthAccurate,\n      hours: daysInMonthAccurate * 24,\n      minutes: daysInMonthAccurate * 24 * 60,\n      seconds: daysInMonthAccurate * 24 * 60 * 60,\n      milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n    },\n    ...lowOrderMatrix,\n  };\n\n// units ordered by size\nconst orderedUnits = [\n  \"years\",\n  \"quarters\",\n  \"months\",\n  \"weeks\",\n  \"days\",\n  \"hours\",\n  \"minutes\",\n  \"seconds\",\n  \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n  // deep merge for vals\n  const conf = {\n    values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n    loc: dur.loc.clone(alts.loc),\n    conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n    matrix: alts.matrix || dur.matrix,\n  };\n  return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n  let sum = vals.milliseconds ?? 0;\n  for (const unit of reverseUnits.slice(1)) {\n    if (vals[unit]) {\n      sum += vals[unit] * matrix[unit][\"milliseconds\"];\n    }\n  }\n  return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n  // the logic below assumes the overall value of the duration is positive\n  // if this is not the case, factor is used to make it so\n  const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n  orderedUnits.reduceRight((previous, current) => {\n    if (!isUndefined(vals[current])) {\n      if (previous) {\n        const previousVal = vals[previous] * factor;\n        const conv = matrix[current][previous];\n\n        // if (previousVal < 0):\n        // lower order unit is negative (e.g. { years: 2, days: -2 })\n        // normalize this by reducing the higher order unit by the appropriate amount\n        // and increasing the lower order unit\n        // this can never make the higher order unit negative, because this function only operates\n        // on positive durations, so the amount of time represented by the lower order unit cannot\n        // be larger than the higher order unit\n        // else:\n        // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n        // in this case we attempt to convert as much as possible from the lower order unit into\n        // the higher order one\n        //\n        // Math.floor takes care of both of these cases, rounding away from 0\n        // if previousVal < 0 it makes the absolute value larger\n        // if previousVal >= it makes the absolute value smaller\n        const rollUp = Math.floor(previousVal / conv);\n        vals[current] += rollUp * factor;\n        vals[previous] -= rollUp * conv * factor;\n      }\n      return current;\n    } else {\n      return previous;\n    }\n  }, null);\n\n  // try to convert any decimals into smaller units if possible\n  // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n  orderedUnits.reduce((previous, current) => {\n    if (!isUndefined(vals[current])) {\n      if (previous) {\n        const fraction = vals[previous] % 1;\n        vals[previous] -= fraction;\n        vals[current] += fraction * matrix[previous][current];\n      }\n      return current;\n    } else {\n      return previous;\n    }\n  }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n  const newVals = {};\n  for (const [key, value] of Object.entries(vals)) {\n    if (value !== 0) {\n      newVals[key] = value;\n    }\n  }\n  return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See  {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n  /**\n   * @private\n   */\n  constructor(config) {\n    const accurate = config.conversionAccuracy === \"longterm\" || false;\n    let matrix = accurate ? accurateMatrix : casualMatrix;\n\n    if (config.matrix) {\n      matrix = config.matrix;\n    }\n\n    /**\n     * @access private\n     */\n    this.values = config.values;\n    /**\n     * @access private\n     */\n    this.loc = config.loc || Locale.create();\n    /**\n     * @access private\n     */\n    this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n    /**\n     * @access private\n     */\n    this.invalid = config.invalid || null;\n    /**\n     * @access private\n     */\n    this.matrix = matrix;\n    /**\n     * @access private\n     */\n    this.isLuxonDuration = true;\n  }\n\n  /**\n   * Create Duration from a number of milliseconds.\n   * @param {number} count of milliseconds\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @return {Duration}\n   */\n  static fromMillis(count, opts) {\n    return Duration.fromObject({ milliseconds: count }, opts);\n  }\n\n  /**\n   * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n   * If this object is empty then a zero milliseconds duration is returned.\n   * @param {Object} obj - the object to create the DateTime from\n   * @param {number} obj.years\n   * @param {number} obj.quarters\n   * @param {number} obj.months\n   * @param {number} obj.weeks\n   * @param {number} obj.days\n   * @param {number} obj.hours\n   * @param {number} obj.minutes\n   * @param {number} obj.seconds\n   * @param {number} obj.milliseconds\n   * @param {Object} [opts=[]] - options for creating this Duration\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n   * @param {string} [opts.matrix=Object] - the custom conversion system to use\n   * @return {Duration}\n   */\n  static fromObject(obj, opts = {}) {\n    if (obj == null || typeof obj !== \"object\") {\n      throw new InvalidArgumentError(\n        `Duration.fromObject: argument expected to be an object, got ${\n          obj === null ? \"null\" : typeof obj\n        }`\n      );\n    }\n\n    return new Duration({\n      values: normalizeObject(obj, Duration.normalizeUnit),\n      loc: Locale.fromObject(opts),\n      conversionAccuracy: opts.conversionAccuracy,\n      matrix: opts.matrix,\n    });\n  }\n\n  /**\n   * Create a Duration from DurationLike.\n   *\n   * @param {Object | number | Duration} durationLike\n   * One of:\n   * - object with keys like 'years' and 'hours'.\n   * - number representing milliseconds\n   * - Duration instance\n   * @return {Duration}\n   */\n  static fromDurationLike(durationLike) {\n    if (isNumber(durationLike)) {\n      return Duration.fromMillis(durationLike);\n    } else if (Duration.isDuration(durationLike)) {\n      return durationLike;\n    } else if (typeof durationLike === \"object\") {\n      return Duration.fromObject(durationLike);\n    } else {\n      throw new InvalidArgumentError(\n        `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n      );\n    }\n  }\n\n  /**\n   * Create a Duration from an ISO 8601 duration string.\n   * @param {string} text - text to parse\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n   * @param {string} [opts.matrix=Object] - the preset conversion system to use\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n   * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n   * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n   * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n   * @return {Duration}\n   */\n  static fromISO(text, opts) {\n    const [parsed] = parseISODuration(text);\n    if (parsed) {\n      return Duration.fromObject(parsed, opts);\n    } else {\n      return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n    }\n  }\n\n  /**\n   * Create a Duration from an ISO 8601 time string.\n   * @param {string} text - text to parse\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n   * @param {string} [opts.matrix=Object] - the conversion system to use\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n   * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n   * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @return {Duration}\n   */\n  static fromISOTime(text, opts) {\n    const [parsed] = parseISOTimeOnly(text);\n    if (parsed) {\n      return Duration.fromObject(parsed, opts);\n    } else {\n      return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n    }\n  }\n\n  /**\n   * Create an invalid Duration.\n   * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {Duration}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidDurationError(invalid);\n    } else {\n      return new Duration({ invalid });\n    }\n  }\n\n  /**\n   * @private\n   */\n  static normalizeUnit(unit) {\n    const normalized = {\n      year: \"years\",\n      years: \"years\",\n      quarter: \"quarters\",\n      quarters: \"quarters\",\n      month: \"months\",\n      months: \"months\",\n      week: \"weeks\",\n      weeks: \"weeks\",\n      day: \"days\",\n      days: \"days\",\n      hour: \"hours\",\n      hours: \"hours\",\n      minute: \"minutes\",\n      minutes: \"minutes\",\n      second: \"seconds\",\n      seconds: \"seconds\",\n      millisecond: \"milliseconds\",\n      milliseconds: \"milliseconds\",\n    }[unit ? unit.toLowerCase() : unit];\n\n    if (!normalized) throw new InvalidUnitError(unit);\n\n    return normalized;\n  }\n\n  /**\n   * Check if an object is a Duration. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isDuration(o) {\n    return (o && o.isLuxonDuration) || false;\n  }\n\n  /**\n   * Get  the locale of a Duration, such 'en-GB'\n   * @type {string}\n   */\n  get locale() {\n    return this.isValid ? this.loc.locale : null;\n  }\n\n  /**\n   * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n   *\n   * @type {string}\n   */\n  get numberingSystem() {\n    return this.isValid ? this.loc.numberingSystem : null;\n  }\n\n  /**\n   * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n   * * `S` for milliseconds\n   * * `s` for seconds\n   * * `m` for minutes\n   * * `h` for hours\n   * * `d` for days\n   * * `w` for weeks\n   * * `M` for months\n   * * `y` for years\n   * Notes:\n   * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n   * * Tokens can be escaped by wrapping with single quotes.\n   * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n   * @param {string} fmt - the format string\n   * @param {Object} opts - options\n   * @param {boolean} [opts.floor=true] - floor numerical values\n   * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n   * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n   * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n   * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n   * @return {string}\n   */\n  toFormat(fmt, opts = {}) {\n    // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n    const fmtOpts = {\n      ...opts,\n      floor: opts.round !== false && opts.floor !== false,\n    };\n    return this.isValid\n      ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n      : INVALID;\n  }\n\n  /**\n   * Returns a string representation of a Duration with all units included.\n   * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n   * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n   * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n   * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n   * @example\n   * ```js\n   * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n   * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n   * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n   * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n   * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n   * ```\n   */\n  toHuman(opts = {}) {\n    if (!this.isValid) return INVALID;\n\n    const showZeros = opts.showZeros !== false;\n\n    const l = orderedUnits\n      .map((unit) => {\n        const val = this.values[unit];\n        if (isUndefined(val) || (val === 0 && !showZeros)) {\n          return null;\n        }\n        return this.loc\n          .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n          .format(val);\n      })\n      .filter((n) => n);\n\n    return this.loc\n      .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n      .format(l);\n  }\n\n  /**\n   * Returns a JavaScript object with this Duration's values.\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n   * @return {Object}\n   */\n  toObject() {\n    if (!this.isValid) return {};\n    return { ...this.values };\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Duration.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n   * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n   * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n   * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n   * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n   * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n   * @return {string}\n   */\n  toISO() {\n    // we could use the formatter, but this is an easier way to get the minimum string\n    if (!this.isValid) return null;\n\n    let s = \"P\";\n    if (this.years !== 0) s += this.years + \"Y\";\n    if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n    if (this.weeks !== 0) s += this.weeks + \"W\";\n    if (this.days !== 0) s += this.days + \"D\";\n    if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n      s += \"T\";\n    if (this.hours !== 0) s += this.hours + \"H\";\n    if (this.minutes !== 0) s += this.minutes + \"M\";\n    if (this.seconds !== 0 || this.milliseconds !== 0)\n      // this will handle \"floating point madness\" by removing extra decimal places\n      // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n      s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n    if (s === \"P\") s += \"T0S\";\n    return s;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n   * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n   * @return {string}\n   */\n  toISOTime(opts = {}) {\n    if (!this.isValid) return null;\n\n    const millis = this.toMillis();\n    if (millis < 0 || millis >= 86400000) return null;\n\n    opts = {\n      suppressMilliseconds: false,\n      suppressSeconds: false,\n      includePrefix: false,\n      format: \"extended\",\n      ...opts,\n      includeOffset: false,\n    };\n\n    const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n    return dateTime.toISOTime(opts);\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n   * @return {string}\n   */\n  toJSON() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n   * @return {string}\n   */\n  toString() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns a string representation of this Duration appropriate for the REPL.\n   * @return {string}\n   */\n  [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n    if (this.isValid) {\n      return `Duration { values: ${JSON.stringify(this.values)} }`;\n    } else {\n      return `Duration { Invalid, reason: ${this.invalidReason} }`;\n    }\n  }\n\n  /**\n   * Returns an milliseconds value of this Duration.\n   * @return {number}\n   */\n  toMillis() {\n    if (!this.isValid) return NaN;\n\n    return durationToMillis(this.matrix, this.values);\n  }\n\n  /**\n   * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n   * @return {number}\n   */\n  valueOf() {\n    return this.toMillis();\n  }\n\n  /**\n   * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n   * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @return {Duration}\n   */\n  plus(duration) {\n    if (!this.isValid) return this;\n\n    const dur = Duration.fromDurationLike(duration),\n      result = {};\n\n    for (const k of orderedUnits) {\n      if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n        result[k] = dur.get(k) + this.get(k);\n      }\n    }\n\n    return clone(this, { values: result }, true);\n  }\n\n  /**\n   * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n   * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @return {Duration}\n   */\n  minus(duration) {\n    if (!this.isValid) return this;\n\n    const dur = Duration.fromDurationLike(duration);\n    return this.plus(dur.negate());\n  }\n\n  /**\n   * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n   * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n   * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n   * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n   * @return {Duration}\n   */\n  mapUnits(fn) {\n    if (!this.isValid) return this;\n    const result = {};\n    for (const k of Object.keys(this.values)) {\n      result[k] = asNumber(fn(this.values[k], k));\n    }\n    return clone(this, { values: result }, true);\n  }\n\n  /**\n   * Get the value of unit.\n   * @param {string} unit - a unit such as 'minute' or 'day'\n   * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n   * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n   * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n   * @return {number}\n   */\n  get(unit) {\n    return this[Duration.normalizeUnit(unit)];\n  }\n\n  /**\n   * \"Set\" the values of specified units. Return a newly-constructed Duration.\n   * @param {Object} values - a mapping of units to numbers\n   * @example dur.set({ years: 2017 })\n   * @example dur.set({ hours: 8, minutes: 30 })\n   * @return {Duration}\n   */\n  set(values) {\n    if (!this.isValid) return this;\n\n    const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n    return clone(this, { values: mixed });\n  }\n\n  /**\n   * \"Set\" the locale and/or numberingSystem.  Returns a newly-constructed Duration.\n   * @example dur.reconfigure({ locale: 'en-GB' })\n   * @return {Duration}\n   */\n  reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n    const loc = this.loc.clone({ locale, numberingSystem });\n    const opts = { loc, matrix, conversionAccuracy };\n    return clone(this, opts);\n  }\n\n  /**\n   * Return the length of the duration in the specified unit.\n   * @param {string} unit - a unit such as 'minutes' or 'days'\n   * @example Duration.fromObject({years: 1}).as('days') //=> 365\n   * @example Duration.fromObject({years: 1}).as('months') //=> 12\n   * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n   * @return {number}\n   */\n  as(unit) {\n    return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n  }\n\n  /**\n   * Reduce this Duration to its canonical representation in its current units.\n   * Assuming the overall value of the Duration is positive, this means:\n   * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n   * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n   *   the overall value would be negative, see third example)\n   * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n   *\n   * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n   * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n   * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n   * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n   * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n   * @return {Duration}\n   */\n  normalize() {\n    if (!this.isValid) return this;\n    const vals = this.toObject();\n    normalizeValues(this.matrix, vals);\n    return clone(this, { values: vals }, true);\n  }\n\n  /**\n   * Rescale units to its largest representation\n   * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n   * @return {Duration}\n   */\n  rescale() {\n    if (!this.isValid) return this;\n    const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n    return clone(this, { values: vals }, true);\n  }\n\n  /**\n   * Convert this Duration into its representation in a different set of units.\n   * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n   * @return {Duration}\n   */\n  shiftTo(...units) {\n    if (!this.isValid) return this;\n\n    if (units.length === 0) {\n      return this;\n    }\n\n    units = units.map((u) => Duration.normalizeUnit(u));\n\n    const built = {},\n      accumulated = {},\n      vals = this.toObject();\n    let lastUnit;\n\n    for (const k of orderedUnits) {\n      if (units.indexOf(k) >= 0) {\n        lastUnit = k;\n\n        let own = 0;\n\n        // anything we haven't boiled down yet should get boiled to this unit\n        for (const ak in accumulated) {\n          own += this.matrix[ak][k] * accumulated[ak];\n          accumulated[ak] = 0;\n        }\n\n        // plus anything that's already in this unit\n        if (isNumber(vals[k])) {\n          own += vals[k];\n        }\n\n        // only keep the integer part for now in the hopes of putting any decimal part\n        // into a smaller unit later\n        const i = Math.trunc(own);\n        built[k] = i;\n        accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n        // otherwise, keep it in the wings to boil it later\n      } else if (isNumber(vals[k])) {\n        accumulated[k] = vals[k];\n      }\n    }\n\n    // anything leftover becomes the decimal for the last unit\n    // lastUnit must be defined since units is not empty\n    for (const key in accumulated) {\n      if (accumulated[key] !== 0) {\n        built[lastUnit] +=\n          key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n      }\n    }\n\n    normalizeValues(this.matrix, built);\n    return clone(this, { values: built }, true);\n  }\n\n  /**\n   * Shift this Duration to all available units.\n   * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n   * @return {Duration}\n   */\n  shiftToAll() {\n    if (!this.isValid) return this;\n    return this.shiftTo(\n      \"years\",\n      \"months\",\n      \"weeks\",\n      \"days\",\n      \"hours\",\n      \"minutes\",\n      \"seconds\",\n      \"milliseconds\"\n    );\n  }\n\n  /**\n   * Return the negative of this Duration.\n   * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n   * @return {Duration}\n   */\n  negate() {\n    if (!this.isValid) return this;\n    const negated = {};\n    for (const k of Object.keys(this.values)) {\n      negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n    }\n    return clone(this, { values: negated }, true);\n  }\n\n  /**\n   * Removes all units with values equal to 0 from this Duration.\n   * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n   * @return {Duration}\n   */\n  removeZeros() {\n    if (!this.isValid) return this;\n    const vals = removeZeroes(this.values);\n    return clone(this, { values: vals }, true);\n  }\n\n  /**\n   * Get the years.\n   * @type {number}\n   */\n  get years() {\n    return this.isValid ? this.values.years || 0 : NaN;\n  }\n\n  /**\n   * Get the quarters.\n   * @type {number}\n   */\n  get quarters() {\n    return this.isValid ? this.values.quarters || 0 : NaN;\n  }\n\n  /**\n   * Get the months.\n   * @type {number}\n   */\n  get months() {\n    return this.isValid ? this.values.months || 0 : NaN;\n  }\n\n  /**\n   * Get the weeks\n   * @type {number}\n   */\n  get weeks() {\n    return this.isValid ? this.values.weeks || 0 : NaN;\n  }\n\n  /**\n   * Get the days.\n   * @type {number}\n   */\n  get days() {\n    return this.isValid ? this.values.days || 0 : NaN;\n  }\n\n  /**\n   * Get the hours.\n   * @type {number}\n   */\n  get hours() {\n    return this.isValid ? this.values.hours || 0 : NaN;\n  }\n\n  /**\n   * Get the minutes.\n   * @type {number}\n   */\n  get minutes() {\n    return this.isValid ? this.values.minutes || 0 : NaN;\n  }\n\n  /**\n   * Get the seconds.\n   * @return {number}\n   */\n  get seconds() {\n    return this.isValid ? this.values.seconds || 0 : NaN;\n  }\n\n  /**\n   * Get the milliseconds.\n   * @return {number}\n   */\n  get milliseconds() {\n    return this.isValid ? this.values.milliseconds || 0 : NaN;\n  }\n\n  /**\n   * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n   * on invalid DateTimes or Intervals.\n   * @return {boolean}\n   */\n  get isValid() {\n    return this.invalid === null;\n  }\n\n  /**\n   * Returns an error code if this Duration became invalid, or null if the Duration is valid\n   * @return {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Equality check\n   * Two Durations are equal iff they have the same units and the same values for each unit.\n   * @param {Duration} other\n   * @return {boolean}\n   */\n  equals(other) {\n    if (!this.isValid || !other.isValid) {\n      return false;\n    }\n\n    if (!this.loc.equals(other.loc)) {\n      return false;\n    }\n\n    function eq(v1, v2) {\n      // Consider 0 and undefined as equal\n      if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n      return v1 === v2;\n    }\n\n    for (const u of orderedUnits) {\n      if (!eq(this.values[u], other.values[u])) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n  if (!start || !start.isValid) {\n    return Interval.invalid(\"missing or invalid start\");\n  } else if (!end || !end.isValid) {\n    return Interval.invalid(\"missing or invalid end\");\n  } else if (end < start) {\n    return Interval.invalid(\n      \"end before start\",\n      `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n    );\n  } else {\n    return null;\n  }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n  /**\n   * @private\n   */\n  constructor(config) {\n    /**\n     * @access private\n     */\n    this.s = config.start;\n    /**\n     * @access private\n     */\n    this.e = config.end;\n    /**\n     * @access private\n     */\n    this.invalid = config.invalid || null;\n    /**\n     * @access private\n     */\n    this.isLuxonInterval = true;\n  }\n\n  /**\n   * Create an invalid Interval.\n   * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {Interval}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidIntervalError(invalid);\n    } else {\n      return new Interval({ invalid });\n    }\n  }\n\n  /**\n   * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n   * @param {DateTime|Date|Object} start\n   * @param {DateTime|Date|Object} end\n   * @return {Interval}\n   */\n  static fromDateTimes(start, end) {\n    const builtStart = friendlyDateTime(start),\n      builtEnd = friendlyDateTime(end);\n\n    const validateError = validateStartEnd(builtStart, builtEnd);\n\n    if (validateError == null) {\n      return new Interval({\n        start: builtStart,\n        end: builtEnd,\n      });\n    } else {\n      return validateError;\n    }\n  }\n\n  /**\n   * Create an Interval from a start DateTime and a Duration to extend to.\n   * @param {DateTime|Date|Object} start\n   * @param {Duration|Object|number} duration - the length of the Interval.\n   * @return {Interval}\n   */\n  static after(start, duration) {\n    const dur = Duration.fromDurationLike(duration),\n      dt = friendlyDateTime(start);\n    return Interval.fromDateTimes(dt, dt.plus(dur));\n  }\n\n  /**\n   * Create an Interval from an end DateTime and a Duration to extend backwards to.\n   * @param {DateTime|Date|Object} end\n   * @param {Duration|Object|number} duration - the length of the Interval.\n   * @return {Interval}\n   */\n  static before(end, duration) {\n    const dur = Duration.fromDurationLike(duration),\n      dt = friendlyDateTime(end);\n    return Interval.fromDateTimes(dt.minus(dur), dt);\n  }\n\n  /**\n   * Create an Interval from an ISO 8601 string.\n   * Accepts `<start>/<end>`, `<start>/<duration>`, and `<duration>/<end>` formats.\n   * @param {string} text - the ISO string to parse\n   * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @return {Interval}\n   */\n  static fromISO(text, opts) {\n    const [s, e] = (text || \"\").split(\"/\", 2);\n    if (s && e) {\n      let start, startIsValid;\n      try {\n        start = DateTime.fromISO(s, opts);\n        startIsValid = start.isValid;\n      } catch (e) {\n        startIsValid = false;\n      }\n\n      let end, endIsValid;\n      try {\n        end = DateTime.fromISO(e, opts);\n        endIsValid = end.isValid;\n      } catch (e) {\n        endIsValid = false;\n      }\n\n      if (startIsValid && endIsValid) {\n        return Interval.fromDateTimes(start, end);\n      }\n\n      if (startIsValid) {\n        const dur = Duration.fromISO(e, opts);\n        if (dur.isValid) {\n          return Interval.after(start, dur);\n        }\n      } else if (endIsValid) {\n        const dur = Duration.fromISO(s, opts);\n        if (dur.isValid) {\n          return Interval.before(end, dur);\n        }\n      }\n    }\n    return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n  }\n\n  /**\n   * Check if an object is an Interval. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isInterval(o) {\n    return (o && o.isLuxonInterval) || false;\n  }\n\n  /**\n   * Returns the start of the Interval\n   * @type {DateTime}\n   */\n  get start() {\n    return this.isValid ? this.s : null;\n  }\n\n  /**\n   * Returns the end of the Interval. This is the first instant which is not part of the interval\n   * (Interval is half-open).\n   * @type {DateTime}\n   */\n  get end() {\n    return this.isValid ? this.e : null;\n  }\n\n  /**\n   * Returns the last DateTime included in the interval (since end is not part of the interval)\n   * @type {DateTime}\n   */\n  get lastDateTime() {\n    return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n  }\n\n  /**\n   * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n   * @type {boolean}\n   */\n  get isValid() {\n    return this.invalidReason === null;\n  }\n\n  /**\n   * Returns an error code if this Interval is invalid, or null if the Interval is valid\n   * @type {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Returns the length of the Interval in the specified unit.\n   * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n   * @return {number}\n   */\n  length(unit = \"milliseconds\") {\n    return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n  }\n\n  /**\n   * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n   * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n   * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n   * @param {string} [unit='milliseconds'] - the unit of time to count.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n   * @return {number}\n   */\n  count(unit = \"milliseconds\", opts) {\n    if (!this.isValid) return NaN;\n    const start = this.start.startOf(unit, opts);\n    let end;\n    if (opts?.useLocaleWeeks) {\n      end = this.end.reconfigure({ locale: start.locale });\n    } else {\n      end = this.end;\n    }\n    end = end.startOf(unit, opts);\n    return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n  }\n\n  /**\n   * Returns whether this Interval's start and end are both in the same unit of time\n   * @param {string} unit - the unit of time to check sameness on\n   * @return {boolean}\n   */\n  hasSame(unit) {\n    return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n  }\n\n  /**\n   * Return whether this Interval has the same start and end DateTimes.\n   * @return {boolean}\n   */\n  isEmpty() {\n    return this.s.valueOf() === this.e.valueOf();\n  }\n\n  /**\n   * Return whether this Interval's start is after the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  isAfter(dateTime) {\n    if (!this.isValid) return false;\n    return this.s > dateTime;\n  }\n\n  /**\n   * Return whether this Interval's end is before the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  isBefore(dateTime) {\n    if (!this.isValid) return false;\n    return this.e <= dateTime;\n  }\n\n  /**\n   * Return whether this Interval contains the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  contains(dateTime) {\n    if (!this.isValid) return false;\n    return this.s <= dateTime && this.e > dateTime;\n  }\n\n  /**\n   * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n   * @param {Object} values - the values to set\n   * @param {DateTime} values.start - the starting DateTime\n   * @param {DateTime} values.end - the ending DateTime\n   * @return {Interval}\n   */\n  set({ start, end } = {}) {\n    if (!this.isValid) return this;\n    return Interval.fromDateTimes(start || this.s, end || this.e);\n  }\n\n  /**\n   * Split this Interval at each of the specified DateTimes\n   * @param {...DateTime} dateTimes - the unit of time to count.\n   * @return {Array}\n   */\n  splitAt(...dateTimes) {\n    if (!this.isValid) return [];\n    const sorted = dateTimes\n        .map(friendlyDateTime)\n        .filter((d) => this.contains(d))\n        .sort((a, b) => a.toMillis() - b.toMillis()),\n      results = [];\n    let { s } = this,\n      i = 0;\n\n    while (s < this.e) {\n      const added = sorted[i] || this.e,\n        next = +added > +this.e ? this.e : added;\n      results.push(Interval.fromDateTimes(s, next));\n      s = next;\n      i += 1;\n    }\n\n    return results;\n  }\n\n  /**\n   * Split this Interval into smaller Intervals, each of the specified length.\n   * Left over time is grouped into a smaller interval\n   * @param {Duration|Object|number} duration - The length of each resulting interval.\n   * @return {Array}\n   */\n  splitBy(duration) {\n    const dur = Duration.fromDurationLike(duration);\n\n    if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n      return [];\n    }\n\n    let { s } = this,\n      idx = 1,\n      next;\n\n    const results = [];\n    while (s < this.e) {\n      const added = this.start.plus(dur.mapUnits((x) => x * idx));\n      next = +added > +this.e ? this.e : added;\n      results.push(Interval.fromDateTimes(s, next));\n      s = next;\n      idx += 1;\n    }\n\n    return results;\n  }\n\n  /**\n   * Split this Interval into the specified number of smaller intervals.\n   * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n   * @return {Array}\n   */\n  divideEqually(numberOfParts) {\n    if (!this.isValid) return [];\n    return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n  }\n\n  /**\n   * Return whether this Interval overlaps with the specified Interval\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  overlaps(other) {\n    return this.e > other.s && this.s < other.e;\n  }\n\n  /**\n   * Return whether this Interval's end is adjacent to the specified Interval's start.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  abutsStart(other) {\n    if (!this.isValid) return false;\n    return +this.e === +other.s;\n  }\n\n  /**\n   * Return whether this Interval's start is adjacent to the specified Interval's end.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  abutsEnd(other) {\n    if (!this.isValid) return false;\n    return +other.e === +this.s;\n  }\n\n  /**\n   * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  engulfs(other) {\n    if (!this.isValid) return false;\n    return this.s <= other.s && this.e >= other.e;\n  }\n\n  /**\n   * Return whether this Interval has the same start and end as the specified Interval.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  equals(other) {\n    if (!this.isValid || !other.isValid) {\n      return false;\n    }\n\n    return this.s.equals(other.s) && this.e.equals(other.e);\n  }\n\n  /**\n   * Return an Interval representing the intersection of this Interval and the specified Interval.\n   * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n   * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n   * @param {Interval} other\n   * @return {Interval}\n   */\n  intersection(other) {\n    if (!this.isValid) return this;\n    const s = this.s > other.s ? this.s : other.s,\n      e = this.e < other.e ? this.e : other.e;\n\n    if (s >= e) {\n      return null;\n    } else {\n      return Interval.fromDateTimes(s, e);\n    }\n  }\n\n  /**\n   * Return an Interval representing the union of this Interval and the specified Interval.\n   * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n   * @param {Interval} other\n   * @return {Interval}\n   */\n  union(other) {\n    if (!this.isValid) return this;\n    const s = this.s < other.s ? this.s : other.s,\n      e = this.e > other.e ? this.e : other.e;\n    return Interval.fromDateTimes(s, e);\n  }\n\n  /**\n   * Merge an array of Intervals into an equivalent minimal set of Intervals.\n   * Combines overlapping and adjacent Intervals.\n   * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n   * and ending with the latest.\n   *\n   * @param {Array} intervals\n   * @return {Array}\n   */\n  static merge(intervals) {\n    const [found, final] = intervals\n      .sort((a, b) => a.s - b.s)\n      .reduce(\n        ([sofar, current], item) => {\n          if (!current) {\n            return [sofar, item];\n          } else if (current.overlaps(item) || current.abutsStart(item)) {\n            return [sofar, current.union(item)];\n          } else {\n            return [sofar.concat([current]), item];\n          }\n        },\n        [[], null]\n      );\n    if (final) {\n      found.push(final);\n    }\n    return found;\n  }\n\n  /**\n   * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n   * @param {Array} intervals\n   * @return {Array}\n   */\n  static xor(intervals) {\n    let start = null,\n      currentCount = 0;\n    const results = [],\n      ends = intervals.map((i) => [\n        { time: i.s, type: \"s\" },\n        { time: i.e, type: \"e\" },\n      ]),\n      flattened = Array.prototype.concat(...ends),\n      arr = flattened.sort((a, b) => a.time - b.time);\n\n    for (const i of arr) {\n      currentCount += i.type === \"s\" ? 1 : -1;\n\n      if (currentCount === 1) {\n        start = i.time;\n      } else {\n        if (start && +start !== +i.time) {\n          results.push(Interval.fromDateTimes(start, i.time));\n        }\n\n        start = null;\n      }\n    }\n\n    return Interval.merge(results);\n  }\n\n  /**\n   * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n   * @param {...Interval} intervals\n   * @return {Array}\n   */\n  difference(...intervals) {\n    return Interval.xor([this].concat(intervals))\n      .map((i) => this.intersection(i))\n      .filter((i) => i && !i.isEmpty());\n  }\n\n  /**\n   * Returns a string representation of this Interval appropriate for debugging.\n   * @return {string}\n   */\n  toString() {\n    if (!this.isValid) return INVALID;\n    return `[${this.s.toISO()} – ${this.e.toISO()})`;\n  }\n\n  /**\n   * Returns a string representation of this Interval appropriate for the REPL.\n   * @return {string}\n   */\n  [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n    if (this.isValid) {\n      return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n    } else {\n      return `Interval { Invalid, reason: ${this.invalidReason} }`;\n    }\n  }\n\n  /**\n   * Returns a localized string representing this Interval. Accepts the same options as the\n   * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n   * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n   * is browser-specific, but in general it will return an appropriate representation of the\n   * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n   * specified.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n   * Intl.DateTimeFormat constructor options.\n   * @param {Object} opts - Options to override the configuration of the start DateTime.\n   * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n   * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n   * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n   * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n   * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n   * @return {string}\n   */\n  toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n      : INVALID;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Interval.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @param {Object} opts - The same options as {@link DateTime#toISO}\n   * @return {string}\n   */\n  toISO(opts) {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of date of this Interval.\n   * The time components are ignored.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @return {string}\n   */\n  toISODate() {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toISODate()}/${this.e.toISODate()}`;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of time of this Interval.\n   * The date components are ignored.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @param {Object} opts - The same options as {@link DateTime#toISO}\n   * @return {string}\n   */\n  toISOTime(opts) {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n  }\n\n  /**\n   * Returns a string representation of this Interval formatted according to the specified format\n   * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n   * formatting tool.\n   * @param {string} dateFormat - The format string. This string formats the start and end time.\n   * See {@link DateTime#toFormat} for details.\n   * @param {Object} opts - Options.\n   * @param {string} [opts.separator =  ' – '] - A separator to place between the start and end\n   * representations.\n   * @return {string}\n   */\n  toFormat(dateFormat, { separator = \" – \" } = {}) {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n  }\n\n  /**\n   * Return a Duration representing the time spanned by this interval.\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n   * @return {Duration}\n   */\n  toDuration(unit, opts) {\n    if (!this.isValid) {\n      return Duration.invalid(this.invalidReason);\n    }\n    return this.e.diff(this.s, unit, opts);\n  }\n\n  /**\n   * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n   * @param {function} mapFn\n   * @return {Interval}\n   * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n   * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n   */\n  mapEndpoints(mapFn) {\n    return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n  }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n  /**\n   * Return whether the specified zone contains a DST.\n   * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n   * @return {boolean}\n   */\n  static hasDST(zone = Settings.defaultZone) {\n    const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n    return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n  }\n\n  /**\n   * Return whether the specified zone is a valid IANA specifier.\n   * @param {string} zone - Zone to check\n   * @return {boolean}\n   */\n  static isValidIANAZone(zone) {\n    return IANAZone.isValidZone(zone);\n  }\n\n  /**\n   * Converts the input into a {@link Zone} instance.\n   *\n   * * If `input` is already a Zone instance, it is returned unchanged.\n   * * If `input` is a string containing a valid time zone name, a Zone instance\n   *   with that name is returned.\n   * * If `input` is a string that doesn't refer to a known time zone, a Zone\n   *   instance with {@link Zone#isValid} == false is returned.\n   * * If `input is a number, a Zone instance with the specified fixed offset\n   *   in minutes is returned.\n   * * If `input` is `null` or `undefined`, the default zone is returned.\n   * @param {string|Zone|number} [input] - the value to be converted\n   * @return {Zone}\n   */\n  static normalizeZone(input) {\n    return normalizeZone(input, Settings.defaultZone);\n  }\n\n  /**\n   * Get the weekday on which the week starts according to the given locale.\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n   */\n  static getStartOfWeek({ locale = null, locObj = null } = {}) {\n    return (locObj || Locale.create(locale)).getStartOfWeek();\n  }\n\n  /**\n   * Get the minimum number of days necessary in a week before it is considered part of the next year according\n   * to the given locale.\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @returns {number}\n   */\n  static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n    return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n  }\n\n  /**\n   * Get the weekdays, which are considered the weekend according to the given locale\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n   */\n  static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n    // copy the array, because we cache it internally\n    return (locObj || Locale.create(locale)).getWeekendDays().slice();\n  }\n\n  /**\n   * Return an array of standalone month names.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @param {string} [opts.outputCalendar='gregory'] - the calendar\n   * @example Info.months()[0] //=> 'January'\n   * @example Info.months('short')[0] //=> 'Jan'\n   * @example Info.months('numeric')[0] //=> '1'\n   * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n   * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n   * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n   * @return {Array}\n   */\n  static months(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n  }\n\n  /**\n   * Return an array of format month names.\n   * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n   * changes the string.\n   * See {@link Info#months}\n   * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @param {string} [opts.outputCalendar='gregory'] - the calendar\n   * @return {Array}\n   */\n  static monthsFormat(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n  }\n\n  /**\n   * Return an array of standalone week names.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @example Info.weekdays()[0] //=> 'Monday'\n   * @example Info.weekdays('short')[0] //=> 'Mon'\n   * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n   * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n   * @return {Array}\n   */\n  static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n    return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n  }\n\n  /**\n   * Return an array of format week names.\n   * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n   * changes the string.\n   * See {@link Info#weekdays}\n   * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale=null] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @return {Array}\n   */\n  static weekdaysFormat(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n  }\n\n  /**\n   * Return an array of meridiems.\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n   * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n   * @return {Array}\n   */\n  static meridiems({ locale = null } = {}) {\n    return Locale.create(locale).meridiems();\n  }\n\n  /**\n   * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n   * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @example Info.eras() //=> [ 'BC', 'AD' ]\n   * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n   * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n   * @return {Array}\n   */\n  static eras(length = \"short\", { locale = null } = {}) {\n    return Locale.create(locale, null, \"gregory\").eras(length);\n  }\n\n  /**\n   * Return the set of available features in this environment.\n   * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n   * Keys:\n   * * `relative`: whether this environment supports relative time formatting\n   * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n   * @example Info.features() //=> { relative: false, localeWeek: true }\n   * @return {Object}\n   */\n  static features() {\n    return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n  }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n  const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n    ms = utcDayStart(later) - utcDayStart(earlier);\n  return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n  const differs = [\n    [\"years\", (a, b) => b.year - a.year],\n    [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n    [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n    [\n      \"weeks\",\n      (a, b) => {\n        const days = dayDiff(a, b);\n        return (days - (days % 7)) / 7;\n      },\n    ],\n    [\"days\", dayDiff],\n  ];\n\n  const results = {};\n  const earlier = cursor;\n  let lowestOrder, highWater;\n\n  /* This loop tries to diff using larger units first.\n     If we overshoot, we backtrack and try the next smaller unit.\n     \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n     as we use smaller and smaller units.\n     highWater keeps track of where we would be if we added one more of the smallest unit,\n     this is used later to potentially convert any difference smaller than the smallest higher order unit\n     into a fraction of that smallest higher order unit\n  */\n  for (const [unit, differ] of differs) {\n    if (units.indexOf(unit) >= 0) {\n      lowestOrder = unit;\n\n      results[unit] = differ(cursor, later);\n      highWater = earlier.plus(results);\n\n      if (highWater > later) {\n        // we overshot the end point, backtrack cursor by 1\n        results[unit]--;\n        cursor = earlier.plus(results);\n\n        // if we are still overshooting now, we need to backtrack again\n        // this happens in certain situations when diffing times in different zones,\n        // because this calculation ignores time zones\n        if (cursor > later) {\n          // keep the \"overshot by 1\" around as highWater\n          highWater = cursor;\n          // backtrack cursor by 1\n          results[unit]--;\n          cursor = earlier.plus(results);\n        }\n      } else {\n        cursor = highWater;\n      }\n    }\n  }\n\n  return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n  let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n  const remainingMillis = later - cursor;\n\n  const lowerOrderUnits = units.filter(\n    (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n  );\n\n  if (lowerOrderUnits.length === 0) {\n    if (highWater < later) {\n      highWater = cursor.plus({ [lowestOrder]: 1 });\n    }\n\n    if (highWater !== cursor) {\n      results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n    }\n  }\n\n  const duration = Duration.fromObject(results, opts);\n\n  if (lowerOrderUnits.length > 0) {\n    return Duration.fromMillis(remainingMillis, opts)\n      .shiftTo(...lowerOrderUnits)\n      .plus(duration);\n  } else {\n    return duration;\n  }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n  return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n  // make dots optional and also make them literal\n  // make space and non breakable space characters interchangeable\n  return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n  return s\n    .replace(/\\./g, \"\") // ignore dots that were made optional\n    .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n    .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n  if (strings === null) {\n    return null;\n  } else {\n    return {\n      regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n      deser: ([s]) =>\n        strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n    };\n  }\n}\n\nfunction offset(regex, groups) {\n  return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n  return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n  return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n  const one = digitRegex(loc),\n    two = digitRegex(loc, \"{2}\"),\n    three = digitRegex(loc, \"{3}\"),\n    four = digitRegex(loc, \"{4}\"),\n    six = digitRegex(loc, \"{6}\"),\n    oneOrTwo = digitRegex(loc, \"{1,2}\"),\n    oneToThree = digitRegex(loc, \"{1,3}\"),\n    oneToSix = digitRegex(loc, \"{1,6}\"),\n    oneToNine = digitRegex(loc, \"{1,9}\"),\n    twoToFour = digitRegex(loc, \"{2,4}\"),\n    fourToSix = digitRegex(loc, \"{4,6}\"),\n    literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n    unitate = (t) => {\n      if (token.literal) {\n        return literal(t);\n      }\n      switch (t.val) {\n        // era\n        case \"G\":\n          return oneOf(loc.eras(\"short\"), 0);\n        case \"GG\":\n          return oneOf(loc.eras(\"long\"), 0);\n        // years\n        case \"y\":\n          return intUnit(oneToSix);\n        case \"yy\":\n          return intUnit(twoToFour, untruncateYear);\n        case \"yyyy\":\n          return intUnit(four);\n        case \"yyyyy\":\n          return intUnit(fourToSix);\n        case \"yyyyyy\":\n          return intUnit(six);\n        // months\n        case \"M\":\n          return intUnit(oneOrTwo);\n        case \"MM\":\n          return intUnit(two);\n        case \"MMM\":\n          return oneOf(loc.months(\"short\", true), 1);\n        case \"MMMM\":\n          return oneOf(loc.months(\"long\", true), 1);\n        case \"L\":\n          return intUnit(oneOrTwo);\n        case \"LL\":\n          return intUnit(two);\n        case \"LLL\":\n          return oneOf(loc.months(\"short\", false), 1);\n        case \"LLLL\":\n          return oneOf(loc.months(\"long\", false), 1);\n        // dates\n        case \"d\":\n          return intUnit(oneOrTwo);\n        case \"dd\":\n          return intUnit(two);\n        // ordinals\n        case \"o\":\n          return intUnit(oneToThree);\n        case \"ooo\":\n          return intUnit(three);\n        // time\n        case \"HH\":\n          return intUnit(two);\n        case \"H\":\n          return intUnit(oneOrTwo);\n        case \"hh\":\n          return intUnit(two);\n        case \"h\":\n          return intUnit(oneOrTwo);\n        case \"mm\":\n          return intUnit(two);\n        case \"m\":\n          return intUnit(oneOrTwo);\n        case \"q\":\n          return intUnit(oneOrTwo);\n        case \"qq\":\n          return intUnit(two);\n        case \"s\":\n          return intUnit(oneOrTwo);\n        case \"ss\":\n          return intUnit(two);\n        case \"S\":\n          return intUnit(oneToThree);\n        case \"SSS\":\n          return intUnit(three);\n        case \"u\":\n          return simple(oneToNine);\n        case \"uu\":\n          return simple(oneOrTwo);\n        case \"uuu\":\n          return intUnit(one);\n        // meridiem\n        case \"a\":\n          return oneOf(loc.meridiems(), 0);\n        // weekYear (k)\n        case \"kkkk\":\n          return intUnit(four);\n        case \"kk\":\n          return intUnit(twoToFour, untruncateYear);\n        // weekNumber (W)\n        case \"W\":\n          return intUnit(oneOrTwo);\n        case \"WW\":\n          return intUnit(two);\n        // weekdays\n        case \"E\":\n        case \"c\":\n          return intUnit(one);\n        case \"EEE\":\n          return oneOf(loc.weekdays(\"short\", false), 1);\n        case \"EEEE\":\n          return oneOf(loc.weekdays(\"long\", false), 1);\n        case \"ccc\":\n          return oneOf(loc.weekdays(\"short\", true), 1);\n        case \"cccc\":\n          return oneOf(loc.weekdays(\"long\", true), 1);\n        // offset/zone\n        case \"Z\":\n        case \"ZZ\":\n          return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n        case \"ZZZ\":\n          return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n        // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n        // because we don't have any way to figure out what they are\n        case \"z\":\n          return simple(/[a-z_+-/]{1,256}?/i);\n        // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n        // in this case we accept any non-newline white-space\n        case \" \":\n          return simple(/[^\\S\\n\\r]/);\n        default:\n          return literal(t);\n      }\n    };\n\n  const unit = unitate(token) || {\n    invalidReason: MISSING_FTP,\n  };\n\n  unit.token = token;\n\n  return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n  year: {\n    \"2-digit\": \"yy\",\n    numeric: \"yyyyy\",\n  },\n  month: {\n    numeric: \"M\",\n    \"2-digit\": \"MM\",\n    short: \"MMM\",\n    long: \"MMMM\",\n  },\n  day: {\n    numeric: \"d\",\n    \"2-digit\": \"dd\",\n  },\n  weekday: {\n    short: \"EEE\",\n    long: \"EEEE\",\n  },\n  dayperiod: \"a\",\n  dayPeriod: \"a\",\n  hour12: {\n    numeric: \"h\",\n    \"2-digit\": \"hh\",\n  },\n  hour24: {\n    numeric: \"H\",\n    \"2-digit\": \"HH\",\n  },\n  minute: {\n    numeric: \"m\",\n    \"2-digit\": \"mm\",\n  },\n  second: {\n    numeric: \"s\",\n    \"2-digit\": \"ss\",\n  },\n  timeZoneName: {\n    long: \"ZZZZZ\",\n    short: \"ZZZ\",\n  },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n  const { type, value } = part;\n\n  if (type === \"literal\") {\n    const isSpace = /^\\s+$/.test(value);\n    return {\n      literal: !isSpace,\n      val: isSpace ? \" \" : value,\n    };\n  }\n\n  const style = formatOpts[type];\n\n  // The user might have explicitly specified hour12 or hourCycle\n  // if so, respect their decision\n  // if not, refer back to the resolvedOpts, which are based on the locale\n  let actualType = type;\n  if (type === \"hour\") {\n    if (formatOpts.hour12 != null) {\n      actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n    } else if (formatOpts.hourCycle != null) {\n      if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n        actualType = \"hour12\";\n      } else {\n        actualType = \"hour24\";\n      }\n    } else {\n      // tokens only differentiate between 24 hours or not,\n      // so we do not need to check hourCycle here, which is less supported anyways\n      actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n    }\n  }\n  let val = partTypeStyleToTokenVal[actualType];\n  if (typeof val === \"object\") {\n    val = val[style];\n  }\n\n  if (val) {\n    return {\n      literal: false,\n      val,\n    };\n  }\n\n  return undefined;\n}\n\nfunction buildRegex(units) {\n  const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n  return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n  const matches = input.match(regex);\n\n  if (matches) {\n    const all = {};\n    let matchIndex = 1;\n    for (const i in handlers) {\n      if (hasOwnProperty(handlers, i)) {\n        const h = handlers[i],\n          groups = h.groups ? h.groups + 1 : 1;\n        if (!h.literal && h.token) {\n          all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n        }\n        matchIndex += groups;\n      }\n    }\n    return [matches, all];\n  } else {\n    return [matches, {}];\n  }\n}\n\nfunction dateTimeFromMatches(matches) {\n  const toField = (token) => {\n    switch (token) {\n      case \"S\":\n        return \"millisecond\";\n      case \"s\":\n        return \"second\";\n      case \"m\":\n        return \"minute\";\n      case \"h\":\n      case \"H\":\n        return \"hour\";\n      case \"d\":\n        return \"day\";\n      case \"o\":\n        return \"ordinal\";\n      case \"L\":\n      case \"M\":\n        return \"month\";\n      case \"y\":\n        return \"year\";\n      case \"E\":\n      case \"c\":\n        return \"weekday\";\n      case \"W\":\n        return \"weekNumber\";\n      case \"k\":\n        return \"weekYear\";\n      case \"q\":\n        return \"quarter\";\n      default:\n        return null;\n    }\n  };\n\n  let zone = null;\n  let specificOffset;\n  if (!isUndefined(matches.z)) {\n    zone = IANAZone.create(matches.z);\n  }\n\n  if (!isUndefined(matches.Z)) {\n    if (!zone) {\n      zone = new FixedOffsetZone(matches.Z);\n    }\n    specificOffset = matches.Z;\n  }\n\n  if (!isUndefined(matches.q)) {\n    matches.M = (matches.q - 1) * 3 + 1;\n  }\n\n  if (!isUndefined(matches.h)) {\n    if (matches.h < 12 && matches.a === 1) {\n      matches.h += 12;\n    } else if (matches.h === 12 && matches.a === 0) {\n      matches.h = 0;\n    }\n  }\n\n  if (matches.G === 0 && matches.y) {\n    matches.y = -matches.y;\n  }\n\n  if (!isUndefined(matches.u)) {\n    matches.S = parseMillis(matches.u);\n  }\n\n  const vals = Object.keys(matches).reduce((r, k) => {\n    const f = toField(k);\n    if (f) {\n      r[f] = matches[k];\n    }\n\n    return r;\n  }, {});\n\n  return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n  if (!dummyDateTimeCache) {\n    dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n  }\n\n  return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n  if (token.literal) {\n    return token;\n  }\n\n  const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n  const tokens = formatOptsToTokens(formatOpts, locale);\n\n  if (tokens == null || tokens.includes(undefined)) {\n    return token;\n  }\n\n  return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n  return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n  constructor(locale, format) {\n    this.locale = locale;\n    this.format = format;\n    this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n    this.units = this.tokens.map((t) => unitForToken(t, locale));\n    this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n    if (!this.disqualifyingUnit) {\n      const [regexString, handlers] = buildRegex(this.units);\n      this.regex = RegExp(regexString, \"i\");\n      this.handlers = handlers;\n    }\n  }\n\n  explainFromTokens(input) {\n    if (!this.isValid) {\n      return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n    } else {\n      const [rawMatches, matches] = match(input, this.regex, this.handlers),\n        [result, zone, specificOffset] = matches\n          ? dateTimeFromMatches(matches)\n          : [null, null, undefined];\n      if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n        throw new ConflictingSpecificationError(\n          \"Can't include meridiem when specifying 24-hour format\"\n        );\n      }\n      return {\n        input,\n        tokens: this.tokens,\n        regex: this.regex,\n        rawMatches,\n        matches,\n        result,\n        zone,\n        specificOffset,\n      };\n    }\n  }\n\n  get isValid() {\n    return !this.disqualifyingUnit;\n  }\n\n  get invalidReason() {\n    return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n  }\n}\n\nexport function explainFromTokens(locale, input, format) {\n  const parser = new TokenParser(locale, format);\n  return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n  const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n  return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n  if (!formatOpts) {\n    return null;\n  }\n\n  const formatter = Formatter.create(locale, formatOpts);\n  const df = formatter.dtFormatter(getDummyDateTime());\n  const parts = df.formatToParts();\n  const resolvedOpts = df.resolvedOptions();\n  return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n  isUndefined,\n  maybeArray,\n  isDate,\n  isNumber,\n  bestBy,\n  daysInMonth,\n  daysInYear,\n  isLeapYear,\n  weeksInWeekYear,\n  normalizeObject,\n  roundTo,\n  objToLocalTS,\n  padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n  parseFromTokens,\n  explainFromTokens,\n  formatOptsToTokens,\n  expandMacroTokens,\n  TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n  gregorianToWeek,\n  weekToGregorian,\n  gregorianToOrdinal,\n  ordinalToGregorian,\n  hasInvalidGregorianData,\n  hasInvalidWeekData,\n  hasInvalidOrdinalData,\n  hasInvalidTimeData,\n  usesLocalWeekValues,\n  isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n  InvalidArgumentError,\n  ConflictingSpecificationError,\n  InvalidUnitError,\n  InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n  return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n  if (dt.weekData === null) {\n    dt.weekData = gregorianToWeek(dt.c);\n  }\n  return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n  if (dt.localWeekData === null) {\n    dt.localWeekData = gregorianToWeek(\n      dt.c,\n      dt.loc.getMinDaysInFirstWeek(),\n      dt.loc.getStartOfWeek()\n    );\n  }\n  return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n  const current = {\n    ts: inst.ts,\n    zone: inst.zone,\n    c: inst.c,\n    o: inst.o,\n    loc: inst.loc,\n    invalid: inst.invalid,\n  };\n  return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n  // Our UTC time is just a guess because our offset is just a guess\n  let utcGuess = localTS - o * 60 * 1000;\n\n  // Test whether the zone matches the offset for this ts\n  const o2 = tz.offset(utcGuess);\n\n  // If so, offset didn't change and we're done\n  if (o === o2) {\n    return [utcGuess, o];\n  }\n\n  // If not, change the ts by the difference in the offset\n  utcGuess -= (o2 - o) * 60 * 1000;\n\n  // If that gives us the local time we want, we're done\n  const o3 = tz.offset(utcGuess);\n  if (o2 === o3) {\n    return [utcGuess, o2];\n  }\n\n  // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n  return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n  ts += offset * 60 * 1000;\n\n  const d = new Date(ts);\n\n  return {\n    year: d.getUTCFullYear(),\n    month: d.getUTCMonth() + 1,\n    day: d.getUTCDate(),\n    hour: d.getUTCHours(),\n    minute: d.getUTCMinutes(),\n    second: d.getUTCSeconds(),\n    millisecond: d.getUTCMilliseconds(),\n  };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n  return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n  const oPre = inst.o,\n    year = inst.c.year + Math.trunc(dur.years),\n    month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n    c = {\n      ...inst.c,\n      year,\n      month,\n      day:\n        Math.min(inst.c.day, daysInMonth(year, month)) +\n        Math.trunc(dur.days) +\n        Math.trunc(dur.weeks) * 7,\n    },\n    millisToAdd = Duration.fromObject({\n      years: dur.years - Math.trunc(dur.years),\n      quarters: dur.quarters - Math.trunc(dur.quarters),\n      months: dur.months - Math.trunc(dur.months),\n      weeks: dur.weeks - Math.trunc(dur.weeks),\n      days: dur.days - Math.trunc(dur.days),\n      hours: dur.hours,\n      minutes: dur.minutes,\n      seconds: dur.seconds,\n      milliseconds: dur.milliseconds,\n    }).as(\"milliseconds\"),\n    localTS = objToLocalTS(c);\n\n  let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n  if (millisToAdd !== 0) {\n    ts += millisToAdd;\n    // that could have changed the offset by going over a DST, but we want to keep the ts the same\n    o = inst.zone.offset(ts);\n  }\n\n  return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n  const { setZone, zone } = opts;\n  if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n    const interpretationZone = parsedZone || zone,\n      inst = DateTime.fromObject(parsed, {\n        ...opts,\n        zone: interpretationZone,\n        specificOffset,\n      });\n    return setZone ? inst : inst.setZone(zone);\n  } else {\n    return DateTime.invalid(\n      new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n    );\n  }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n  return dt.isValid\n    ? Formatter.create(Locale.create(\"en-US\"), {\n        allowZ,\n        forceSimple: true,\n      }).formatDateTimeFromString(dt, format)\n    : null;\n}\n\nfunction toISODate(o, extended, precision) {\n  const longFormat = o.c.year > 9999 || o.c.year < 0;\n  let c = \"\";\n  if (longFormat && o.c.year >= 0) c += \"+\";\n  c += padStart(o.c.year, longFormat ? 6 : 4);\n  if (precision === \"year\") return c;\n  if (extended) {\n    c += \"-\";\n    c += padStart(o.c.month);\n    if (precision === \"month\") return c;\n    c += \"-\";\n  } else {\n    c += padStart(o.c.month);\n    if (precision === \"month\") return c;\n  }\n  c += padStart(o.c.day);\n  return c;\n}\n\nfunction toISOTime(\n  o,\n  extended,\n  suppressSeconds,\n  suppressMilliseconds,\n  includeOffset,\n  extendedZone,\n  precision\n) {\n  let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n    c = \"\";\n  switch (precision) {\n    case \"day\":\n    case \"month\":\n    case \"year\":\n      break;\n    default:\n      c += padStart(o.c.hour);\n      if (precision === \"hour\") break;\n      if (extended) {\n        c += \":\";\n        c += padStart(o.c.minute);\n        if (precision === \"minute\") break;\n        if (showSeconds) {\n          c += \":\";\n          c += padStart(o.c.second);\n        }\n      } else {\n        c += padStart(o.c.minute);\n        if (precision === \"minute\") break;\n        if (showSeconds) {\n          c += padStart(o.c.second);\n        }\n      }\n      if (precision === \"second\") break;\n      if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n        c += \".\";\n        c += padStart(o.c.millisecond, 3);\n      }\n  }\n\n  if (includeOffset) {\n    if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n      c += \"Z\";\n    } else if (o.o < 0) {\n      c += \"-\";\n      c += padStart(Math.trunc(-o.o / 60));\n      c += \":\";\n      c += padStart(Math.trunc(-o.o % 60));\n    } else {\n      c += \"+\";\n      c += padStart(Math.trunc(o.o / 60));\n      c += \":\";\n      c += padStart(Math.trunc(o.o % 60));\n    }\n  }\n\n  if (extendedZone) {\n    c += \"[\" + o.zone.ianaName + \"]\";\n  }\n  return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n    month: 1,\n    day: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  },\n  defaultWeekUnitValues = {\n    weekNumber: 1,\n    weekday: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  },\n  defaultOrdinalUnitValues = {\n    ordinal: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n  orderedWeekUnits = [\n    \"weekYear\",\n    \"weekNumber\",\n    \"weekday\",\n    \"hour\",\n    \"minute\",\n    \"second\",\n    \"millisecond\",\n  ],\n  orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n  const normalized = {\n    year: \"year\",\n    years: \"year\",\n    month: \"month\",\n    months: \"month\",\n    day: \"day\",\n    days: \"day\",\n    hour: \"hour\",\n    hours: \"hour\",\n    minute: \"minute\",\n    minutes: \"minute\",\n    quarter: \"quarter\",\n    quarters: \"quarter\",\n    second: \"second\",\n    seconds: \"second\",\n    millisecond: \"millisecond\",\n    milliseconds: \"millisecond\",\n    weekday: \"weekday\",\n    weekdays: \"weekday\",\n    weeknumber: \"weekNumber\",\n    weeksnumber: \"weekNumber\",\n    weeknumbers: \"weekNumber\",\n    weekyear: \"weekYear\",\n    weekyears: \"weekYear\",\n    ordinal: \"ordinal\",\n  }[unit.toLowerCase()];\n\n  if (!normalized) throw new InvalidUnitError(unit);\n\n  return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n  switch (unit.toLowerCase()) {\n    case \"localweekday\":\n    case \"localweekdays\":\n      return \"localWeekday\";\n    case \"localweeknumber\":\n    case \"localweeknumbers\":\n      return \"localWeekNumber\";\n    case \"localweekyear\":\n    case \"localweekyears\":\n      return \"localWeekYear\";\n    default:\n      return normalizeUnit(unit);\n  }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n  if (zoneOffsetTs === undefined) {\n    zoneOffsetTs = Settings.now();\n  }\n\n  // Do not cache anything but IANA zones, because it is not safe to do so.\n  // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n  if (zone.type !== \"iana\") {\n    return zone.offset(zoneOffsetTs);\n  }\n  const zoneName = zone.name;\n  let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n  if (offsetGuess === undefined) {\n    offsetGuess = zone.offset(zoneOffsetTs);\n    zoneOffsetGuessCache.set(zoneName, offsetGuess);\n  }\n  return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n  const zone = normalizeZone(opts.zone, Settings.defaultZone);\n  if (!zone.isValid) {\n    return DateTime.invalid(unsupportedZone(zone));\n  }\n\n  const loc = Locale.fromObject(opts);\n\n  let ts, o;\n\n  // assume we have the higher-order units\n  if (!isUndefined(obj.year)) {\n    for (const u of orderedUnits) {\n      if (isUndefined(obj[u])) {\n        obj[u] = defaultUnitValues[u];\n      }\n    }\n\n    const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    }\n\n    const offsetProvis = guessOffsetForZone(zone);\n    [ts, o] = objToTS(obj, offsetProvis, zone);\n  } else {\n    ts = Settings.now();\n  }\n\n  return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n  const round = isUndefined(opts.round) ? true : opts.round,\n    rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n    format = (c, unit) => {\n      c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n      const formatter = end.loc.clone(opts).relFormatter(opts);\n      return formatter.format(c, unit);\n    },\n    differ = (unit) => {\n      if (opts.calendary) {\n        if (!end.hasSame(start, unit)) {\n          return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n        } else return 0;\n      } else {\n        return end.diff(start, unit).get(unit);\n      }\n    };\n\n  if (opts.unit) {\n    return format(differ(opts.unit), opts.unit);\n  }\n\n  for (const unit of opts.units) {\n    const count = differ(unit);\n    if (Math.abs(count) >= 1) {\n      return format(count, unit);\n    }\n  }\n  return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n  let opts = {},\n    args;\n  if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n    opts = argList[argList.length - 1];\n    args = Array.from(argList).slice(0, argList.length - 1);\n  } else {\n    args = Array.from(argList);\n  }\n  return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n  /**\n   * @access private\n   */\n  constructor(config) {\n    const zone = config.zone || Settings.defaultZone;\n\n    let invalid =\n      config.invalid ||\n      (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n      (!zone.isValid ? unsupportedZone(zone) : null);\n    /**\n     * @access private\n     */\n    this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n    let c = null,\n      o = null;\n    if (!invalid) {\n      const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n      if (unchanged) {\n        [c, o] = [config.old.c, config.old.o];\n      } else {\n        // If an offset has been passed and we have not been called from\n        // clone(), we can trust it and avoid the offset calculation.\n        const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n        c = tsToObj(this.ts, ot);\n        invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n        c = invalid ? null : c;\n        o = invalid ? null : ot;\n      }\n    }\n\n    /**\n     * @access private\n     */\n    this._zone = zone;\n    /**\n     * @access private\n     */\n    this.loc = config.loc || Locale.create();\n    /**\n     * @access private\n     */\n    this.invalid = invalid;\n    /**\n     * @access private\n     */\n    this.weekData = null;\n    /**\n     * @access private\n     */\n    this.localWeekData = null;\n    /**\n     * @access private\n     */\n    this.c = c;\n    /**\n     * @access private\n     */\n    this.o = o;\n    /**\n     * @access private\n     */\n    this.isLuxonDateTime = true;\n  }\n\n  // CONSTRUCT\n\n  /**\n   * Create a DateTime for the current instant, in the system's time zone.\n   *\n   * Use Settings to override these default values if needed.\n   * @example DateTime.now().toISO() //~> now in the ISO format\n   * @return {DateTime}\n   */\n  static now() {\n    return new DateTime({});\n  }\n\n  /**\n   * Create a local DateTime\n   * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n   * @param {number} [month=1] - The month, 1-indexed\n   * @param {number} [day=1] - The day of the month, 1-indexed\n   * @param {number} [hour=0] - The hour of the day, in 24-hour time\n   * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n   * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n   * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n   * @example DateTime.local()                                  //~> now\n   * @example DateTime.local({ zone: \"America/New_York\" })      //~> now, in US east coast time\n   * @example DateTime.local(2017)                              //~> 2017-01-01T00:00:00\n   * @example DateTime.local(2017, 3)                           //~> 2017-03-01T00:00:00\n   * @example DateTime.local(2017, 3, 12, { locale: \"fr\" })     //~> 2017-03-12T00:00:00, with a French locale\n   * @example DateTime.local(2017, 3, 12, 5)                    //~> 2017-03-12T05:00:00\n   * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" })   //~> 2017-03-12T05:00:00, in UTC\n   * @example DateTime.local(2017, 3, 12, 5, 45)                //~> 2017-03-12T05:45:00\n   * @example DateTime.local(2017, 3, 12, 5, 45, 10)            //~> 2017-03-12T05:45:10\n   * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765)       //~> 2017-03-12T05:45:10.765\n   * @return {DateTime}\n   */\n  static local() {\n    const [opts, args] = lastOpts(arguments),\n      [year, month, day, hour, minute, second, millisecond] = args;\n    return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n  }\n\n  /**\n   * Create a DateTime in UTC\n   * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n   * @param {number} [month=1] - The month, 1-indexed\n   * @param {number} [day=1] - The day of the month\n   * @param {number} [hour=0] - The hour of the day, in 24-hour time\n   * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n   * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n   * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n   * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n   * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n   * @example DateTime.utc()                                              //~> now\n   * @example DateTime.utc(2017)                                          //~> 2017-01-01T00:00:00Z\n   * @example DateTime.utc(2017, 3)                                       //~> 2017-03-01T00:00:00Z\n   * @example DateTime.utc(2017, 3, 12)                                   //~> 2017-03-12T00:00:00Z\n   * @example DateTime.utc(2017, 3, 12, 5)                                //~> 2017-03-12T05:00:00Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45)                            //~> 2017-03-12T05:45:00Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" })          //~> 2017-03-12T05:45:00Z with a French locale\n   * @example DateTime.utc(2017, 3, 12, 5, 45, 10)                        //~> 2017-03-12T05:45:10Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n   * @return {DateTime}\n   */\n  static utc() {\n    const [opts, args] = lastOpts(arguments),\n      [year, month, day, hour, minute, second, millisecond] = args;\n\n    opts.zone = FixedOffsetZone.utcInstance;\n    return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n  }\n\n  /**\n   * Create a DateTime from a JavaScript Date object. Uses the default zone.\n   * @param {Date} date - a JavaScript Date object\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @return {DateTime}\n   */\n  static fromJSDate(date, options = {}) {\n    const ts = isDate(date) ? date.valueOf() : NaN;\n    if (Number.isNaN(ts)) {\n      return DateTime.invalid(\"invalid input\");\n    }\n\n    const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n    if (!zoneToUse.isValid) {\n      return DateTime.invalid(unsupportedZone(zoneToUse));\n    }\n\n    return new DateTime({\n      ts: ts,\n      zone: zoneToUse,\n      loc: Locale.fromObject(options),\n    });\n  }\n\n  /**\n   * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n   * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromMillis(milliseconds, options = {}) {\n    if (!isNumber(milliseconds)) {\n      throw new InvalidArgumentError(\n        `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n      );\n    } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n      // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n      return DateTime.invalid(\"Timestamp out of range\");\n    } else {\n      return new DateTime({\n        ts: milliseconds,\n        zone: normalizeZone(options.zone, Settings.defaultZone),\n        loc: Locale.fromObject(options),\n      });\n    }\n  }\n\n  /**\n   * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n   * @param {number} seconds - a number of seconds since 1970 UTC\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromSeconds(seconds, options = {}) {\n    if (!isNumber(seconds)) {\n      throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n    } else {\n      return new DateTime({\n        ts: seconds * 1000,\n        zone: normalizeZone(options.zone, Settings.defaultZone),\n        loc: Locale.fromObject(options),\n      });\n    }\n  }\n\n  /**\n   * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n   * @param {Object} obj - the object to create the DateTime from\n   * @param {number} obj.year - a year, such as 1987\n   * @param {number} obj.month - a month, 1-12\n   * @param {number} obj.day - a day of the month, 1-31, depending on the month\n   * @param {number} obj.ordinal - day of the year, 1-365 or 366\n   * @param {number} obj.weekYear - an ISO week year\n   * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n   * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n   * @param {number} obj.localWeekYear - a week year, according to the locale\n   * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n   * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n   * @param {number} obj.hour - hour of the day, 0-23\n   * @param {number} obj.minute - minute of the hour, 0-59\n   * @param {number} obj.second - second of the minute, 0-59\n   * @param {number} obj.millisecond - millisecond of the second, 0-999\n   * @param {Object} opts - options for creating this DateTime\n   * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n   * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n   * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n   * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n   * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n   * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n   * @return {DateTime}\n   */\n  static fromObject(obj, opts = {}) {\n    obj = obj || {};\n    const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n    if (!zoneToUse.isValid) {\n      return DateTime.invalid(unsupportedZone(zoneToUse));\n    }\n\n    const loc = Locale.fromObject(opts);\n    const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n    const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n    const tsNow = Settings.now(),\n      offsetProvis = !isUndefined(opts.specificOffset)\n        ? opts.specificOffset\n        : zoneToUse.offset(tsNow),\n      containsOrdinal = !isUndefined(normalized.ordinal),\n      containsGregorYear = !isUndefined(normalized.year),\n      containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n      containsGregor = containsGregorYear || containsGregorMD,\n      definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n    // cases:\n    // just a weekday -> this week's instance of that weekday, no worries\n    // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n    // (gregorian month or day) + ordinal -> error\n    // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n    if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n      throw new ConflictingSpecificationError(\n        \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n      );\n    }\n\n    if (containsGregorMD && containsOrdinal) {\n      throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n    }\n\n    const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n    // configure ourselves to deal with gregorian dates or week stuff\n    let units,\n      defaultValues,\n      objNow = tsToObj(tsNow, offsetProvis);\n    if (useWeekData) {\n      units = orderedWeekUnits;\n      defaultValues = defaultWeekUnitValues;\n      objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n    } else if (containsOrdinal) {\n      units = orderedOrdinalUnits;\n      defaultValues = defaultOrdinalUnitValues;\n      objNow = gregorianToOrdinal(objNow);\n    } else {\n      units = orderedUnits;\n      defaultValues = defaultUnitValues;\n    }\n\n    // set default values for missing stuff\n    let foundFirst = false;\n    for (const u of units) {\n      const v = normalized[u];\n      if (!isUndefined(v)) {\n        foundFirst = true;\n      } else if (foundFirst) {\n        normalized[u] = defaultValues[u];\n      } else {\n        normalized[u] = objNow[u];\n      }\n    }\n\n    // make sure the values we have are in range\n    const higherOrderInvalid = useWeekData\n        ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n        : containsOrdinal\n        ? hasInvalidOrdinalData(normalized)\n        : hasInvalidGregorianData(normalized),\n      invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    }\n\n    // compute the actual time\n    const gregorian = useWeekData\n        ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n        : containsOrdinal\n        ? ordinalToGregorian(normalized)\n        : normalized,\n      [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n      inst = new DateTime({\n        ts: tsFinal,\n        zone: zoneToUse,\n        o: offsetFinal,\n        loc,\n      });\n\n    // gregorian data + weekday serves only to validate\n    if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n      return DateTime.invalid(\n        \"mismatched weekday\",\n        `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n      );\n    }\n\n    if (!inst.isValid) {\n      return DateTime.invalid(inst.invalid);\n    }\n\n    return inst;\n  }\n\n  /**\n   * Create a DateTime from an ISO 8601 string\n   * @param {string} text - the ISO string\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n   * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n   * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n   * @example DateTime.fromISO('2016-W05-4')\n   * @return {DateTime}\n   */\n  static fromISO(text, opts = {}) {\n    const [vals, parsedZone] = parseISODate(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n  }\n\n  /**\n   * Create a DateTime from an RFC 2822 string\n   * @param {string} text - the RFC 2822 string\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n   * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n   * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n   * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n   * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n   * @return {DateTime}\n   */\n  static fromRFC2822(text, opts = {}) {\n    const [vals, parsedZone] = parseRFC2822Date(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n  }\n\n  /**\n   * Create a DateTime from an HTTP header date\n   * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n   * @param {string} text - the HTTP header date\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n   * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n   * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n   * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n   * @example DateTime.fromHTTP('Sun Nov  6 08:49:37 1994')\n   * @return {DateTime}\n   */\n  static fromHTTP(text, opts = {}) {\n    const [vals, parsedZone] = parseHTTPDate(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n  }\n\n  /**\n   * Create a DateTime from an input string and format string.\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n   * @param {string} text - the string to parse\n   * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n   * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n   * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromFormat(text, fmt, opts = {}) {\n    if (isUndefined(text) || isUndefined(fmt)) {\n      throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n    }\n\n    const { locale = null, numberingSystem = null } = opts,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      }),\n      [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    } else {\n      return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n    }\n  }\n\n  /**\n   * @deprecated use fromFormat instead\n   */\n  static fromString(text, fmt, opts = {}) {\n    return DateTime.fromFormat(text, fmt, opts);\n  }\n\n  /**\n   * Create a DateTime from a SQL date, time, or datetime\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale\n   * @param {string} text - the string to parse\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n   * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n   * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @example DateTime.fromSQL('2017-05-15')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n   * @example DateTime.fromSQL('09:12:34.342')\n   * @return {DateTime}\n   */\n  static fromSQL(text, opts = {}) {\n    const [vals, parsedZone] = parseSQL(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n  }\n\n  /**\n   * Create an invalid DateTime.\n   * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {DateTime}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidDateTimeError(invalid);\n    } else {\n      return new DateTime({ invalid });\n    }\n  }\n\n  /**\n   * Check if an object is an instance of DateTime. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isDateTime(o) {\n    return (o && o.isLuxonDateTime) || false;\n  }\n\n  /**\n   * Produce the format string for a set of options\n   * @param formatOpts\n   * @param localeOpts\n   * @returns {string}\n   */\n  static parseFormatForOpts(formatOpts, localeOpts = {}) {\n    const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n    return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n  }\n\n  /**\n   * Produce the the fully expanded format token for the locale\n   * Does NOT quote characters, so quoted tokens will not round trip correctly\n   * @param fmt\n   * @param localeOpts\n   * @returns {string}\n   */\n  static expandFormat(fmt, localeOpts = {}) {\n    const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n    return expanded.map((t) => t.val).join(\"\");\n  }\n\n  static resetCache() {\n    zoneOffsetTs = undefined;\n    zoneOffsetGuessCache.clear();\n  }\n\n  // INFO\n\n  /**\n   * Get the value of unit.\n   * @param {string} unit - a unit such as 'minute' or 'day'\n   * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n   * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n   * @return {number}\n   */\n  get(unit) {\n    return this[unit];\n  }\n\n  /**\n   * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n   * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n   * * The DateTime was created by an operation on another invalid date\n   * @type {boolean}\n   */\n  get isValid() {\n    return this.invalid === null;\n  }\n\n  /**\n   * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n   * @type {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get locale() {\n    return this.isValid ? this.loc.locale : null;\n  }\n\n  /**\n   * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get numberingSystem() {\n    return this.isValid ? this.loc.numberingSystem : null;\n  }\n\n  /**\n   * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get outputCalendar() {\n    return this.isValid ? this.loc.outputCalendar : null;\n  }\n\n  /**\n   * Get the time zone associated with this DateTime.\n   * @type {Zone}\n   */\n  get zone() {\n    return this._zone;\n  }\n\n  /**\n   * Get the name of the time zone.\n   * @type {string}\n   */\n  get zoneName() {\n    return this.isValid ? this.zone.name : null;\n  }\n\n  /**\n   * Get the year\n   * @example DateTime.local(2017, 5, 25).year //=> 2017\n   * @type {number}\n   */\n  get year() {\n    return this.isValid ? this.c.year : NaN;\n  }\n\n  /**\n   * Get the quarter\n   * @example DateTime.local(2017, 5, 25).quarter //=> 2\n   * @type {number}\n   */\n  get quarter() {\n    return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n  }\n\n  /**\n   * Get the month (1-12).\n   * @example DateTime.local(2017, 5, 25).month //=> 5\n   * @type {number}\n   */\n  get month() {\n    return this.isValid ? this.c.month : NaN;\n  }\n\n  /**\n   * Get the day of the month (1-30ish).\n   * @example DateTime.local(2017, 5, 25).day //=> 25\n   * @type {number}\n   */\n  get day() {\n    return this.isValid ? this.c.day : NaN;\n  }\n\n  /**\n   * Get the hour of the day (0-23).\n   * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n   * @type {number}\n   */\n  get hour() {\n    return this.isValid ? this.c.hour : NaN;\n  }\n\n  /**\n   * Get the minute of the hour (0-59).\n   * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n   * @type {number}\n   */\n  get minute() {\n    return this.isValid ? this.c.minute : NaN;\n  }\n\n  /**\n   * Get the second of the minute (0-59).\n   * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n   * @type {number}\n   */\n  get second() {\n    return this.isValid ? this.c.second : NaN;\n  }\n\n  /**\n   * Get the millisecond of the second (0-999).\n   * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n   * @type {number}\n   */\n  get millisecond() {\n    return this.isValid ? this.c.millisecond : NaN;\n  }\n\n  /**\n   * Get the week year\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n   * @type {number}\n   */\n  get weekYear() {\n    return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n  }\n\n  /**\n   * Get the week number of the week year (1-52ish).\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n   * @type {number}\n   */\n  get weekNumber() {\n    return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n  }\n\n  /**\n   * Get the day of the week.\n   * 1 is Monday and 7 is Sunday\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2014, 11, 31).weekday //=> 4\n   * @type {number}\n   */\n  get weekday() {\n    return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n  }\n\n  /**\n   * Returns true if this date is on a weekend according to the locale, false otherwise\n   * @returns {boolean}\n   */\n  get isWeekend() {\n    return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n  }\n\n  /**\n   * Get the day of the week according to the locale.\n   * 1 is the first day of the week and 7 is the last day of the week.\n   * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n   * @returns {number}\n   */\n  get localWeekday() {\n    return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n  }\n\n  /**\n   * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n   * because the week can start on different days of the week (see localWeekday) and because a different number of days\n   * is required for a week to count as the first week of a year.\n   * @returns {number}\n   */\n  get localWeekNumber() {\n    return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n  }\n\n  /**\n   * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n   * differently, see localWeekNumber.\n   * @returns {number}\n   */\n  get localWeekYear() {\n    return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n  }\n\n  /**\n   * Get the ordinal (meaning the day of the year)\n   * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n   * @type {number|DateTime}\n   */\n  get ordinal() {\n    return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n  }\n\n  /**\n   * Get the human readable short month name, such as 'Oct'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n   * @type {string}\n   */\n  get monthShort() {\n    return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n  }\n\n  /**\n   * Get the human readable long month name, such as 'October'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).monthLong //=> October\n   * @type {string}\n   */\n  get monthLong() {\n    return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n  }\n\n  /**\n   * Get the human readable short weekday, such as 'Mon'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n   * @type {string}\n   */\n  get weekdayShort() {\n    return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n  }\n\n  /**\n   * Get the human readable long weekday, such as 'Monday'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n   * @type {string}\n   */\n  get weekdayLong() {\n    return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n  }\n\n  /**\n   * Get the UTC offset of this DateTime in minutes\n   * @example DateTime.now().offset //=> -240\n   * @example DateTime.utc().offset //=> 0\n   * @type {number}\n   */\n  get offset() {\n    return this.isValid ? +this.o : NaN;\n  }\n\n  /**\n   * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n   * Defaults to the system's locale if no locale has been specified\n   * @type {string}\n   */\n  get offsetNameShort() {\n    if (this.isValid) {\n      return this.zone.offsetName(this.ts, {\n        format: \"short\",\n        locale: this.locale,\n      });\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n   * Defaults to the system's locale if no locale has been specified\n   * @type {string}\n   */\n  get offsetNameLong() {\n    if (this.isValid) {\n      return this.zone.offsetName(this.ts, {\n        format: \"long\",\n        locale: this.locale,\n      });\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Get whether this zone's offset ever changes, as in a DST.\n   * @type {boolean}\n   */\n  get isOffsetFixed() {\n    return this.isValid ? this.zone.isUniversal : null;\n  }\n\n  /**\n   * Get whether the DateTime is in a DST.\n   * @type {boolean}\n   */\n  get isInDST() {\n    if (this.isOffsetFixed) {\n      return false;\n    } else {\n      return (\n        this.offset > this.set({ month: 1, day: 1 }).offset ||\n        this.offset > this.set({ month: 5 }).offset\n      );\n    }\n  }\n\n  /**\n   * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n   * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n   * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n   * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n   * @returns {DateTime[]}\n   */\n  getPossibleOffsets() {\n    if (!this.isValid || this.isOffsetFixed) {\n      return [this];\n    }\n    const dayMs = 86400000;\n    const minuteMs = 60000;\n    const localTS = objToLocalTS(this.c);\n    const oEarlier = this.zone.offset(localTS - dayMs);\n    const oLater = this.zone.offset(localTS + dayMs);\n\n    const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n    const o2 = this.zone.offset(localTS - oLater * minuteMs);\n    if (o1 === o2) {\n      return [this];\n    }\n    const ts1 = localTS - o1 * minuteMs;\n    const ts2 = localTS - o2 * minuteMs;\n    const c1 = tsToObj(ts1, o1);\n    const c2 = tsToObj(ts2, o2);\n    if (\n      c1.hour === c2.hour &&\n      c1.minute === c2.minute &&\n      c1.second === c2.second &&\n      c1.millisecond === c2.millisecond\n    ) {\n      return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n    }\n    return [this];\n  }\n\n  /**\n   * Returns true if this DateTime is in a leap year, false otherwise\n   * @example DateTime.local(2016).isInLeapYear //=> true\n   * @example DateTime.local(2013).isInLeapYear //=> false\n   * @type {boolean}\n   */\n  get isInLeapYear() {\n    return isLeapYear(this.year);\n  }\n\n  /**\n   * Returns the number of days in this DateTime's month\n   * @example DateTime.local(2016, 2).daysInMonth //=> 29\n   * @example DateTime.local(2016, 3).daysInMonth //=> 31\n   * @type {number}\n   */\n  get daysInMonth() {\n    return daysInMonth(this.year, this.month);\n  }\n\n  /**\n   * Returns the number of days in this DateTime's year\n   * @example DateTime.local(2016).daysInYear //=> 366\n   * @example DateTime.local(2013).daysInYear //=> 365\n   * @type {number}\n   */\n  get daysInYear() {\n    return this.isValid ? daysInYear(this.year) : NaN;\n  }\n\n  /**\n   * Returns the number of weeks in this DateTime's year\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2004).weeksInWeekYear //=> 53\n   * @example DateTime.local(2013).weeksInWeekYear //=> 52\n   * @type {number}\n   */\n  get weeksInWeekYear() {\n    return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n  }\n\n  /**\n   * Returns the number of weeks in this DateTime's local week year\n   * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n   * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n   * @type {number}\n   */\n  get weeksInLocalWeekYear() {\n    return this.isValid\n      ? weeksInWeekYear(\n          this.localWeekYear,\n          this.loc.getMinDaysInFirstWeek(),\n          this.loc.getStartOfWeek()\n        )\n      : NaN;\n  }\n\n  /**\n   * Returns the resolved Intl options for this DateTime.\n   * This is useful in understanding the behavior of formatting methods\n   * @param {Object} opts - the same options as toLocaleString\n   * @return {Object}\n   */\n  resolvedLocaleOptions(opts = {}) {\n    const { locale, numberingSystem, calendar } = Formatter.create(\n      this.loc.clone(opts),\n      opts\n    ).resolvedOptions(this);\n    return { locale, numberingSystem, outputCalendar: calendar };\n  }\n\n  // TRANSFORM\n\n  /**\n   * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n   *\n   * Equivalent to {@link DateTime#setZone}('utc')\n   * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n   * @param {Object} [opts={}] - options to pass to `setZone()`\n   * @return {DateTime}\n   */\n  toUTC(offset = 0, opts = {}) {\n    return this.setZone(FixedOffsetZone.instance(offset), opts);\n  }\n\n  /**\n   * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n   *\n   * Equivalent to `setZone('local')`\n   * @return {DateTime}\n   */\n  toLocal() {\n    return this.setZone(Settings.defaultZone);\n  }\n\n  /**\n   * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n   *\n   * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n   * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n   * @return {DateTime}\n   */\n  setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n    zone = normalizeZone(zone, Settings.defaultZone);\n    if (zone.equals(this.zone)) {\n      return this;\n    } else if (!zone.isValid) {\n      return DateTime.invalid(unsupportedZone(zone));\n    } else {\n      let newTS = this.ts;\n      if (keepLocalTime || keepCalendarTime) {\n        const offsetGuess = zone.offset(this.ts);\n        const asObj = this.toObject();\n        [newTS] = objToTS(asObj, offsetGuess, zone);\n      }\n      return clone(this, { ts: newTS, zone });\n    }\n  }\n\n  /**\n   * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n   * @param {Object} properties - the properties to set\n   * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n   * @return {DateTime}\n   */\n  reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n    const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n    return clone(this, { loc });\n  }\n\n  /**\n   * \"Set\" the locale. Returns a newly-constructed DateTime.\n   * Just a convenient alias for reconfigure({ locale })\n   * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n   * @return {DateTime}\n   */\n  setLocale(locale) {\n    return this.reconfigure({ locale });\n  }\n\n  /**\n   * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n   * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n   *\n   * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n   * They cannot be mixed with ISO-week units like `weekday`.\n   * @param {Object} values - a mapping of units to numbers\n   * @example dt.set({ year: 2017 })\n   * @example dt.set({ hour: 8, minute: 30 })\n   * @example dt.set({ weekday: 5 })\n   * @example dt.set({ year: 2005, ordinal: 234 })\n   * @return {DateTime}\n   */\n  set(values) {\n    if (!this.isValid) return this;\n\n    const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n    const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n    const settingWeekStuff =\n        !isUndefined(normalized.weekYear) ||\n        !isUndefined(normalized.weekNumber) ||\n        !isUndefined(normalized.weekday),\n      containsOrdinal = !isUndefined(normalized.ordinal),\n      containsGregorYear = !isUndefined(normalized.year),\n      containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n      containsGregor = containsGregorYear || containsGregorMD,\n      definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n    if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n      throw new ConflictingSpecificationError(\n        \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n      );\n    }\n\n    if (containsGregorMD && containsOrdinal) {\n      throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n    }\n\n    let mixed;\n    if (settingWeekStuff) {\n      mixed = weekToGregorian(\n        { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n        minDaysInFirstWeek,\n        startOfWeek\n      );\n    } else if (!isUndefined(normalized.ordinal)) {\n      mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n    } else {\n      mixed = { ...this.toObject(), ...normalized };\n\n      // if we didn't set the day but we ended up on an overflow date,\n      // use the last day of the right month\n      if (isUndefined(normalized.day)) {\n        mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n      }\n    }\n\n    const [ts, o] = objToTS(mixed, this.o, this.zone);\n    return clone(this, { ts, o });\n  }\n\n  /**\n   * Add a period of time to this DateTime and return the resulting DateTime\n   *\n   * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n   * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @example DateTime.now().plus(123) //~> in 123 milliseconds\n   * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n   * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n   * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n   * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n   * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n   * @return {DateTime}\n   */\n  plus(duration) {\n    if (!this.isValid) return this;\n    const dur = Duration.fromDurationLike(duration);\n    return clone(this, adjustTime(this, dur));\n  }\n\n  /**\n   * Subtract a period of time to this DateTime and return the resulting DateTime\n   * See {@link DateTime#plus}\n   * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   @return {DateTime}\n   */\n  minus(duration) {\n    if (!this.isValid) return this;\n    const dur = Duration.fromDurationLike(duration).negate();\n    return clone(this, adjustTime(this, dur));\n  }\n\n  /**\n   * \"Set\" this DateTime to the beginning of a unit of time.\n   * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n   * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n   * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n   * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n   * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n   * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n   * @return {DateTime}\n   */\n  startOf(unit, { useLocaleWeeks = false } = {}) {\n    if (!this.isValid) return this;\n\n    const o = {},\n      normalizedUnit = Duration.normalizeUnit(unit);\n    switch (normalizedUnit) {\n      case \"years\":\n        o.month = 1;\n      // falls through\n      case \"quarters\":\n      case \"months\":\n        o.day = 1;\n      // falls through\n      case \"weeks\":\n      case \"days\":\n        o.hour = 0;\n      // falls through\n      case \"hours\":\n        o.minute = 0;\n      // falls through\n      case \"minutes\":\n        o.second = 0;\n      // falls through\n      case \"seconds\":\n        o.millisecond = 0;\n        break;\n      case \"milliseconds\":\n        break;\n      // no default, invalid units throw in normalizeUnit()\n    }\n\n    if (normalizedUnit === \"weeks\") {\n      if (useLocaleWeeks) {\n        const startOfWeek = this.loc.getStartOfWeek();\n        const { weekday } = this;\n        if (weekday < startOfWeek) {\n          o.weekNumber = this.weekNumber - 1;\n        }\n        o.weekday = startOfWeek;\n      } else {\n        o.weekday = 1;\n      }\n    }\n\n    if (normalizedUnit === \"quarters\") {\n      const q = Math.ceil(this.month / 3);\n      o.month = (q - 1) * 3 + 1;\n    }\n\n    return this.set(o);\n  }\n\n  /**\n   * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n   * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n   * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n   * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n   * @return {DateTime}\n   */\n  endOf(unit, opts) {\n    return this.isValid\n      ? this.plus({ [unit]: 1 })\n          .startOf(unit, opts)\n          .minus(1)\n      : this;\n  }\n\n  // OUTPUT\n\n  /**\n   * Returns a string representation of this DateTime formatted according to the specified format string.\n   * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n   * @param {string} fmt - the format string\n   * @param {Object} opts - opts to override the configuration options on this DateTime\n   * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n   * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n   * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n   * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n   * @return {string}\n   */\n  toFormat(fmt, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n      : INVALID;\n  }\n\n  /**\n   * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n   * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n   * of the DateTime in the assigned locale.\n   * Defaults to the system's locale if no locale has been specified\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n   * @param {Object} opts - opts to override the configuration options on this DateTime\n   * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n   * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n   * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n   * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n   * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n   * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n   * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n   * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n   * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n   * @return {string}\n   */\n  toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n      : INVALID;\n  }\n\n  /**\n   * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n   * Defaults to the system's locale if no locale has been specified\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n   * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n   * @example DateTime.now().toLocaleParts(); //=> [\n   *                                   //=>   { type: 'day', value: '25' },\n   *                                   //=>   { type: 'literal', value: '/' },\n   *                                   //=>   { type: 'month', value: '05' },\n   *                                   //=>   { type: 'literal', value: '/' },\n   *                                   //=>   { type: 'year', value: '1982' }\n   *                                   //=> ]\n   */\n  toLocaleParts(opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n      : [];\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n   * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n   * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n   * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n   * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n   * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n   * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n   * @return {string|null}\n   */\n  toISO({\n    format = \"extended\",\n    suppressSeconds = false,\n    suppressMilliseconds = false,\n    includeOffset = true,\n    extendedZone = false,\n    precision = \"milliseconds\",\n  } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    precision = normalizeUnit(precision);\n    const ext = format === \"extended\";\n\n    let c = toISODate(this, ext, precision);\n    if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n    c += toISOTime(\n      this,\n      ext,\n      suppressSeconds,\n      suppressMilliseconds,\n      includeOffset,\n      extendedZone,\n      precision\n    );\n    return c;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's date component\n   * @param {Object} opts - options\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n   * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n   * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n   * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n   * @return {string|null}\n   */\n  toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n    return toISODate(this, format === \"extended\", normalizeUnit(precision));\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's week date\n   * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n   * @return {string}\n   */\n  toISOWeekDate() {\n    return toTechFormat(this, \"kkkk-'W'WW-c\");\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's time component\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n   * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n   * @return {string}\n   */\n  toISOTime({\n    suppressMilliseconds = false,\n    suppressSeconds = false,\n    includeOffset = true,\n    includePrefix = false,\n    extendedZone = false,\n    format = \"extended\",\n    precision = \"milliseconds\",\n  } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    precision = normalizeUnit(precision);\n    let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n    return (\n      c +\n      toISOTime(\n        this,\n        format === \"extended\",\n        suppressSeconds,\n        suppressMilliseconds,\n        includeOffset,\n        extendedZone,\n        precision\n      )\n    );\n  }\n\n  /**\n   * Returns an RFC 2822-compatible string representation of this DateTime\n   * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n   * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n   * @return {string}\n   */\n  toRFC2822() {\n    return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n   * Specifically, the string conforms to RFC 1123.\n   * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n   * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n   * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n   * @return {string}\n   */\n  toHTTP() {\n    return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL Date\n   * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n   * @return {string|null}\n   */\n  toSQLDate() {\n    if (!this.isValid) {\n      return null;\n    }\n    return toISODate(this, true);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL Time\n   * @param {Object} opts - options\n   * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n   * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n   * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n   * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n   * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n   * @return {string}\n   */\n  toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n    let fmt = \"HH:mm:ss.SSS\";\n\n    if (includeZone || includeOffset) {\n      if (includeOffsetSpace) {\n        fmt += \" \";\n      }\n      if (includeZone) {\n        fmt += \"z\";\n      } else if (includeOffset) {\n        fmt += \"ZZ\";\n      }\n    }\n\n    return toTechFormat(this, fmt, true);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n   * @param {Object} opts - options\n   * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n   * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n   * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n   * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n   * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n   * @return {string}\n   */\n  toSQL(opts = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for debugging\n   * @return {string}\n   */\n  toString() {\n    return this.isValid ? this.toISO() : INVALID;\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for the REPL.\n   * @return {string}\n   */\n  [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n    if (this.isValid) {\n      return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n    } else {\n      return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n    }\n  }\n\n  /**\n   * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n   * @return {number}\n   */\n  valueOf() {\n    return this.toMillis();\n  }\n\n  /**\n   * Returns the epoch milliseconds of this DateTime.\n   * @return {number}\n   */\n  toMillis() {\n    return this.isValid ? this.ts : NaN;\n  }\n\n  /**\n   * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n   * @return {number}\n   */\n  toSeconds() {\n    return this.isValid ? this.ts / 1000 : NaN;\n  }\n\n  /**\n   * Returns the epoch seconds (as a whole number) of this DateTime.\n   * @return {number}\n   */\n  toUnixInteger() {\n    return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n   * @return {string}\n   */\n  toJSON() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns a BSON serializable equivalent to this DateTime.\n   * @return {Date}\n   */\n  toBSON() {\n    return this.toJSDate();\n  }\n\n  /**\n   * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n   * @param opts - options for generating the object\n   * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n   * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n   * @return {Object}\n   */\n  toObject(opts = {}) {\n    if (!this.isValid) return {};\n\n    const base = { ...this.c };\n\n    if (opts.includeConfig) {\n      base.outputCalendar = this.outputCalendar;\n      base.numberingSystem = this.loc.numberingSystem;\n      base.locale = this.loc.locale;\n    }\n    return base;\n  }\n\n  /**\n   * Returns a JavaScript Date equivalent to this DateTime.\n   * @return {Date}\n   */\n  toJSDate() {\n    return new Date(this.isValid ? this.ts : NaN);\n  }\n\n  // COMPARE\n\n  /**\n   * Return the difference between two DateTimes as a Duration.\n   * @param {DateTime} otherDateTime - the DateTime to compare this one to\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @example\n   * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n   *     i2 = DateTime.fromISO('1983-10-14T10:30');\n   * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n   * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n   * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n   * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n   * @return {Duration}\n   */\n  diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n    if (!this.isValid || !otherDateTime.isValid) {\n      return Duration.invalid(\"created by diffing an invalid DateTime\");\n    }\n\n    const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n    const units = maybeArray(unit).map(Duration.normalizeUnit),\n      otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n      earlier = otherIsLater ? this : otherDateTime,\n      later = otherIsLater ? otherDateTime : this,\n      diffed = diff(earlier, later, units, durOpts);\n\n    return otherIsLater ? diffed.negate() : diffed;\n  }\n\n  /**\n   * Return the difference between this DateTime and right now.\n   * See {@link DateTime#diff}\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @return {Duration}\n   */\n  diffNow(unit = \"milliseconds\", opts = {}) {\n    return this.diff(DateTime.now(), unit, opts);\n  }\n\n  /**\n   * Return an Interval spanning between this DateTime and another DateTime\n   * @param {DateTime} otherDateTime - the other end point of the Interval\n   * @return {Interval|DateTime}\n   */\n  until(otherDateTime) {\n    return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n  }\n\n  /**\n   * Return whether this DateTime is in the same unit of time as another DateTime.\n   * Higher-order units must also be identical for this function to return `true`.\n   * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n   * @param {DateTime} otherDateTime - the other DateTime\n   * @param {string} unit - the unit of time to check sameness on\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n   * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n   * @return {boolean}\n   */\n  hasSame(otherDateTime, unit, opts) {\n    if (!this.isValid) return false;\n\n    const inputMs = otherDateTime.valueOf();\n    const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n    return (\n      adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n    );\n  }\n\n  /**\n   * Equality check\n   * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n   * To compare just the millisecond values, use `+dt1 === +dt2`.\n   * @param {DateTime} other - the other DateTime\n   * @return {boolean}\n   */\n  equals(other) {\n    return (\n      this.isValid &&\n      other.isValid &&\n      this.valueOf() === other.valueOf() &&\n      this.zone.equals(other.zone) &&\n      this.loc.equals(other.loc)\n    );\n  }\n\n  /**\n   * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n   * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n   * @param {Object} options - options that affect the output\n   * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n   * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n   * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n   * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n   * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n   * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n   * @param {string} options.locale - override the locale of this DateTime\n   * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n   * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n   * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n   * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n   * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n   * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n   * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n   */\n  toRelative(options = {}) {\n    if (!this.isValid) return null;\n    const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n      padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n    let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n    let unit = options.unit;\n    if (Array.isArray(options.unit)) {\n      units = options.unit;\n      unit = undefined;\n    }\n    return diffRelative(base, this.plus(padding), {\n      ...options,\n      numeric: \"always\",\n      units,\n      unit,\n    });\n  }\n\n  /**\n   * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n   * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n   * @param {Object} options - options that affect the output\n   * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n   * @param {string} options.locale - override the locale of this DateTime\n   * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n   * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n   * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n   * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n   * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n   * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n   */\n  toRelativeCalendar(options = {}) {\n    if (!this.isValid) return null;\n\n    return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n      ...options,\n      numeric: \"auto\",\n      units: [\"years\", \"months\", \"days\"],\n      calendary: true,\n    });\n  }\n\n  /**\n   * Return the min of several date times\n   * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n   * @return {DateTime} the min DateTime, or undefined if called with no argument\n   */\n  static min(...dateTimes) {\n    if (!dateTimes.every(DateTime.isDateTime)) {\n      throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n    }\n    return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n  }\n\n  /**\n   * Return the max of several date times\n   * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n   * @return {DateTime} the max DateTime, or undefined if called with no argument\n   */\n  static max(...dateTimes) {\n    if (!dateTimes.every(DateTime.isDateTime)) {\n      throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n    }\n    return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n  }\n\n  // MISC\n\n  /**\n   * Explain how a string would be parsed by fromFormat()\n   * @param {string} text - the string to parse\n   * @param {string} fmt - the format the string is expected to be in (see description)\n   * @param {Object} options - options taken by fromFormat()\n   * @return {Object}\n   */\n  static fromFormatExplain(text, fmt, options = {}) {\n    const { locale = null, numberingSystem = null } = options,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      });\n    return explainFromTokens(localeToUse, text, fmt);\n  }\n\n  /**\n   * @deprecated use fromFormatExplain instead\n   */\n  static fromStringExplain(text, fmt, options = {}) {\n    return DateTime.fromFormatExplain(text, fmt, options);\n  }\n\n  /**\n   * Build a parser for `fmt` using the given locale. This parser can be passed\n   * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n   * can be used to optimize cases where many dates need to be parsed in a\n   * specific format.\n   *\n   * @param {String} fmt - the format the string is expected to be in (see\n   * description)\n   * @param {Object} options - options used to set locale and numberingSystem\n   * for parser\n   * @returns {TokenParser} - opaque object to be used\n   */\n  static buildFormatParser(fmt, options = {}) {\n    const { locale = null, numberingSystem = null } = options,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      });\n    return new TokenParser(localeToUse, fmt);\n  }\n\n  /**\n   * Create a DateTime from an input string and format parser.\n   *\n   * The format parser must have been created with the same locale as this call.\n   *\n   * @param {String} text - the string to parse\n   * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n   * @param {Object} opts - options taken by fromFormat()\n   * @returns {DateTime}\n   */\n  static fromFormatParser(text, formatParser, opts = {}) {\n    if (isUndefined(text) || isUndefined(formatParser)) {\n      throw new InvalidArgumentError(\n        \"fromFormatParser requires an input string and a format parser\"\n      );\n    }\n    const { locale = null, numberingSystem = null } = opts,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      });\n\n    if (!localeToUse.equals(formatParser.locale)) {\n      throw new InvalidArgumentError(\n        `fromFormatParser called with a locale of ${localeToUse}, ` +\n          `but the format parser was created for ${formatParser.locale}`\n      );\n    }\n\n    const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n    if (invalidReason) {\n      return DateTime.invalid(invalidReason);\n    } else {\n      return parseDataToDateTime(\n        result,\n        zone,\n        opts,\n        `format ${formatParser.format}`,\n        text,\n        specificOffset\n      );\n    }\n  }\n\n  // FORMAT PRESETS\n\n  /**\n   * {@link DateTime#toLocaleString} format like 10/14/1983\n   * @type {Object}\n   */\n  static get DATE_SHORT() {\n    return Formats.DATE_SHORT;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_MED() {\n    return Formats.DATE_MED;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_MED_WITH_WEEKDAY() {\n    return Formats.DATE_MED_WITH_WEEKDAY;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_FULL() {\n    return Formats.DATE_FULL;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_HUGE() {\n    return Formats.DATE_HUGE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_SIMPLE() {\n    return Formats.TIME_SIMPLE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_SECONDS() {\n    return Formats.TIME_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_SHORT_OFFSET() {\n    return Formats.TIME_WITH_SHORT_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_LONG_OFFSET() {\n    return Formats.TIME_WITH_LONG_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_SIMPLE() {\n    return Formats.TIME_24_SIMPLE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_SECONDS() {\n    return Formats.TIME_24_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_SHORT_OFFSET() {\n    return Formats.TIME_24_WITH_SHORT_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_LONG_OFFSET() {\n    return Formats.TIME_24_WITH_LONG_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_SHORT() {\n    return Formats.DATETIME_SHORT;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_SHORT_WITH_SECONDS() {\n    return Formats.DATETIME_SHORT_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED() {\n    return Formats.DATETIME_MED;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED_WITH_SECONDS() {\n    return Formats.DATETIME_MED_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED_WITH_WEEKDAY() {\n    return Formats.DATETIME_MED_WITH_WEEKDAY;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_FULL() {\n    return Formats.DATETIME_FULL;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_FULL_WITH_SECONDS() {\n    return Formats.DATETIME_FULL_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_HUGE() {\n    return Formats.DATETIME_HUGE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_HUGE_WITH_SECONDS() {\n    return Formats.DATETIME_HUGE_WITH_SECONDS;\n  }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n  if (DateTime.isDateTime(dateTimeish)) {\n    return dateTimeish;\n  } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n    return DateTime.fromJSDate(dateTimeish);\n  } else if (dateTimeish && typeof dateTimeish === \"object\") {\n    return DateTime.fromObject(dateTimeish);\n  } else {\n    throw new InvalidArgumentError(\n      `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n    );\n  }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n  VERSION,\n  DateTime,\n  Duration,\n  Interval,\n  Info,\n  Zone,\n  FixedOffsetZone,\n  IANAZone,\n  InvalidZone,\n  SystemZone,\n  Settings,\n};\n","//! moment.js locale configuration\n//! locale : Afrikaans [af]\n//! author : Werner Mollentze : https://github.com/wernerm\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var af = moment.defineLocale('af', {\n        months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),\n        weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split(\n            '_'\n        ),\n        weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),\n        weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),\n        meridiemParse: /vm|nm/i,\n        isPM: function (input) {\n            return /^nm$/i.test(input);\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower ? 'vm' : 'VM';\n            } else {\n                return isLower ? 'nm' : 'NM';\n            }\n        },\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Vandag om] LT',\n            nextDay: '[Môre om] LT',\n            nextWeek: 'dddd [om] LT',\n            lastDay: '[Gister om] LT',\n            lastWeek: '[Laas] dddd [om] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'oor %s',\n            past: '%s gelede',\n            s: \"'n paar sekondes\",\n            ss: '%d sekondes',\n            m: \"'n minuut\",\n            mm: '%d minute',\n            h: \"'n uur\",\n            hh: '%d ure',\n            d: \"'n dag\",\n            dd: '%d dae',\n            M: \"'n maand\",\n            MM: '%d maande',\n            y: \"'n jaar\",\n            yy: '%d jaar',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n        ordinal: function (number) {\n            return (\n                number +\n                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n            ); // Thanks to Joris Röling : https://github.com/jjupiter\n        },\n        week: {\n            dow: 1, // Maandag is die eerste dag van die week.\n            doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.\n        },\n    });\n\n    return af;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Algeria) [ar-dz]\n//! author : Amine Roukh: https://github.com/Amine27\n//! author : Abdel Said: https://github.com/abdelsaid\n//! author : Ahmed Elkhatib\n//! author : forabi https://github.com/forabi\n//! author : Noureddine LOUAHEDJ : https://github.com/noureddinem\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var pluralForm = function (n) {\n            return n === 0\n                ? 0\n                : n === 1\n                  ? 1\n                  : n === 2\n                    ? 2\n                    : n % 100 >= 3 && n % 100 <= 10\n                      ? 3\n                      : n % 100 >= 11\n                        ? 4\n                        : 5;\n        },\n        plurals = {\n            s: [\n                'أقل من ثانية',\n                'ثانية واحدة',\n                ['ثانيتان', 'ثانيتين'],\n                '%d ثوان',\n                '%d ثانية',\n                '%d ثانية',\n            ],\n            m: [\n                'أقل من دقيقة',\n                'دقيقة واحدة',\n                ['دقيقتان', 'دقيقتين'],\n                '%d دقائق',\n                '%d دقيقة',\n                '%d دقيقة',\n            ],\n            h: [\n                'أقل من ساعة',\n                'ساعة واحدة',\n                ['ساعتان', 'ساعتين'],\n                '%d ساعات',\n                '%d ساعة',\n                '%d ساعة',\n            ],\n            d: [\n                'أقل من يوم',\n                'يوم واحد',\n                ['يومان', 'يومين'],\n                '%d أيام',\n                '%d يومًا',\n                '%d يوم',\n            ],\n            M: [\n                'أقل من شهر',\n                'شهر واحد',\n                ['شهران', 'شهرين'],\n                '%d أشهر',\n                '%d شهرا',\n                '%d شهر',\n            ],\n            y: [\n                'أقل من عام',\n                'عام واحد',\n                ['عامان', 'عامين'],\n                '%d أعوام',\n                '%d عامًا',\n                '%d عام',\n            ],\n        },\n        pluralize = function (u) {\n            return function (number, withoutSuffix, string, isFuture) {\n                var f = pluralForm(number),\n                    str = plurals[u][pluralForm(number)];\n                if (f === 2) {\n                    str = str[withoutSuffix ? 0 : 1];\n                }\n                return str.replace(/%d/i, number);\n            };\n        },\n        months = [\n            'جانفي',\n            'فيفري',\n            'مارس',\n            'أفريل',\n            'ماي',\n            'جوان',\n            'جويلية',\n            'أوت',\n            'سبتمبر',\n            'أكتوبر',\n            'نوفمبر',\n            'ديسمبر',\n        ];\n\n    var arDz = moment.defineLocale('ar-dz', {\n        months: months,\n        monthsShort: months,\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'D/\\u200FM/\\u200FYYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ص|م/,\n        isPM: function (input) {\n            return 'م' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ص';\n            } else {\n                return 'م';\n            }\n        },\n        calendar: {\n            sameDay: '[اليوم عند الساعة] LT',\n            nextDay: '[غدًا عند الساعة] LT',\n            nextWeek: 'dddd [عند الساعة] LT',\n            lastDay: '[أمس عند الساعة] LT',\n            lastWeek: 'dddd [عند الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'بعد %s',\n            past: 'منذ %s',\n            s: pluralize('s'),\n            ss: pluralize('s'),\n            m: pluralize('m'),\n            mm: pluralize('m'),\n            h: pluralize('h'),\n            hh: pluralize('h'),\n            d: pluralize('d'),\n            dd: pluralize('d'),\n            M: pluralize('M'),\n            MM: pluralize('M'),\n            y: pluralize('y'),\n            yy: pluralize('y'),\n        },\n        postformat: function (string) {\n            return string.replace(/,/g, '،');\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return arDz;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Kuwait) [ar-kw]\n//! author : Nusret Parlak: https://github.com/nusretparlak\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var arKw = moment.defineLocale('ar-kw', {\n        months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n            '_'\n        ),\n        monthsShort:\n            'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n                '_'\n            ),\n        weekdays: 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[اليوم على الساعة] LT',\n            nextDay: '[غدا على الساعة] LT',\n            nextWeek: 'dddd [على الساعة] LT',\n            lastDay: '[أمس على الساعة] LT',\n            lastWeek: 'dddd [على الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'في %s',\n            past: 'منذ %s',\n            s: 'ثوان',\n            ss: '%d ثانية',\n            m: 'دقيقة',\n            mm: '%d دقائق',\n            h: 'ساعة',\n            hh: '%d ساعات',\n            d: 'يوم',\n            dd: '%d أيام',\n            M: 'شهر',\n            MM: '%d أشهر',\n            y: 'سنة',\n            yy: '%d سنوات',\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return arKw;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Libya) [ar-ly]\n//! author : Ali Hmer: https://github.com/kikoanis\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '1',\n            2: '2',\n            3: '3',\n            4: '4',\n            5: '5',\n            6: '6',\n            7: '7',\n            8: '8',\n            9: '9',\n            0: '0',\n        },\n        pluralForm = function (n) {\n            return n === 0\n                ? 0\n                : n === 1\n                  ? 1\n                  : n === 2\n                    ? 2\n                    : n % 100 >= 3 && n % 100 <= 10\n                      ? 3\n                      : n % 100 >= 11\n                        ? 4\n                        : 5;\n        },\n        plurals = {\n            s: [\n                'أقل من ثانية',\n                'ثانية واحدة',\n                ['ثانيتان', 'ثانيتين'],\n                '%d ثوان',\n                '%d ثانية',\n                '%d ثانية',\n            ],\n            m: [\n                'أقل من دقيقة',\n                'دقيقة واحدة',\n                ['دقيقتان', 'دقيقتين'],\n                '%d دقائق',\n                '%d دقيقة',\n                '%d دقيقة',\n            ],\n            h: [\n                'أقل من ساعة',\n                'ساعة واحدة',\n                ['ساعتان', 'ساعتين'],\n                '%d ساعات',\n                '%d ساعة',\n                '%d ساعة',\n            ],\n            d: [\n                'أقل من يوم',\n                'يوم واحد',\n                ['يومان', 'يومين'],\n                '%d أيام',\n                '%d يومًا',\n                '%d يوم',\n            ],\n            M: [\n                'أقل من شهر',\n                'شهر واحد',\n                ['شهران', 'شهرين'],\n                '%d أشهر',\n                '%d شهرا',\n                '%d شهر',\n            ],\n            y: [\n                'أقل من عام',\n                'عام واحد',\n                ['عامان', 'عامين'],\n                '%d أعوام',\n                '%d عامًا',\n                '%d عام',\n            ],\n        },\n        pluralize = function (u) {\n            return function (number, withoutSuffix, string, isFuture) {\n                var f = pluralForm(number),\n                    str = plurals[u][pluralForm(number)];\n                if (f === 2) {\n                    str = str[withoutSuffix ? 0 : 1];\n                }\n                return str.replace(/%d/i, number);\n            };\n        },\n        months = [\n            'يناير',\n            'فبراير',\n            'مارس',\n            'أبريل',\n            'مايو',\n            'يونيو',\n            'يوليو',\n            'أغسطس',\n            'سبتمبر',\n            'أكتوبر',\n            'نوفمبر',\n            'ديسمبر',\n        ];\n\n    var arLy = moment.defineLocale('ar-ly', {\n        months: months,\n        monthsShort: months,\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'D/\\u200FM/\\u200FYYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ص|م/,\n        isPM: function (input) {\n            return 'م' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ص';\n            } else {\n                return 'م';\n            }\n        },\n        calendar: {\n            sameDay: '[اليوم عند الساعة] LT',\n            nextDay: '[غدًا عند الساعة] LT',\n            nextWeek: 'dddd [عند الساعة] LT',\n            lastDay: '[أمس عند الساعة] LT',\n            lastWeek: 'dddd [عند الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'بعد %s',\n            past: 'منذ %s',\n            s: pluralize('s'),\n            ss: pluralize('s'),\n            m: pluralize('m'),\n            mm: pluralize('m'),\n            h: pluralize('h'),\n            hh: pluralize('h'),\n            d: pluralize('d'),\n            dd: pluralize('d'),\n            M: pluralize('M'),\n            MM: pluralize('M'),\n            y: pluralize('y'),\n            yy: pluralize('y'),\n        },\n        preparse: function (string) {\n            return string.replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return arLy;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Morocco) [ar-ma]\n//! author : ElFadili Yassine : https://github.com/ElFadiliY\n//! author : Abdel Said : https://github.com/abdelsaid\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var arMa = moment.defineLocale('ar-ma', {\n        months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n            '_'\n        ),\n        monthsShort:\n            'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n                '_'\n            ),\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[اليوم على الساعة] LT',\n            nextDay: '[غدا على الساعة] LT',\n            nextWeek: 'dddd [على الساعة] LT',\n            lastDay: '[أمس على الساعة] LT',\n            lastWeek: 'dddd [على الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'في %s',\n            past: 'منذ %s',\n            s: 'ثوان',\n            ss: '%d ثانية',\n            m: 'دقيقة',\n            mm: '%d دقائق',\n            h: 'ساعة',\n            hh: '%d ساعات',\n            d: 'يوم',\n            dd: '%d أيام',\n            M: 'شهر',\n            MM: '%d أشهر',\n            y: 'سنة',\n            yy: '%d سنوات',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return arMa;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Palestine) [ar-ps]\n//! author : Majd Al-Shihabi : https://github.com/majdal\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '١',\n            2: '٢',\n            3: '٣',\n            4: '٤',\n            5: '٥',\n            6: '٦',\n            7: '٧',\n            8: '٨',\n            9: '٩',\n            0: '٠',\n        },\n        numberMap = {\n            '١': '1',\n            '٢': '2',\n            '٣': '3',\n            '٤': '4',\n            '٥': '5',\n            '٦': '6',\n            '٧': '7',\n            '٨': '8',\n            '٩': '9',\n            '٠': '0',\n        };\n\n    var arPs = moment.defineLocale('ar-ps', {\n        months: 'كانون الثاني_شباط_آذار_نيسان_أيّار_حزيران_تمّوز_آب_أيلول_تشري الأوّل_تشرين الثاني_كانون الأوّل'.split(\n            '_'\n        ),\n        monthsShort:\n            'ك٢_شباط_آذار_نيسان_أيّار_حزيران_تمّوز_آب_أيلول_ت١_ت٢_ك١'.split('_'),\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ص|م/,\n        isPM: function (input) {\n            return 'م' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ص';\n            } else {\n                return 'م';\n            }\n        },\n        calendar: {\n            sameDay: '[اليوم على الساعة] LT',\n            nextDay: '[غدا على الساعة] LT',\n            nextWeek: 'dddd [على الساعة] LT',\n            lastDay: '[أمس على الساعة] LT',\n            lastWeek: 'dddd [على الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'في %s',\n            past: 'منذ %s',\n            s: 'ثوان',\n            ss: '%d ثانية',\n            m: 'دقيقة',\n            mm: '%d دقائق',\n            h: 'ساعة',\n            hh: '%d ساعات',\n            d: 'يوم',\n            dd: '%d أيام',\n            M: 'شهر',\n            MM: '%d أشهر',\n            y: 'سنة',\n            yy: '%d سنوات',\n        },\n        preparse: function (string) {\n            return string\n                .replace(/[٣٤٥٦٧٨٩٠]/g, function (match) {\n                    return numberMap[match];\n                })\n                .split('') // reversed since negative lookbehind not supported everywhere\n                .reverse()\n                .join('')\n                .replace(/[١٢](?![\\u062a\\u0643])/g, function (match) {\n                    return numberMap[match];\n                })\n                .split('')\n                .reverse()\n                .join('')\n                .replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return arPs;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic (Saudi Arabia) [ar-sa]\n//! author : Suhail Alkowaileet : https://github.com/xsoh\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '١',\n            2: '٢',\n            3: '٣',\n            4: '٤',\n            5: '٥',\n            6: '٦',\n            7: '٧',\n            8: '٨',\n            9: '٩',\n            0: '٠',\n        },\n        numberMap = {\n            '١': '1',\n            '٢': '2',\n            '٣': '3',\n            '٤': '4',\n            '٥': '5',\n            '٦': '6',\n            '٧': '7',\n            '٨': '8',\n            '٩': '9',\n            '٠': '0',\n        };\n\n    var arSa = moment.defineLocale('ar-sa', {\n        months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(\n            '_'\n        ),\n        monthsShort:\n            'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(\n                '_'\n            ),\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ص|م/,\n        isPM: function (input) {\n            return 'م' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ص';\n            } else {\n                return 'م';\n            }\n        },\n        calendar: {\n            sameDay: '[اليوم على الساعة] LT',\n            nextDay: '[غدا على الساعة] LT',\n            nextWeek: 'dddd [على الساعة] LT',\n            lastDay: '[أمس على الساعة] LT',\n            lastWeek: 'dddd [على الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'في %s',\n            past: 'منذ %s',\n            s: 'ثوان',\n            ss: '%d ثانية',\n            m: 'دقيقة',\n            mm: '%d دقائق',\n            h: 'ساعة',\n            hh: '%d ساعات',\n            d: 'يوم',\n            dd: '%d أيام',\n            M: 'شهر',\n            MM: '%d أشهر',\n            y: 'سنة',\n            yy: '%d سنوات',\n        },\n        preparse: function (string) {\n            return string\n                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n                    return numberMap[match];\n                })\n                .replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return arSa;\n\n})));\n","//! moment.js locale configuration\n//! locale  :  Arabic (Tunisia) [ar-tn]\n//! author : Nader Toukabri : https://github.com/naderio\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var arTn = moment.defineLocale('ar-tn', {\n        months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(\n            '_'\n        ),\n        monthsShort:\n            'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(\n                '_'\n            ),\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[اليوم على الساعة] LT',\n            nextDay: '[غدا على الساعة] LT',\n            nextWeek: 'dddd [على الساعة] LT',\n            lastDay: '[أمس على الساعة] LT',\n            lastWeek: 'dddd [على الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'في %s',\n            past: 'منذ %s',\n            s: 'ثوان',\n            ss: '%d ثانية',\n            m: 'دقيقة',\n            mm: '%d دقائق',\n            h: 'ساعة',\n            hh: '%d ساعات',\n            d: 'يوم',\n            dd: '%d أيام',\n            M: 'شهر',\n            MM: '%d أشهر',\n            y: 'سنة',\n            yy: '%d سنوات',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return arTn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Arabic [ar]\n//! author : Abdel Said: https://github.com/abdelsaid\n//! author : Ahmed Elkhatib\n//! author : forabi https://github.com/forabi\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '١',\n            2: '٢',\n            3: '٣',\n            4: '٤',\n            5: '٥',\n            6: '٦',\n            7: '٧',\n            8: '٨',\n            9: '٩',\n            0: '٠',\n        },\n        numberMap = {\n            '١': '1',\n            '٢': '2',\n            '٣': '3',\n            '٤': '4',\n            '٥': '5',\n            '٦': '6',\n            '٧': '7',\n            '٨': '8',\n            '٩': '9',\n            '٠': '0',\n        },\n        pluralForm = function (n) {\n            return n === 0\n                ? 0\n                : n === 1\n                  ? 1\n                  : n === 2\n                    ? 2\n                    : n % 100 >= 3 && n % 100 <= 10\n                      ? 3\n                      : n % 100 >= 11\n                        ? 4\n                        : 5;\n        },\n        plurals = {\n            s: [\n                'أقل من ثانية',\n                'ثانية واحدة',\n                ['ثانيتان', 'ثانيتين'],\n                '%d ثوان',\n                '%d ثانية',\n                '%d ثانية',\n            ],\n            m: [\n                'أقل من دقيقة',\n                'دقيقة واحدة',\n                ['دقيقتان', 'دقيقتين'],\n                '%d دقائق',\n                '%d دقيقة',\n                '%d دقيقة',\n            ],\n            h: [\n                'أقل من ساعة',\n                'ساعة واحدة',\n                ['ساعتان', 'ساعتين'],\n                '%d ساعات',\n                '%d ساعة',\n                '%d ساعة',\n            ],\n            d: [\n                'أقل من يوم',\n                'يوم واحد',\n                ['يومان', 'يومين'],\n                '%d أيام',\n                '%d يومًا',\n                '%d يوم',\n            ],\n            M: [\n                'أقل من شهر',\n                'شهر واحد',\n                ['شهران', 'شهرين'],\n                '%d أشهر',\n                '%d شهرا',\n                '%d شهر',\n            ],\n            y: [\n                'أقل من عام',\n                'عام واحد',\n                ['عامان', 'عامين'],\n                '%d أعوام',\n                '%d عامًا',\n                '%d عام',\n            ],\n        },\n        pluralize = function (u) {\n            return function (number, withoutSuffix, string, isFuture) {\n                var f = pluralForm(number),\n                    str = plurals[u][pluralForm(number)];\n                if (f === 2) {\n                    str = str[withoutSuffix ? 0 : 1];\n                }\n                return str.replace(/%d/i, number);\n            };\n        },\n        months = [\n            'يناير',\n            'فبراير',\n            'مارس',\n            'أبريل',\n            'مايو',\n            'يونيو',\n            'يوليو',\n            'أغسطس',\n            'سبتمبر',\n            'أكتوبر',\n            'نوفمبر',\n            'ديسمبر',\n        ];\n\n    var ar = moment.defineLocale('ar', {\n        months: months,\n        monthsShort: months,\n        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'D/\\u200FM/\\u200FYYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ص|م/,\n        isPM: function (input) {\n            return 'م' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ص';\n            } else {\n                return 'م';\n            }\n        },\n        calendar: {\n            sameDay: '[اليوم عند الساعة] LT',\n            nextDay: '[غدًا عند الساعة] LT',\n            nextWeek: 'dddd [عند الساعة] LT',\n            lastDay: '[أمس عند الساعة] LT',\n            lastWeek: 'dddd [عند الساعة] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'بعد %s',\n            past: 'منذ %s',\n            s: pluralize('s'),\n            ss: pluralize('s'),\n            m: pluralize('m'),\n            mm: pluralize('m'),\n            h: pluralize('h'),\n            hh: pluralize('h'),\n            d: pluralize('d'),\n            dd: pluralize('d'),\n            M: pluralize('M'),\n            MM: pluralize('M'),\n            y: pluralize('y'),\n            yy: pluralize('y'),\n        },\n        preparse: function (string) {\n            return string\n                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n                    return numberMap[match];\n                })\n                .replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return ar;\n\n})));\n","//! moment.js locale configuration\n//! locale : Azerbaijani [az]\n//! author : topchiyev : https://github.com/topchiyev\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        1: '-inci',\n        5: '-inci',\n        8: '-inci',\n        70: '-inci',\n        80: '-inci',\n        2: '-nci',\n        7: '-nci',\n        20: '-nci',\n        50: '-nci',\n        3: '-üncü',\n        4: '-üncü',\n        100: '-üncü',\n        6: '-ncı',\n        9: '-uncu',\n        10: '-uncu',\n        30: '-uncu',\n        60: '-ıncı',\n        90: '-ıncı',\n    };\n\n    var az = moment.defineLocale('az', {\n        months: 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split(\n            '_'\n        ),\n        monthsShort: 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),\n        weekdays:\n            'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split(\n                '_'\n            ),\n        weekdaysShort: 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),\n        weekdaysMin: 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[bugün saat] LT',\n            nextDay: '[sabah saat] LT',\n            nextWeek: '[gələn həftə] dddd [saat] LT',\n            lastDay: '[dünən] LT',\n            lastWeek: '[keçən həftə] dddd [saat] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s sonra',\n            past: '%s əvvəl',\n            s: 'bir neçə saniyə',\n            ss: '%d saniyə',\n            m: 'bir dəqiqə',\n            mm: '%d dəqiqə',\n            h: 'bir saat',\n            hh: '%d saat',\n            d: 'bir gün',\n            dd: '%d gün',\n            M: 'bir ay',\n            MM: '%d ay',\n            y: 'bir il',\n            yy: '%d il',\n        },\n        meridiemParse: /gecə|səhər|gündüz|axşam/,\n        isPM: function (input) {\n            return /^(gündüz|axşam)$/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'gecə';\n            } else if (hour < 12) {\n                return 'səhər';\n            } else if (hour < 17) {\n                return 'gündüz';\n            } else {\n                return 'axşam';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,\n        ordinal: function (number) {\n            if (number === 0) {\n                // special case for zero\n                return number + '-ıncı';\n            }\n            var a = number % 10,\n                b = (number % 100) - a,\n                c = number >= 100 ? 100 : null;\n            return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return az;\n\n})));\n","//! moment.js locale configuration\n//! locale : Belarusian [be]\n//! author : Dmitry Demidov : https://github.com/demidov91\n//! author: Praleska: http://praleska.pro/\n//! Author : Menelion Elensúle : https://github.com/Oire\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function plural(word, num) {\n        var forms = word.split('_');\n        return num % 10 === 1 && num % 100 !== 11\n            ? forms[0]\n            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)\n              ? forms[1]\n              : forms[2];\n    }\n    function relativeTimeWithPlural(number, withoutSuffix, key) {\n        var format = {\n            ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n            mm: withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',\n            hh: withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',\n            dd: 'дзень_дні_дзён',\n            MM: 'месяц_месяцы_месяцаў',\n            yy: 'год_гады_гадоў',\n        };\n        if (key === 'm') {\n            return withoutSuffix ? 'хвіліна' : 'хвіліну';\n        } else if (key === 'h') {\n            return withoutSuffix ? 'гадзіна' : 'гадзіну';\n        } else {\n            return number + ' ' + plural(format[key], +number);\n        }\n    }\n\n    var be = moment.defineLocale('be', {\n        months: {\n            format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split(\n                '_'\n            ),\n            standalone:\n                'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split(\n                    '_'\n                ),\n        },\n        monthsShort:\n            'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),\n        weekdays: {\n            format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split(\n                '_'\n            ),\n            standalone:\n                'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split(\n                    '_'\n                ),\n            isFormat: /\\[ ?[Ууў] ?(?:мінулую|наступную)? ?\\] ?dddd/,\n        },\n        weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n        weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY г.',\n            LLL: 'D MMMM YYYY г., HH:mm',\n            LLLL: 'dddd, D MMMM YYYY г., HH:mm',\n        },\n        calendar: {\n            sameDay: '[Сёння ў] LT',\n            nextDay: '[Заўтра ў] LT',\n            lastDay: '[Учора ў] LT',\n            nextWeek: function () {\n                return '[У] dddd [ў] LT';\n            },\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                    case 3:\n                    case 5:\n                    case 6:\n                        return '[У мінулую] dddd [ў] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                        return '[У мінулы] dddd [ў] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'праз %s',\n            past: '%s таму',\n            s: 'некалькі секунд',\n            m: relativeTimeWithPlural,\n            mm: relativeTimeWithPlural,\n            h: relativeTimeWithPlural,\n            hh: relativeTimeWithPlural,\n            d: 'дзень',\n            dd: relativeTimeWithPlural,\n            M: 'месяц',\n            MM: relativeTimeWithPlural,\n            y: 'год',\n            yy: relativeTimeWithPlural,\n        },\n        meridiemParse: /ночы|раніцы|дня|вечара/,\n        isPM: function (input) {\n            return /^(дня|вечара)$/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'ночы';\n            } else if (hour < 12) {\n                return 'раніцы';\n            } else if (hour < 17) {\n                return 'дня';\n            } else {\n                return 'вечара';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(і|ы|га)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'M':\n                case 'd':\n                case 'DDD':\n                case 'w':\n                case 'W':\n                    return (number % 10 === 2 || number % 10 === 3) &&\n                        number % 100 !== 12 &&\n                        number % 100 !== 13\n                        ? number + '-і'\n                        : number + '-ы';\n                case 'D':\n                    return number + '-га';\n                default:\n                    return number;\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return be;\n\n})));\n","//! moment.js locale configuration\n//! locale : Bulgarian [bg]\n//! author : Krasen Borisov : https://github.com/kraz\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var bg = moment.defineLocale('bg', {\n        months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split(\n            '_'\n        ),\n        monthsShort: 'яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),\n        weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split(\n            '_'\n        ),\n        weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),\n        weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'D.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY H:mm',\n            LLLL: 'dddd, D MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[Днес в] LT',\n            nextDay: '[Утре в] LT',\n            nextWeek: 'dddd [в] LT',\n            lastDay: '[Вчера в] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                    case 3:\n                    case 6:\n                        return '[Миналата] dddd [в] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[Миналия] dddd [в] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'след %s',\n            past: 'преди %s',\n            s: 'няколко секунди',\n            ss: '%d секунди',\n            m: 'минута',\n            mm: '%d минути',\n            h: 'час',\n            hh: '%d часа',\n            d: 'ден',\n            dd: '%d дена',\n            w: 'седмица',\n            ww: '%d седмици',\n            M: 'месец',\n            MM: '%d месеца',\n            y: 'година',\n            yy: '%d години',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n        ordinal: function (number) {\n            var lastDigit = number % 10,\n                last2Digits = number % 100;\n            if (number === 0) {\n                return number + '-ев';\n            } else if (last2Digits === 0) {\n                return number + '-ен';\n            } else if (last2Digits > 10 && last2Digits < 20) {\n                return number + '-ти';\n            } else if (lastDigit === 1) {\n                return number + '-ви';\n            } else if (lastDigit === 2) {\n                return number + '-ри';\n            } else if (lastDigit === 7 || lastDigit === 8) {\n                return number + '-ми';\n            } else {\n                return number + '-ти';\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return bg;\n\n})));\n","//! moment.js locale configuration\n//! locale : Bambara [bm]\n//! author : Estelle Comment : https://github.com/estellecomment\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var bm = moment.defineLocale('bm', {\n        months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split(\n            '_'\n        ),\n        monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),\n        weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),\n        weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),\n        weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'MMMM [tile] D [san] YYYY',\n            LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',\n            LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',\n        },\n        calendar: {\n            sameDay: '[Bi lɛrɛ] LT',\n            nextDay: '[Sini lɛrɛ] LT',\n            nextWeek: 'dddd [don lɛrɛ] LT',\n            lastDay: '[Kunu lɛrɛ] LT',\n            lastWeek: 'dddd [tɛmɛnen lɛrɛ] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s kɔnɔ',\n            past: 'a bɛ %s bɔ',\n            s: 'sanga dama dama',\n            ss: 'sekondi %d',\n            m: 'miniti kelen',\n            mm: 'miniti %d',\n            h: 'lɛrɛ kelen',\n            hh: 'lɛrɛ %d',\n            d: 'tile kelen',\n            dd: 'tile %d',\n            M: 'kalo kelen',\n            MM: 'kalo %d',\n            y: 'san kelen',\n            yy: 'san %d',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return bm;\n\n})));\n","//! moment.js locale configuration\n//! locale : Bengali (Bangladesh) [bn-bd]\n//! author : Asraf Hossain Patoary : https://github.com/ashwoolford\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '১',\n            2: '২',\n            3: '৩',\n            4: '৪',\n            5: '৫',\n            6: '৬',\n            7: '৭',\n            8: '৮',\n            9: '৯',\n            0: '০',\n        },\n        numberMap = {\n            '১': '1',\n            '২': '2',\n            '৩': '3',\n            '৪': '4',\n            '৫': '5',\n            '৬': '6',\n            '৭': '7',\n            '৮': '8',\n            '৯': '9',\n            '০': '0',\n        };\n\n    var bnBd = moment.defineLocale('bn-bd', {\n        months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(\n            '_'\n        ),\n        monthsShort:\n            'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(\n                '_'\n            ),\n        weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(\n            '_'\n        ),\n        weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),\n        weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm সময়',\n            LTS: 'A h:mm:ss সময়',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm সময়',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',\n        },\n        calendar: {\n            sameDay: '[আজ] LT',\n            nextDay: '[আগামীকাল] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[গতকাল] LT',\n            lastWeek: '[গত] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s পরে',\n            past: '%s আগে',\n            s: 'কয়েক সেকেন্ড',\n            ss: '%d সেকেন্ড',\n            m: 'এক মিনিট',\n            mm: '%d মিনিট',\n            h: 'এক ঘন্টা',\n            hh: '%d ঘন্টা',\n            d: 'এক দিন',\n            dd: '%d দিন',\n            M: 'এক মাস',\n            MM: '%d মাস',\n            y: 'এক বছর',\n            yy: '%d বছর',\n        },\n        preparse: function (string) {\n            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n\n        meridiemParse: /রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'রাত') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'ভোর') {\n                return hour;\n            } else if (meridiem === 'সকাল') {\n                return hour;\n            } else if (meridiem === 'দুপুর') {\n                return hour >= 3 ? hour : hour + 12;\n            } else if (meridiem === 'বিকাল') {\n                return hour + 12;\n            } else if (meridiem === 'সন্ধ্যা') {\n                return hour + 12;\n            }\n        },\n\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'রাত';\n            } else if (hour < 6) {\n                return 'ভোর';\n            } else if (hour < 12) {\n                return 'সকাল';\n            } else if (hour < 15) {\n                return 'দুপুর';\n            } else if (hour < 18) {\n                return 'বিকাল';\n            } else if (hour < 20) {\n                return 'সন্ধ্যা';\n            } else {\n                return 'রাত';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return bnBd;\n\n})));\n","//! moment.js locale configuration\n//! locale : Bengali [bn]\n//! author : Kaushik Gandhi : https://github.com/kaushikgandhi\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '১',\n            2: '২',\n            3: '৩',\n            4: '৪',\n            5: '৫',\n            6: '৬',\n            7: '৭',\n            8: '৮',\n            9: '৯',\n            0: '০',\n        },\n        numberMap = {\n            '১': '1',\n            '২': '2',\n            '৩': '3',\n            '৪': '4',\n            '৫': '5',\n            '৬': '6',\n            '৭': '7',\n            '৮': '8',\n            '৯': '9',\n            '০': '0',\n        };\n\n    var bn = moment.defineLocale('bn', {\n        months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(\n            '_'\n        ),\n        monthsShort:\n            'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(\n                '_'\n            ),\n        weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(\n            '_'\n        ),\n        weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),\n        weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm সময়',\n            LTS: 'A h:mm:ss সময়',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm সময়',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',\n        },\n        calendar: {\n            sameDay: '[আজ] LT',\n            nextDay: '[আগামীকাল] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[গতকাল] LT',\n            lastWeek: '[গত] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s পরে',\n            past: '%s আগে',\n            s: 'কয়েক সেকেন্ড',\n            ss: '%d সেকেন্ড',\n            m: 'এক মিনিট',\n            mm: '%d মিনিট',\n            h: 'এক ঘন্টা',\n            hh: '%d ঘন্টা',\n            d: 'এক দিন',\n            dd: '%d দিন',\n            M: 'এক মাস',\n            MM: '%d মাস',\n            y: 'এক বছর',\n            yy: '%d বছর',\n        },\n        preparse: function (string) {\n            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (\n                (meridiem === 'রাত' && hour >= 4) ||\n                (meridiem === 'দুপুর' && hour < 5) ||\n                meridiem === 'বিকাল'\n            ) {\n                return hour + 12;\n            } else {\n                return hour;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'রাত';\n            } else if (hour < 10) {\n                return 'সকাল';\n            } else if (hour < 17) {\n                return 'দুপুর';\n            } else if (hour < 20) {\n                return 'বিকাল';\n            } else {\n                return 'রাত';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return bn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Tibetan [bo]\n//! author : Thupten N. Chakrishar : https://github.com/vajradog\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '༡',\n            2: '༢',\n            3: '༣',\n            4: '༤',\n            5: '༥',\n            6: '༦',\n            7: '༧',\n            8: '༨',\n            9: '༩',\n            0: '༠',\n        },\n        numberMap = {\n            '༡': '1',\n            '༢': '2',\n            '༣': '3',\n            '༤': '4',\n            '༥': '5',\n            '༦': '6',\n            '༧': '7',\n            '༨': '8',\n            '༩': '9',\n            '༠': '0',\n        };\n\n    var bo = moment.defineLocale('bo', {\n        months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split(\n            '_'\n        ),\n        monthsShort:\n            'ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12'.split(\n                '_'\n            ),\n        monthsShortRegex: /^(ཟླ་\\d{1,2})/,\n        monthsParseExact: true,\n        weekdays:\n            'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split(\n                '_'\n            ),\n        weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split(\n            '_'\n        ),\n        weekdaysMin: 'ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm',\n            LTS: 'A h:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm',\n        },\n        calendar: {\n            sameDay: '[དི་རིང] LT',\n            nextDay: '[སང་ཉིན] LT',\n            nextWeek: '[བདུན་ཕྲག་རྗེས་མ], LT',\n            lastDay: '[ཁ་སང] LT',\n            lastWeek: '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s ལ་',\n            past: '%s སྔན་ལ',\n            s: 'ལམ་སང',\n            ss: '%d སྐར་ཆ།',\n            m: 'སྐར་མ་གཅིག',\n            mm: '%d སྐར་མ',\n            h: 'ཆུ་ཚོད་གཅིག',\n            hh: '%d ཆུ་ཚོད',\n            d: 'ཉིན་གཅིག',\n            dd: '%d ཉིན་',\n            M: 'ཟླ་བ་གཅིག',\n            MM: '%d ཟླ་བ',\n            y: 'ལོ་གཅིག',\n            yy: '%d ལོ',\n        },\n        preparse: function (string) {\n            return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (\n                (meridiem === 'མཚན་མོ' && hour >= 4) ||\n                (meridiem === 'ཉིན་གུང' && hour < 5) ||\n                meridiem === 'དགོང་དག'\n            ) {\n                return hour + 12;\n            } else {\n                return hour;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'མཚན་མོ';\n            } else if (hour < 10) {\n                return 'ཞོགས་ཀས';\n            } else if (hour < 17) {\n                return 'ཉིན་གུང';\n            } else if (hour < 20) {\n                return 'དགོང་དག';\n            } else {\n                return 'མཚན་མོ';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return bo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Breton [br]\n//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function relativeTimeWithMutation(number, withoutSuffix, key) {\n        var format = {\n            mm: 'munutenn',\n            MM: 'miz',\n            dd: 'devezh',\n        };\n        return number + ' ' + mutation(format[key], number);\n    }\n    function specialMutationForYears(number) {\n        switch (lastNumber(number)) {\n            case 1:\n            case 3:\n            case 4:\n            case 5:\n            case 9:\n                return number + ' bloaz';\n            default:\n                return number + ' vloaz';\n        }\n    }\n    function lastNumber(number) {\n        if (number > 9) {\n            return lastNumber(number % 10);\n        }\n        return number;\n    }\n    function mutation(text, number) {\n        if (number === 2) {\n            return softMutation(text);\n        }\n        return text;\n    }\n    function softMutation(text) {\n        var mutationTable = {\n            m: 'v',\n            b: 'v',\n            d: 'z',\n        };\n        if (mutationTable[text.charAt(0)] === undefined) {\n            return text;\n        }\n        return mutationTable[text.charAt(0)] + text.substring(1);\n    }\n\n    var monthsParse = [\n            /^gen/i,\n            /^c[ʼ\\']hwe/i,\n            /^meu/i,\n            /^ebr/i,\n            /^mae/i,\n            /^(mez|eve)/i,\n            /^gou/i,\n            /^eos/i,\n            /^gwe/i,\n            /^her/i,\n            /^du/i,\n            /^ker/i,\n        ],\n        monthsRegex =\n            /^(genver|c[ʼ\\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,\n        monthsStrictRegex =\n            /^(genver|c[ʼ\\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,\n        monthsShortStrictRegex =\n            /^(gen|c[ʼ\\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,\n        fullWeekdaysParse = [\n            /^sul/i,\n            /^lun/i,\n            /^meurzh/i,\n            /^merc[ʼ\\']her/i,\n            /^yaou/i,\n            /^gwener/i,\n            /^sadorn/i,\n        ],\n        shortWeekdaysParse = [\n            /^Sul/i,\n            /^Lun/i,\n            /^Meu/i,\n            /^Mer/i,\n            /^Yao/i,\n            /^Gwe/i,\n            /^Sad/i,\n        ],\n        minWeekdaysParse = [\n            /^Su/i,\n            /^Lu/i,\n            /^Me([^r]|$)/i,\n            /^Mer/i,\n            /^Ya/i,\n            /^Gw/i,\n            /^Sa/i,\n        ];\n\n    var br = moment.defineLocale('br', {\n        months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split(\n            '_'\n        ),\n        monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),\n        weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),\n        weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),\n        weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),\n        weekdaysParse: minWeekdaysParse,\n        fullWeekdaysParse: fullWeekdaysParse,\n        shortWeekdaysParse: shortWeekdaysParse,\n        minWeekdaysParse: minWeekdaysParse,\n\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex: monthsStrictRegex,\n        monthsShortStrictRegex: monthsShortStrictRegex,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [a viz] MMMM YYYY',\n            LLL: 'D [a viz] MMMM YYYY HH:mm',\n            LLLL: 'dddd, D [a viz] MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Hiziv da] LT',\n            nextDay: '[Warcʼhoazh da] LT',\n            nextWeek: 'dddd [da] LT',\n            lastDay: '[Decʼh da] LT',\n            lastWeek: 'dddd [paset da] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'a-benn %s',\n            past: '%s ʼzo',\n            s: 'un nebeud segondennoù',\n            ss: '%d eilenn',\n            m: 'ur vunutenn',\n            mm: relativeTimeWithMutation,\n            h: 'un eur',\n            hh: '%d eur',\n            d: 'un devezh',\n            dd: relativeTimeWithMutation,\n            M: 'ur miz',\n            MM: relativeTimeWithMutation,\n            y: 'ur bloaz',\n            yy: specialMutationForYears,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(añ|vet)/,\n        ordinal: function (number) {\n            var output = number === 1 ? 'añ' : 'vet';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n        meridiemParse: /a.m.|g.m./, // goude merenn | a-raok merenn\n        isPM: function (token) {\n            return token === 'g.m.';\n        },\n        meridiem: function (hour, minute, isLower) {\n            return hour < 12 ? 'a.m.' : 'g.m.';\n        },\n    });\n\n    return br;\n\n})));\n","//! moment.js locale configuration\n//! locale : Bosnian [bs]\n//! author : Nedim Cholich : https://github.com/frontyard\n//! author : Rasid Redzic : https://github.com/rasidre\n//! based on (hr) translation by Bojan Marković\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        switch (key) {\n            case 'm':\n                return withoutSuffix\n                    ? 'jedna minuta'\n                    : isFuture\n                      ? 'jednu minutu'\n                      : 'jedne minute';\n        }\n    }\n\n    function translate(number, withoutSuffix, key) {\n        var result = number + ' ';\n        switch (key) {\n            case 'ss':\n                if (number === 1) {\n                    result += 'sekunda';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'sekunde';\n                } else {\n                    result += 'sekundi';\n                }\n                return result;\n            case 'mm':\n                if (number === 1) {\n                    result += 'minuta';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'minute';\n                } else {\n                    result += 'minuta';\n                }\n                return result;\n            case 'h':\n                return withoutSuffix ? 'jedan sat' : 'jedan sat';\n            case 'hh':\n                if (number === 1) {\n                    result += 'sat';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'sata';\n                } else {\n                    result += 'sati';\n                }\n                return result;\n            case 'dd':\n                if (number === 1) {\n                    result += 'dan';\n                } else {\n                    result += 'dana';\n                }\n                return result;\n            case 'MM':\n                if (number === 1) {\n                    result += 'mjesec';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'mjeseca';\n                } else {\n                    result += 'mjeseci';\n                }\n                return result;\n            case 'yy':\n                if (number === 1) {\n                    result += 'godina';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'godine';\n                } else {\n                    result += 'godina';\n                }\n                return result;\n        }\n    }\n\n    var bs = moment.defineLocale('bs', {\n        months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(\n            '_'\n        ),\n        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd, D. MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[danas u] LT',\n            nextDay: '[sutra u] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[u] [nedjelju] [u] LT';\n                    case 3:\n                        return '[u] [srijedu] [u] LT';\n                    case 6:\n                        return '[u] [subotu] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[u] dddd [u] LT';\n                }\n            },\n            lastDay: '[jučer u] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                    case 3:\n                        return '[prošlu] dddd [u] LT';\n                    case 6:\n                        return '[prošle] [subote] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[prošli] dddd [u] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'prije %s',\n            s: 'par sekundi',\n            ss: translate,\n            m: processRelativeTime,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: 'dan',\n            dd: translate,\n            M: 'mjesec',\n            MM: translate,\n            y: 'godinu',\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return bs;\n\n})));\n","//! moment.js locale configuration\n//! locale : Catalan [ca]\n//! author : Juan G. Hurtado : https://github.com/juanghurtado\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ca = moment.defineLocale('ca', {\n        months: {\n            standalone:\n                'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split(\n                    '_'\n                ),\n            format: \"de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre\".split(\n                '_'\n            ),\n            isFormat: /D[oD]?(\\s)+MMMM/,\n        },\n        monthsShort:\n            'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split(\n                '_'\n            ),\n        weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),\n        weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM [de] YYYY',\n            ll: 'D MMM YYYY',\n            LLL: 'D MMMM [de] YYYY [a les] H:mm',\n            lll: 'D MMM YYYY, H:mm',\n            LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',\n            llll: 'ddd D MMM YYYY, H:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[avui a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n            },\n            nextDay: function () {\n                return '[demà a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n            },\n            lastDay: function () {\n                return '[ahir a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [passat a ' +\n                    (this.hours() !== 1 ? 'les' : 'la') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: \"d'aquí %s\",\n            past: 'fa %s',\n            s: 'uns segons',\n            ss: '%d segons',\n            m: 'un minut',\n            mm: '%d minuts',\n            h: 'una hora',\n            hh: '%d hores',\n            d: 'un dia',\n            dd: '%d dies',\n            M: 'un mes',\n            MM: '%d mesos',\n            y: 'un any',\n            yy: '%d anys',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(r|n|t|è|a)/,\n        ordinal: function (number, period) {\n            var output =\n                number === 1\n                    ? 'r'\n                    : number === 2\n                      ? 'n'\n                      : number === 3\n                        ? 'r'\n                        : number === 4\n                          ? 't'\n                          : 'è';\n            if (period === 'w' || period === 'W') {\n                output = 'a';\n            }\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return ca;\n\n})));\n","//! moment.js locale configuration\n//! locale : Czech [cs]\n//! author : petrbela : https://github.com/petrbela\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = {\n            standalone:\n                'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split(\n                    '_'\n                ),\n            format: 'ledna_února_března_dubna_května_června_července_srpna_září_října_listopadu_prosince'.split(\n                '_'\n            ),\n            isFormat: /DD?[o.]?(\\[[^\\[\\]]*\\]|\\s)+MMMM/,\n        },\n        monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),\n        monthsParse = [\n            /^led/i,\n            /^úno/i,\n            /^bře/i,\n            /^dub/i,\n            /^kvě/i,\n            /^(čvn|červen$|června)/i,\n            /^(čvc|červenec|července)/i,\n            /^srp/i,\n            /^zář/i,\n            /^říj/i,\n            /^lis/i,\n            /^pro/i,\n        ],\n        // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.\n        // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.\n        monthsRegex =\n            /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;\n\n    function plural(n) {\n        return n > 1 && n < 5 && ~~(n / 10) !== 1;\n    }\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        switch (key) {\n            case 's': // a few seconds / in a few seconds / a few seconds ago\n                return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';\n            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'sekundy' : 'sekund');\n                } else {\n                    return result + 'sekundami';\n                }\n            case 'm': // a minute / in a minute / a minute ago\n                return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';\n            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'minuty' : 'minut');\n                } else {\n                    return result + 'minutami';\n                }\n            case 'h': // an hour / in an hour / an hour ago\n                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';\n            case 'hh': // 9 hours / in 9 hours / 9 hours ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'hodiny' : 'hodin');\n                } else {\n                    return result + 'hodinami';\n                }\n            case 'd': // a day / in a day / a day ago\n                return withoutSuffix || isFuture ? 'den' : 'dnem';\n            case 'dd': // 9 days / in 9 days / 9 days ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'dny' : 'dní');\n                } else {\n                    return result + 'dny';\n                }\n            case 'M': // a month / in a month / a month ago\n                return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';\n            case 'MM': // 9 months / in 9 months / 9 months ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'měsíce' : 'měsíců');\n                } else {\n                    return result + 'měsíci';\n                }\n            case 'y': // a year / in a year / a year ago\n                return withoutSuffix || isFuture ? 'rok' : 'rokem';\n            case 'yy': // 9 years / in 9 years / 9 years ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'roky' : 'let');\n                } else {\n                    return result + 'lety';\n                }\n        }\n    }\n\n    var cs = moment.defineLocale('cs', {\n        months: months,\n        monthsShort: monthsShort,\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.\n        // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.\n        monthsStrictRegex:\n            /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,\n        monthsShortStrictRegex:\n            /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),\n        weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),\n        weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd D. MMMM YYYY H:mm',\n            l: 'D. M. YYYY',\n        },\n        calendar: {\n            sameDay: '[dnes v] LT',\n            nextDay: '[zítra v] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[v neděli v] LT';\n                    case 1:\n                    case 2:\n                        return '[v] dddd [v] LT';\n                    case 3:\n                        return '[ve středu v] LT';\n                    case 4:\n                        return '[ve čtvrtek v] LT';\n                    case 5:\n                        return '[v pátek v] LT';\n                    case 6:\n                        return '[v sobotu v] LT';\n                }\n            },\n            lastDay: '[včera v] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[minulou neděli v] LT';\n                    case 1:\n                    case 2:\n                        return '[minulé] dddd [v] LT';\n                    case 3:\n                        return '[minulou středu v] LT';\n                    case 4:\n                    case 5:\n                        return '[minulý] dddd [v] LT';\n                    case 6:\n                        return '[minulou sobotu v] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'před %s',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return cs;\n\n})));\n","//! moment.js locale configuration\n//! locale : Chuvash [cv]\n//! author : Anatoly Mironov : https://github.com/mirontoli\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var cv = moment.defineLocale('cv', {\n        months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split(\n            '_'\n        ),\n        monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),\n        weekdays:\n            'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split(\n                '_'\n            ),\n        weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),\n        weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD-MM-YYYY',\n            LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',\n            LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',\n            LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',\n        },\n        calendar: {\n            sameDay: '[Паян] LT [сехетре]',\n            nextDay: '[Ыран] LT [сехетре]',\n            lastDay: '[Ӗнер] LT [сехетре]',\n            nextWeek: '[Ҫитес] dddd LT [сехетре]',\n            lastWeek: '[Иртнӗ] dddd LT [сехетре]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: function (output) {\n                var affix = /сехет$/i.exec(output)\n                    ? 'рен'\n                    : /ҫул$/i.exec(output)\n                      ? 'тан'\n                      : 'ран';\n                return output + affix;\n            },\n            past: '%s каялла',\n            s: 'пӗр-ик ҫеккунт',\n            ss: '%d ҫеккунт',\n            m: 'пӗр минут',\n            mm: '%d минут',\n            h: 'пӗр сехет',\n            hh: '%d сехет',\n            d: 'пӗр кун',\n            dd: '%d кун',\n            M: 'пӗр уйӑх',\n            MM: '%d уйӑх',\n            y: 'пӗр ҫул',\n            yy: '%d ҫул',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-мӗш/,\n        ordinal: '%d-мӗш',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return cv;\n\n})));\n","//! moment.js locale configuration\n//! locale : Welsh [cy]\n//! author : Robert Allen : https://github.com/robgallen\n//! author : https://github.com/ryangreaves\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var cy = moment.defineLocale('cy', {\n        months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split(\n            '_'\n        ),\n        monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split(\n            '_'\n        ),\n        weekdays:\n            'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split(\n                '_'\n            ),\n        weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),\n        weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),\n        weekdaysParseExact: true,\n        // time formats are the same as en-gb\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Heddiw am] LT',\n            nextDay: '[Yfory am] LT',\n            nextWeek: 'dddd [am] LT',\n            lastDay: '[Ddoe am] LT',\n            lastWeek: 'dddd [diwethaf am] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'mewn %s',\n            past: '%s yn ôl',\n            s: 'ychydig eiliadau',\n            ss: '%d eiliad',\n            m: 'munud',\n            mm: '%d munud',\n            h: 'awr',\n            hh: '%d awr',\n            d: 'diwrnod',\n            dd: '%d diwrnod',\n            M: 'mis',\n            MM: '%d mis',\n            y: 'blwyddyn',\n            yy: '%d flynedd',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,\n        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh\n        ordinal: function (number) {\n            var b = number,\n                output = '',\n                lookup = [\n                    '',\n                    'af',\n                    'il',\n                    'ydd',\n                    'ydd',\n                    'ed',\n                    'ed',\n                    'ed',\n                    'fed',\n                    'fed',\n                    'fed', // 1af to 10fed\n                    'eg',\n                    'fed',\n                    'eg',\n                    'eg',\n                    'fed',\n                    'eg',\n                    'eg',\n                    'fed',\n                    'eg',\n                    'fed', // 11eg to 20fed\n                ];\n            if (b > 20) {\n                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {\n                    output = 'fed'; // not 30ain, 70ain or 90ain\n                } else {\n                    output = 'ain';\n                }\n            } else if (b > 0) {\n                output = lookup[b];\n            }\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return cy;\n\n})));\n","//! moment.js locale configuration\n//! locale : Danish [da]\n//! author : Ulrik Nielsen : https://github.com/mrbase\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var da = moment.defineLocale('da', {\n        months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n        weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n        weekdaysShort: 'søn_man_tir_ons_tor_fre_lør'.split('_'),\n        weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY HH:mm',\n            LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm',\n        },\n        calendar: {\n            sameDay: '[i dag kl.] LT',\n            nextDay: '[i morgen kl.] LT',\n            nextWeek: 'på dddd [kl.] LT',\n            lastDay: '[i går kl.] LT',\n            lastWeek: '[i] dddd[s kl.] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'om %s',\n            past: '%s siden',\n            s: 'få sekunder',\n            ss: '%d sekunder',\n            m: 'et minut',\n            mm: '%d minutter',\n            h: 'en time',\n            hh: '%d timer',\n            d: 'en dag',\n            dd: '%d dage',\n            M: 'en måned',\n            MM: '%d måneder',\n            y: 'et år',\n            yy: '%d år',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return da;\n\n})));\n","//! moment.js locale configuration\n//! locale : German (Austria) [de-at]\n//! author : lluchs : https://github.com/lluchs\n//! author: Menelion Elensúle: https://github.com/Oire\n//! author : Martin Groller : https://github.com/MadMG\n//! author : Mikolaj Dadela : https://github.com/mik01aj\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            m: ['eine Minute', 'einer Minute'],\n            h: ['eine Stunde', 'einer Stunde'],\n            d: ['ein Tag', 'einem Tag'],\n            dd: [number + ' Tage', number + ' Tagen'],\n            w: ['eine Woche', 'einer Woche'],\n            M: ['ein Monat', 'einem Monat'],\n            MM: [number + ' Monate', number + ' Monaten'],\n            y: ['ein Jahr', 'einem Jahr'],\n            yy: [number + ' Jahre', number + ' Jahren'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n\n    var deAt = moment.defineLocale('de-at', {\n        months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n            '_'\n        ),\n        monthsShort:\n            'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n        monthsParseExact: true,\n        weekdays:\n            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(\n                '_'\n            ),\n        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY HH:mm',\n            LLLL: 'dddd, D. MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[heute um] LT [Uhr]',\n            sameElse: 'L',\n            nextDay: '[morgen um] LT [Uhr]',\n            nextWeek: 'dddd [um] LT [Uhr]',\n            lastDay: '[gestern um] LT [Uhr]',\n            lastWeek: '[letzten] dddd [um] LT [Uhr]',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: 'vor %s',\n            s: 'ein paar Sekunden',\n            ss: '%d Sekunden',\n            m: processRelativeTime,\n            mm: '%d Minuten',\n            h: processRelativeTime,\n            hh: '%d Stunden',\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            w: processRelativeTime,\n            ww: '%d Wochen',\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return deAt;\n\n})));\n","//! moment.js locale configuration\n//! locale : German (Switzerland) [de-ch]\n//! author : sschueller : https://github.com/sschueller\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            m: ['eine Minute', 'einer Minute'],\n            h: ['eine Stunde', 'einer Stunde'],\n            d: ['ein Tag', 'einem Tag'],\n            dd: [number + ' Tage', number + ' Tagen'],\n            w: ['eine Woche', 'einer Woche'],\n            M: ['ein Monat', 'einem Monat'],\n            MM: [number + ' Monate', number + ' Monaten'],\n            y: ['ein Jahr', 'einem Jahr'],\n            yy: [number + ' Jahre', number + ' Jahren'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n\n    var deCh = moment.defineLocale('de-ch', {\n        months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n            '_'\n        ),\n        monthsShort:\n            'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n        monthsParseExact: true,\n        weekdays:\n            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(\n                '_'\n            ),\n        weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY HH:mm',\n            LLLL: 'dddd, D. MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[heute um] LT [Uhr]',\n            sameElse: 'L',\n            nextDay: '[morgen um] LT [Uhr]',\n            nextWeek: 'dddd [um] LT [Uhr]',\n            lastDay: '[gestern um] LT [Uhr]',\n            lastWeek: '[letzten] dddd [um] LT [Uhr]',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: 'vor %s',\n            s: 'ein paar Sekunden',\n            ss: '%d Sekunden',\n            m: processRelativeTime,\n            mm: '%d Minuten',\n            h: processRelativeTime,\n            hh: '%d Stunden',\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            w: processRelativeTime,\n            ww: '%d Wochen',\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return deCh;\n\n})));\n","//! moment.js locale configuration\n//! locale : German [de]\n//! author : lluchs : https://github.com/lluchs\n//! author: Menelion Elensúle: https://github.com/Oire\n//! author : Mikolaj Dadela : https://github.com/mik01aj\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            m: ['eine Minute', 'einer Minute'],\n            h: ['eine Stunde', 'einer Stunde'],\n            d: ['ein Tag', 'einem Tag'],\n            dd: [number + ' Tage', number + ' Tagen'],\n            w: ['eine Woche', 'einer Woche'],\n            M: ['ein Monat', 'einem Monat'],\n            MM: [number + ' Monate', number + ' Monaten'],\n            y: ['ein Jahr', 'einem Jahr'],\n            yy: [number + ' Jahre', number + ' Jahren'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n\n    var de = moment.defineLocale('de', {\n        months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n            '_'\n        ),\n        monthsShort:\n            'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n        monthsParseExact: true,\n        weekdays:\n            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(\n                '_'\n            ),\n        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY HH:mm',\n            LLLL: 'dddd, D. MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[heute um] LT [Uhr]',\n            sameElse: 'L',\n            nextDay: '[morgen um] LT [Uhr]',\n            nextWeek: 'dddd [um] LT [Uhr]',\n            lastDay: '[gestern um] LT [Uhr]',\n            lastWeek: '[letzten] dddd [um] LT [Uhr]',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: 'vor %s',\n            s: 'ein paar Sekunden',\n            ss: '%d Sekunden',\n            m: processRelativeTime,\n            mm: '%d Minuten',\n            h: processRelativeTime,\n            hh: '%d Stunden',\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            w: processRelativeTime,\n            ww: '%d Wochen',\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return de;\n\n})));\n","//! moment.js locale configuration\n//! locale : Maldivian [dv]\n//! author : Jawish Hameed : https://github.com/jawish\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = [\n            'ޖެނުއަރީ',\n            'ފެބްރުއަރީ',\n            'މާރިޗު',\n            'އޭޕްރީލު',\n            'މޭ',\n            'ޖޫން',\n            'ޖުލައި',\n            'އޯގަސްޓު',\n            'ސެޕްޓެމްބަރު',\n            'އޮކްޓޯބަރު',\n            'ނޮވެމްބަރު',\n            'ޑިސެމްބަރު',\n        ],\n        weekdays = [\n            'އާދިއްތަ',\n            'ހޯމަ',\n            'އަންގާރަ',\n            'ބުދަ',\n            'ބުރާސްފަތި',\n            'ހުކުރު',\n            'ހޮނިހިރު',\n        ];\n\n    var dv = moment.defineLocale('dv', {\n        months: months,\n        monthsShort: months,\n        weekdays: weekdays,\n        weekdaysShort: weekdays,\n        weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'D/M/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /މކ|މފ/,\n        isPM: function (input) {\n            return 'މފ' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'މކ';\n            } else {\n                return 'މފ';\n            }\n        },\n        calendar: {\n            sameDay: '[މިއަދު] LT',\n            nextDay: '[މާދަމާ] LT',\n            nextWeek: 'dddd LT',\n            lastDay: '[އިއްޔެ] LT',\n            lastWeek: '[ފާއިތުވި] dddd LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'ތެރޭގައި %s',\n            past: 'ކުރިން %s',\n            s: 'ސިކުންތުކޮޅެއް',\n            ss: 'd% ސިކުންތު',\n            m: 'މިނިޓެއް',\n            mm: 'މިނިޓު %d',\n            h: 'ގަޑިއިރެއް',\n            hh: 'ގަޑިއިރު %d',\n            d: 'ދުވަހެއް',\n            dd: 'ދުވަސް %d',\n            M: 'މަހެއް',\n            MM: 'މަސް %d',\n            y: 'އަހަރެއް',\n            yy: 'އަހަރު %d',\n        },\n        preparse: function (string) {\n            return string.replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string.replace(/,/g, '،');\n        },\n        week: {\n            dow: 7, // Sunday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return dv;\n\n})));\n","//! moment.js locale configuration\n//! locale : Greek [el]\n//! author : Aggelos Karalias : https://github.com/mehiel\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function isFunction(input) {\n        return (\n            (typeof Function !== 'undefined' && input instanceof Function) ||\n            Object.prototype.toString.call(input) === '[object Function]'\n        );\n    }\n\n    var el = moment.defineLocale('el', {\n        monthsNominativeEl:\n            'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split(\n                '_'\n            ),\n        monthsGenitiveEl:\n            'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split(\n                '_'\n            ),\n        months: function (momentToFormat, format) {\n            if (!momentToFormat) {\n                return this._monthsNominativeEl;\n            } else if (\n                typeof format === 'string' &&\n                /D/.test(format.substring(0, format.indexOf('MMMM')))\n            ) {\n                // if there is a day number before 'MMMM'\n                return this._monthsGenitiveEl[momentToFormat.month()];\n            } else {\n                return this._monthsNominativeEl[momentToFormat.month()];\n            }\n        },\n        monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),\n        weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split(\n            '_'\n        ),\n        weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),\n        weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),\n        meridiem: function (hours, minutes, isLower) {\n            if (hours > 11) {\n                return isLower ? 'μμ' : 'ΜΜ';\n            } else {\n                return isLower ? 'πμ' : 'ΠΜ';\n            }\n        },\n        isPM: function (input) {\n            return (input + '').toLowerCase()[0] === 'μ';\n        },\n        meridiemParse: /[ΠΜ]\\.?Μ?\\.?/i,\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendarEl: {\n            sameDay: '[Σήμερα {}] LT',\n            nextDay: '[Αύριο {}] LT',\n            nextWeek: 'dddd [{}] LT',\n            lastDay: '[Χθες {}] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 6:\n                        return '[το προηγούμενο] dddd [{}] LT';\n                    default:\n                        return '[την προηγούμενη] dddd [{}] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        calendar: function (key, mom) {\n            var output = this._calendarEl[key],\n                hours = mom && mom.hours();\n            if (isFunction(output)) {\n                output = output.apply(mom);\n            }\n            return output.replace('{}', hours % 12 === 1 ? 'στη' : 'στις');\n        },\n        relativeTime: {\n            future: 'σε %s',\n            past: '%s πριν',\n            s: 'λίγα δευτερόλεπτα',\n            ss: '%d δευτερόλεπτα',\n            m: 'ένα λεπτό',\n            mm: '%d λεπτά',\n            h: 'μία ώρα',\n            hh: '%d ώρες',\n            d: 'μία μέρα',\n            dd: '%d μέρες',\n            M: 'ένας μήνας',\n            MM: '%d μήνες',\n            y: 'ένας χρόνος',\n            yy: '%d χρόνια',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}η/,\n        ordinal: '%dη',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4st is the first week of the year.\n        },\n    });\n\n    return el;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (Australia) [en-au]\n//! author : Jared Morse : https://github.com/jarcoal\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enAu = moment.defineLocale('en-au', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enAu;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (Canada) [en-ca]\n//! author : Jonathan Abourbih : https://github.com/jonbca\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enCa = moment.defineLocale('en-ca', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'YYYY-MM-DD',\n            LL: 'MMMM D, YYYY',\n            LLL: 'MMMM D, YYYY h:mm A',\n            LLLL: 'dddd, MMMM D, YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n    });\n\n    return enCa;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (United Kingdom) [en-gb]\n//! author : Chris Gedrim : https://github.com/chrisgedrim\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enGb = moment.defineLocale('en-gb', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enGb;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (Ireland) [en-ie]\n//! author : Chris Cartlidge : https://github.com/chriscartlidge\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enIe = moment.defineLocale('en-ie', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enIe;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (Israel) [en-il]\n//! author : Chris Gedrim : https://github.com/chrisgedrim\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enIl = moment.defineLocale('en-il', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n    });\n\n    return enIl;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (India) [en-in]\n//! author : Jatin Agrawal : https://github.com/jatinag22\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enIn = moment.defineLocale('en-in', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 1st is the first week of the year.\n        },\n    });\n\n    return enIn;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (New Zealand) [en-nz]\n//! author : Luke McGregor : https://github.com/lukemcgregor\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enNz = moment.defineLocale('en-nz', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enNz;\n\n})));\n","//! moment.js locale configuration\n//! locale : English (Singapore) [en-sg]\n//! author : Matthew Castrillon-Madrigal : https://github.com/techdimension\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enSg = moment.defineLocale('en-sg', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enSg;\n\n})));\n","//! moment.js locale configuration\n//! locale : Esperanto [eo]\n//! author : Colin Dean : https://github.com/colindean\n//! author : Mia Nordentoft Imperatori : https://github.com/miestasmia\n//! comment : miestasmia corrected the translation by colindean\n//! comment : Vivakvo corrected the translation by colindean and miestasmia\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var eo = moment.defineLocale('eo', {\n        months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec'.split('_'),\n        weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),\n        weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),\n        weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: '[la] D[-an de] MMMM, YYYY',\n            LLL: '[la] D[-an de] MMMM, YYYY HH:mm',\n            LLLL: 'dddd[n], [la] D[-an de] MMMM, YYYY HH:mm',\n            llll: 'ddd, [la] D[-an de] MMM, YYYY HH:mm',\n        },\n        meridiemParse: /[ap]\\.t\\.m/i,\n        isPM: function (input) {\n            return input.charAt(0).toLowerCase() === 'p';\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours > 11) {\n                return isLower ? 'p.t.m.' : 'P.T.M.';\n            } else {\n                return isLower ? 'a.t.m.' : 'A.T.M.';\n            }\n        },\n        calendar: {\n            sameDay: '[Hodiaŭ je] LT',\n            nextDay: '[Morgaŭ je] LT',\n            nextWeek: 'dddd[n je] LT',\n            lastDay: '[Hieraŭ je] LT',\n            lastWeek: '[pasintan] dddd[n je] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'post %s',\n            past: 'antaŭ %s',\n            s: 'kelkaj sekundoj',\n            ss: '%d sekundoj',\n            m: 'unu minuto',\n            mm: '%d minutoj',\n            h: 'unu horo',\n            hh: '%d horoj',\n            d: 'unu tago', //ne 'diurno', ĉar estas uzita por proksimumo\n            dd: '%d tagoj',\n            M: 'unu monato',\n            MM: '%d monatoj',\n            y: 'unu jaro',\n            yy: '%d jaroj',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}a/,\n        ordinal: '%da',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return eo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Spanish (Dominican Republic) [es-do]\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortDot =\n            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n                '_'\n            ),\n        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n        monthsParse = [\n            /^ene/i,\n            /^feb/i,\n            /^mar/i,\n            /^abr/i,\n            /^may/i,\n            /^jun/i,\n            /^jul/i,\n            /^ago/i,\n            /^sep/i,\n            /^oct/i,\n            /^nov/i,\n            /^dic/i,\n        ],\n        monthsRegex =\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n    var esDo = moment.defineLocale('es-do', {\n        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortDot;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShort[m.month()];\n            } else {\n                return monthsShortDot[m.month()];\n            }\n        },\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n        monthsShortStrictRegex:\n            /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY h:mm A',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextDay: function () {\n                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastDay: function () {\n                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [pasado a la' +\n                    (this.hours() !== 1 ? 's' : '') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'en %s',\n            past: 'hace %s',\n            s: 'unos segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'una hora',\n            hh: '%d horas',\n            d: 'un día',\n            dd: '%d días',\n            w: 'una semana',\n            ww: '%d semanas',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un año',\n            yy: '%d años',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return esDo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Spanish (Mexico) [es-mx]\n//! author : JC Franco : https://github.com/jcfranco\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortDot =\n            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n                '_'\n            ),\n        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n        monthsParse = [\n            /^ene/i,\n            /^feb/i,\n            /^mar/i,\n            /^abr/i,\n            /^may/i,\n            /^jun/i,\n            /^jul/i,\n            /^ago/i,\n            /^sep/i,\n            /^oct/i,\n            /^nov/i,\n            /^dic/i,\n        ],\n        monthsRegex =\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n    var esMx = moment.defineLocale('es-mx', {\n        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortDot;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShort[m.month()];\n            } else {\n                return monthsShortDot[m.month()];\n            }\n        },\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n        monthsShortStrictRegex:\n            /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY H:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextDay: function () {\n                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastDay: function () {\n                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [pasado a la' +\n                    (this.hours() !== 1 ? 's' : '') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'en %s',\n            past: 'hace %s',\n            s: 'unos segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'una hora',\n            hh: '%d horas',\n            d: 'un día',\n            dd: '%d días',\n            w: 'una semana',\n            ww: '%d semanas',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un año',\n            yy: '%d años',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n        invalidDate: 'Fecha inválida',\n    });\n\n    return esMx;\n\n})));\n","//! moment.js locale configuration\n//! locale : Spanish (United States) [es-us]\n//! author : bustta : https://github.com/bustta\n//! author : chrisrodz : https://github.com/chrisrodz\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortDot =\n            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n                '_'\n            ),\n        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n        monthsParse = [\n            /^ene/i,\n            /^feb/i,\n            /^mar/i,\n            /^abr/i,\n            /^may/i,\n            /^jun/i,\n            /^jul/i,\n            /^ago/i,\n            /^sep/i,\n            /^oct/i,\n            /^nov/i,\n            /^dic/i,\n        ],\n        monthsRegex =\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n    var esUs = moment.defineLocale('es-us', {\n        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortDot;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShort[m.month()];\n            } else {\n                return monthsShortDot[m.month()];\n            }\n        },\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n        monthsShortStrictRegex:\n            /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'MM/DD/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY h:mm A',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextDay: function () {\n                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastDay: function () {\n                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [pasado a la' +\n                    (this.hours() !== 1 ? 's' : '') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'en %s',\n            past: 'hace %s',\n            s: 'unos segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'una hora',\n            hh: '%d horas',\n            d: 'un día',\n            dd: '%d días',\n            w: 'una semana',\n            ww: '%d semanas',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un año',\n            yy: '%d años',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return esUs;\n\n})));\n","//! moment.js locale configuration\n//! locale : Spanish [es]\n//! author : Julio Napurí : https://github.com/julionc\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortDot =\n            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n                '_'\n            ),\n        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n        monthsParse = [\n            /^ene/i,\n            /^feb/i,\n            /^mar/i,\n            /^abr/i,\n            /^may/i,\n            /^jun/i,\n            /^jul/i,\n            /^ago/i,\n            /^sep/i,\n            /^oct/i,\n            /^nov/i,\n            /^dic/i,\n        ],\n        monthsRegex =\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n    var es = moment.defineLocale('es', {\n        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortDot;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShort[m.month()];\n            } else {\n                return monthsShortDot[m.month()];\n            }\n        },\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n        monthsShortStrictRegex:\n            /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY H:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextDay: function () {\n                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastDay: function () {\n                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [pasado a la' +\n                    (this.hours() !== 1 ? 's' : '') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'en %s',\n            past: 'hace %s',\n            s: 'unos segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'una hora',\n            hh: '%d horas',\n            d: 'un día',\n            dd: '%d días',\n            w: 'una semana',\n            ww: '%d semanas',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un año',\n            yy: '%d años',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n        invalidDate: 'Fecha inválida',\n    });\n\n    return es;\n\n})));\n","//! moment.js locale configuration\n//! locale : Estonian [et]\n//! author : Henry Kehlmann : https://github.com/madhenry\n//! improvements : Illimar Tambek : https://github.com/ragulka\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            s: ['mõne sekundi', 'mõni sekund', 'paar sekundit'],\n            ss: [number + 'sekundi', number + 'sekundit'],\n            m: ['ühe minuti', 'üks minut'],\n            mm: [number + ' minuti', number + ' minutit'],\n            h: ['ühe tunni', 'tund aega', 'üks tund'],\n            hh: [number + ' tunni', number + ' tundi'],\n            d: ['ühe päeva', 'üks päev'],\n            M: ['kuu aja', 'kuu aega', 'üks kuu'],\n            MM: [number + ' kuu', number + ' kuud'],\n            y: ['ühe aasta', 'aasta', 'üks aasta'],\n            yy: [number + ' aasta', number + ' aastat'],\n        };\n        if (withoutSuffix) {\n            return format[key][2] ? format[key][2] : format[key][1];\n        }\n        return isFuture ? format[key][0] : format[key][1];\n    }\n\n    var et = moment.defineLocale('et', {\n        months: 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split(\n            '_'\n        ),\n        monthsShort:\n            'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),\n        weekdays:\n            'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split(\n                '_'\n            ),\n        weekdaysShort: 'P_E_T_K_N_R_L'.split('_'),\n        weekdaysMin: 'P_E_T_K_N_R_L'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd, D. MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[Täna,] LT',\n            nextDay: '[Homme,] LT',\n            nextWeek: '[Järgmine] dddd LT',\n            lastDay: '[Eile,] LT',\n            lastWeek: '[Eelmine] dddd LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s pärast',\n            past: '%s tagasi',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: '%d päeva',\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return et;\n\n})));\n","//! moment.js locale configuration\n//! locale : Basque [eu]\n//! author : Eneko Illarramendi : https://github.com/eillarra\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var eu = moment.defineLocale('eu', {\n        months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split(\n            '_'\n        ),\n        monthsShort:\n            'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split(\n                '_'\n            ),\n        weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),\n        weekdaysMin: 'ig_al_ar_az_og_ol_lr'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'YYYY[ko] MMMM[ren] D[a]',\n            LLL: 'YYYY[ko] MMMM[ren] D[a] HH:mm',\n            LLLL: 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',\n            l: 'YYYY-M-D',\n            ll: 'YYYY[ko] MMM D[a]',\n            lll: 'YYYY[ko] MMM D[a] HH:mm',\n            llll: 'ddd, YYYY[ko] MMM D[a] HH:mm',\n        },\n        calendar: {\n            sameDay: '[gaur] LT[etan]',\n            nextDay: '[bihar] LT[etan]',\n            nextWeek: 'dddd LT[etan]',\n            lastDay: '[atzo] LT[etan]',\n            lastWeek: '[aurreko] dddd LT[etan]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s barru',\n            past: 'duela %s',\n            s: 'segundo batzuk',\n            ss: '%d segundo',\n            m: 'minutu bat',\n            mm: '%d minutu',\n            h: 'ordu bat',\n            hh: '%d ordu',\n            d: 'egun bat',\n            dd: '%d egun',\n            M: 'hilabete bat',\n            MM: '%d hilabete',\n            y: 'urte bat',\n            yy: '%d urte',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return eu;\n\n})));\n","//! moment.js locale configuration\n//! locale : Persian [fa]\n//! author : Ebrahim Byagowi : https://github.com/ebraminio\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '۱',\n            2: '۲',\n            3: '۳',\n            4: '۴',\n            5: '۵',\n            6: '۶',\n            7: '۷',\n            8: '۸',\n            9: '۹',\n            0: '۰',\n        },\n        numberMap = {\n            '۱': '1',\n            '۲': '2',\n            '۳': '3',\n            '۴': '4',\n            '۵': '5',\n            '۶': '6',\n            '۷': '7',\n            '۸': '8',\n            '۹': '9',\n            '۰': '0',\n        };\n\n    var fa = moment.defineLocale('fa', {\n        months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(\n            '_'\n        ),\n        monthsShort:\n            'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(\n                '_'\n            ),\n        weekdays:\n            'یک\\u200cشنبه_دوشنبه_سه\\u200cشنبه_چهارشنبه_پنج\\u200cشنبه_جمعه_شنبه'.split(\n                '_'\n            ),\n        weekdaysShort:\n            'یک\\u200cشنبه_دوشنبه_سه\\u200cشنبه_چهارشنبه_پنج\\u200cشنبه_جمعه_شنبه'.split(\n                '_'\n            ),\n        weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /قبل از ظهر|بعد از ظهر/,\n        isPM: function (input) {\n            return /بعد از ظهر/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'قبل از ظهر';\n            } else {\n                return 'بعد از ظهر';\n            }\n        },\n        calendar: {\n            sameDay: '[امروز ساعت] LT',\n            nextDay: '[فردا ساعت] LT',\n            nextWeek: 'dddd [ساعت] LT',\n            lastDay: '[دیروز ساعت] LT',\n            lastWeek: 'dddd [پیش] [ساعت] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'در %s',\n            past: '%s پیش',\n            s: 'چند ثانیه',\n            ss: '%d ثانیه',\n            m: 'یک دقیقه',\n            mm: '%d دقیقه',\n            h: 'یک ساعت',\n            hh: '%d ساعت',\n            d: 'یک روز',\n            dd: '%d روز',\n            M: 'یک ماه',\n            MM: '%d ماه',\n            y: 'یک سال',\n            yy: '%d سال',\n        },\n        preparse: function (string) {\n            return string\n                .replace(/[۰-۹]/g, function (match) {\n                    return numberMap[match];\n                })\n                .replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}م/,\n        ordinal: '%dم',\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return fa;\n\n})));\n","//! moment.js locale configuration\n//! locale : Finnish [fi]\n//! author : Tarmo Aidantausta : https://github.com/bleadof\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var numbersPast =\n            'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(\n                ' '\n            ),\n        numbersFuture = [\n            'nolla',\n            'yhden',\n            'kahden',\n            'kolmen',\n            'neljän',\n            'viiden',\n            'kuuden',\n            numbersPast[7],\n            numbersPast[8],\n            numbersPast[9],\n        ];\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = '';\n        switch (key) {\n            case 's':\n                return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';\n            case 'ss':\n                result = isFuture ? 'sekunnin' : 'sekuntia';\n                break;\n            case 'm':\n                return isFuture ? 'minuutin' : 'minuutti';\n            case 'mm':\n                result = isFuture ? 'minuutin' : 'minuuttia';\n                break;\n            case 'h':\n                return isFuture ? 'tunnin' : 'tunti';\n            case 'hh':\n                result = isFuture ? 'tunnin' : 'tuntia';\n                break;\n            case 'd':\n                return isFuture ? 'päivän' : 'päivä';\n            case 'dd':\n                result = isFuture ? 'päivän' : 'päivää';\n                break;\n            case 'M':\n                return isFuture ? 'kuukauden' : 'kuukausi';\n            case 'MM':\n                result = isFuture ? 'kuukauden' : 'kuukautta';\n                break;\n            case 'y':\n                return isFuture ? 'vuoden' : 'vuosi';\n            case 'yy':\n                result = isFuture ? 'vuoden' : 'vuotta';\n                break;\n        }\n        result = verbalNumber(number, isFuture) + ' ' + result;\n        return result;\n    }\n    function verbalNumber(number, isFuture) {\n        return number < 10\n            ? isFuture\n                ? numbersFuture[number]\n                : numbersPast[number]\n            : number;\n    }\n\n    var fi = moment.defineLocale('fi', {\n        months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split(\n            '_'\n        ),\n        monthsShort:\n            'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split(\n                '_'\n            ),\n        weekdays:\n            'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split(\n                '_'\n            ),\n        weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'),\n        weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD.MM.YYYY',\n            LL: 'Do MMMM[ta] YYYY',\n            LLL: 'Do MMMM[ta] YYYY, [klo] HH.mm',\n            LLLL: 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',\n            l: 'D.M.YYYY',\n            ll: 'Do MMM YYYY',\n            lll: 'Do MMM YYYY, [klo] HH.mm',\n            llll: 'ddd, Do MMM YYYY, [klo] HH.mm',\n        },\n        calendar: {\n            sameDay: '[tänään] [klo] LT',\n            nextDay: '[huomenna] [klo] LT',\n            nextWeek: 'dddd [klo] LT',\n            lastDay: '[eilen] [klo] LT',\n            lastWeek: '[viime] dddd[na] [klo] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s päästä',\n            past: '%s sitten',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fi;\n\n})));\n","//! moment.js locale configuration\n//! locale : Filipino [fil]\n//! author : Dan Hagman : https://github.com/hagmandan\n//! author : Matthew Co : https://github.com/matthewdeeco\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var fil = moment.defineLocale('fil', {\n        months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(\n            '_'\n        ),\n        monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),\n        weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(\n            '_'\n        ),\n        weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),\n        weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'MM/D/YYYY',\n            LL: 'MMMM D, YYYY',\n            LLL: 'MMMM D, YYYY HH:mm',\n            LLLL: 'dddd, MMMM DD, YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: 'LT [ngayong araw]',\n            nextDay: '[Bukas ng] LT',\n            nextWeek: 'LT [sa susunod na] dddd',\n            lastDay: 'LT [kahapon]',\n            lastWeek: 'LT [noong nakaraang] dddd',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'sa loob ng %s',\n            past: '%s ang nakalipas',\n            s: 'ilang segundo',\n            ss: '%d segundo',\n            m: 'isang minuto',\n            mm: '%d minuto',\n            h: 'isang oras',\n            hh: '%d oras',\n            d: 'isang araw',\n            dd: '%d araw',\n            M: 'isang buwan',\n            MM: '%d buwan',\n            y: 'isang taon',\n            yy: '%d taon',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}/,\n        ordinal: function (number) {\n            return number;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fil;\n\n})));\n","//! moment.js locale configuration\n//! locale : Faroese [fo]\n//! author : Ragnar Johannesen : https://github.com/ragnar123\n//! author : Kristian Sakarisson : https://github.com/sakarisson\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var fo = moment.defineLocale('fo', {\n        months: 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),\n        weekdays:\n            'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split(\n                '_'\n            ),\n        weekdaysShort: 'sun_mán_týs_mik_hós_frí_ley'.split('_'),\n        weekdaysMin: 'su_má_tý_mi_hó_fr_le'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D. MMMM, YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Í dag kl.] LT',\n            nextDay: '[Í morgin kl.] LT',\n            nextWeek: 'dddd [kl.] LT',\n            lastDay: '[Í gjár kl.] LT',\n            lastWeek: '[síðstu] dddd [kl] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'um %s',\n            past: '%s síðani',\n            s: 'fá sekund',\n            ss: '%d sekundir',\n            m: 'ein minuttur',\n            mm: '%d minuttir',\n            h: 'ein tími',\n            hh: '%d tímar',\n            d: 'ein dagur',\n            dd: '%d dagar',\n            M: 'ein mánaður',\n            MM: '%d mánaðir',\n            y: 'eitt ár',\n            yy: '%d ár',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fo;\n\n})));\n","//! moment.js locale configuration\n//! locale : French (Canada) [fr-ca]\n//! author : Jonathan Abourbih : https://github.com/jonbca\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var frCa = moment.defineLocale('fr-ca', {\n        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(\n            '_'\n        ),\n        monthsShort:\n            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Aujourd’hui à] LT',\n            nextDay: '[Demain à] LT',\n            nextWeek: 'dddd [à] LT',\n            lastDay: '[Hier à] LT',\n            lastWeek: 'dddd [dernier à] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dans %s',\n            past: 'il y a %s',\n            s: 'quelques secondes',\n            ss: '%d secondes',\n            m: 'une minute',\n            mm: '%d minutes',\n            h: 'une heure',\n            hh: '%d heures',\n            d: 'un jour',\n            dd: '%d jours',\n            M: 'un mois',\n            MM: '%d mois',\n            y: 'un an',\n            yy: '%d ans',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // Words with masculine grammatical gender: mois, trimestre, jour\n                default:\n                case 'M':\n                case 'Q':\n                case 'D':\n                case 'DDD':\n                case 'd':\n                    return number + (number === 1 ? 'er' : 'e');\n\n                // Words with feminine grammatical gender: semaine\n                case 'w':\n                case 'W':\n                    return number + (number === 1 ? 're' : 'e');\n            }\n        },\n    });\n\n    return frCa;\n\n})));\n","//! moment.js locale configuration\n//! locale : French (Switzerland) [fr-ch]\n//! author : Gaspard Bucher : https://github.com/gaspard\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var frCh = moment.defineLocale('fr-ch', {\n        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(\n            '_'\n        ),\n        monthsShort:\n            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Aujourd’hui à] LT',\n            nextDay: '[Demain à] LT',\n            nextWeek: 'dddd [à] LT',\n            lastDay: '[Hier à] LT',\n            lastWeek: 'dddd [dernier à] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dans %s',\n            past: 'il y a %s',\n            s: 'quelques secondes',\n            ss: '%d secondes',\n            m: 'une minute',\n            mm: '%d minutes',\n            h: 'une heure',\n            hh: '%d heures',\n            d: 'un jour',\n            dd: '%d jours',\n            M: 'un mois',\n            MM: '%d mois',\n            y: 'un an',\n            yy: '%d ans',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // Words with masculine grammatical gender: mois, trimestre, jour\n                default:\n                case 'M':\n                case 'Q':\n                case 'D':\n                case 'DDD':\n                case 'd':\n                    return number + (number === 1 ? 'er' : 'e');\n\n                // Words with feminine grammatical gender: semaine\n                case 'w':\n                case 'W':\n                    return number + (number === 1 ? 're' : 'e');\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return frCh;\n\n})));\n","//! moment.js locale configuration\n//! locale : French [fr]\n//! author : John Fischer : https://github.com/jfroffice\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsStrictRegex =\n            /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,\n        monthsShortStrictRegex =\n            /(janv\\.?|févr\\.?|mars|avr\\.?|mai|juin|juil\\.?|août|sept\\.?|oct\\.?|nov\\.?|déc\\.?)/i,\n        monthsRegex =\n            /(janv\\.?|févr\\.?|mars|avr\\.?|mai|juin|juil\\.?|août|sept\\.?|oct\\.?|nov\\.?|déc\\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,\n        monthsParse = [\n            /^janv/i,\n            /^févr/i,\n            /^mars/i,\n            /^avr/i,\n            /^mai/i,\n            /^juin/i,\n            /^juil/i,\n            /^août/i,\n            /^sept/i,\n            /^oct/i,\n            /^nov/i,\n            /^déc/i,\n        ];\n\n    var fr = moment.defineLocale('fr', {\n        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(\n            '_'\n        ),\n        monthsShort:\n            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(\n                '_'\n            ),\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex: monthsStrictRegex,\n        monthsShortStrictRegex: monthsShortStrictRegex,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Aujourd’hui à] LT',\n            nextDay: '[Demain à] LT',\n            nextWeek: 'dddd [à] LT',\n            lastDay: '[Hier à] LT',\n            lastWeek: 'dddd [dernier à] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dans %s',\n            past: 'il y a %s',\n            s: 'quelques secondes',\n            ss: '%d secondes',\n            m: 'une minute',\n            mm: '%d minutes',\n            h: 'une heure',\n            hh: '%d heures',\n            d: 'un jour',\n            dd: '%d jours',\n            w: 'une semaine',\n            ww: '%d semaines',\n            M: 'un mois',\n            MM: '%d mois',\n            y: 'un an',\n            yy: '%d ans',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(er|)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // TODO: Return 'e' when day of month > 1. Move this case inside\n                // block for masculine words below.\n                // See https://github.com/moment/moment/issues/3375\n                case 'D':\n                    return number + (number === 1 ? 'er' : '');\n\n                // Words with masculine grammatical gender: mois, trimestre, jour\n                default:\n                case 'M':\n                case 'Q':\n                case 'DDD':\n                case 'd':\n                    return number + (number === 1 ? 'er' : 'e');\n\n                // Words with feminine grammatical gender: semaine\n                case 'w':\n                case 'W':\n                    return number + (number === 1 ? 're' : 'e');\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Frisian [fy]\n//! author : Robin van der Vliet : https://github.com/robin0van0der0v\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortWithDots =\n            'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),\n        monthsShortWithoutDots =\n            'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');\n\n    var fy = moment.defineLocale('fy', {\n        months: 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortWithDots;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShortWithoutDots[m.month()];\n            } else {\n                return monthsShortWithDots[m.month()];\n            }\n        },\n        monthsParseExact: true,\n        weekdays: 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split(\n            '_'\n        ),\n        weekdaysShort: 'si._mo._ti._wo._to._fr._so.'.split('_'),\n        weekdaysMin: 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD-MM-YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[hjoed om] LT',\n            nextDay: '[moarn om] LT',\n            nextWeek: 'dddd [om] LT',\n            lastDay: '[juster om] LT',\n            lastWeek: '[ôfrûne] dddd [om] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'oer %s',\n            past: '%s lyn',\n            s: 'in pear sekonden',\n            ss: '%d sekonden',\n            m: 'ien minút',\n            mm: '%d minuten',\n            h: 'ien oere',\n            hh: '%d oeren',\n            d: 'ien dei',\n            dd: '%d dagen',\n            M: 'ien moanne',\n            MM: '%d moannen',\n            y: 'ien jier',\n            yy: '%d jierren',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n        ordinal: function (number) {\n            return (\n                number +\n                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n            );\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fy;\n\n})));\n","//! moment.js locale configuration\n//! locale : Irish or Irish Gaelic [ga]\n//! author : André Silva : https://github.com/askpt\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = [\n            'Eanáir',\n            'Feabhra',\n            'Márta',\n            'Aibreán',\n            'Bealtaine',\n            'Meitheamh',\n            'Iúil',\n            'Lúnasa',\n            'Meán Fómhair',\n            'Deireadh Fómhair',\n            'Samhain',\n            'Nollaig',\n        ],\n        monthsShort = [\n            'Ean',\n            'Feabh',\n            'Márt',\n            'Aib',\n            'Beal',\n            'Meith',\n            'Iúil',\n            'Lún',\n            'M.F.',\n            'D.F.',\n            'Samh',\n            'Noll',\n        ],\n        weekdays = [\n            'Dé Domhnaigh',\n            'Dé Luain',\n            'Dé Máirt',\n            'Dé Céadaoin',\n            'Déardaoin',\n            'Dé hAoine',\n            'Dé Sathairn',\n        ],\n        weekdaysShort = ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],\n        weekdaysMin = ['Do', 'Lu', 'Má', 'Cé', 'Dé', 'A', 'Sa'];\n\n    var ga = moment.defineLocale('ga', {\n        months: months,\n        monthsShort: monthsShort,\n        monthsParseExact: true,\n        weekdays: weekdays,\n        weekdaysShort: weekdaysShort,\n        weekdaysMin: weekdaysMin,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Inniu ag] LT',\n            nextDay: '[Amárach ag] LT',\n            nextWeek: 'dddd [ag] LT',\n            lastDay: '[Inné ag] LT',\n            lastWeek: 'dddd [seo caite] [ag] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'i %s',\n            past: '%s ó shin',\n            s: 'cúpla soicind',\n            ss: '%d soicind',\n            m: 'nóiméad',\n            mm: '%d nóiméad',\n            h: 'uair an chloig',\n            hh: '%d uair an chloig',\n            d: 'lá',\n            dd: '%d lá',\n            M: 'mí',\n            MM: '%d míonna',\n            y: 'bliain',\n            yy: '%d bliain',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(d|na|mh)/,\n        ordinal: function (number) {\n            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return ga;\n\n})));\n","//! moment.js locale configuration\n//! locale : Scottish Gaelic [gd]\n//! author : Jon Ashdown : https://github.com/jonashdown\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = [\n            'Am Faoilleach',\n            'An Gearran',\n            'Am Màrt',\n            'An Giblean',\n            'An Cèitean',\n            'An t-Ògmhios',\n            'An t-Iuchar',\n            'An Lùnastal',\n            'An t-Sultain',\n            'An Dàmhair',\n            'An t-Samhain',\n            'An Dùbhlachd',\n        ],\n        monthsShort = [\n            'Faoi',\n            'Gear',\n            'Màrt',\n            'Gibl',\n            'Cèit',\n            'Ògmh',\n            'Iuch',\n            'Lùn',\n            'Sult',\n            'Dàmh',\n            'Samh',\n            'Dùbh',\n        ],\n        weekdays = [\n            'Didòmhnaich',\n            'Diluain',\n            'Dimàirt',\n            'Diciadain',\n            'Diardaoin',\n            'Dihaoine',\n            'Disathairne',\n        ],\n        weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'],\n        weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];\n\n    var gd = moment.defineLocale('gd', {\n        months: months,\n        monthsShort: monthsShort,\n        monthsParseExact: true,\n        weekdays: weekdays,\n        weekdaysShort: weekdaysShort,\n        weekdaysMin: weekdaysMin,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[An-diugh aig] LT',\n            nextDay: '[A-màireach aig] LT',\n            nextWeek: 'dddd [aig] LT',\n            lastDay: '[An-dè aig] LT',\n            lastWeek: 'dddd [seo chaidh] [aig] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'ann an %s',\n            past: 'bho chionn %s',\n            s: 'beagan diogan',\n            ss: '%d diogan',\n            m: 'mionaid',\n            mm: '%d mionaidean',\n            h: 'uair',\n            hh: '%d uairean',\n            d: 'latha',\n            dd: '%d latha',\n            M: 'mìos',\n            MM: '%d mìosan',\n            y: 'bliadhna',\n            yy: '%d bliadhna',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(d|na|mh)/,\n        ordinal: function (number) {\n            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return gd;\n\n})));\n","//! moment.js locale configuration\n//! locale : Galician [gl]\n//! author : Juan G. Hurtado : https://github.com/juanghurtado\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var gl = moment.defineLocale('gl', {\n        months: 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split(\n            '_'\n        ),\n        monthsShort:\n            'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mé_xo_ve_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY H:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoxe ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';\n            },\n            nextDay: function () {\n                return '[mañá ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT';\n            },\n            lastDay: function () {\n                return '[onte ' + (this.hours() !== 1 ? 'á' : 'a') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[o] dddd [pasado ' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: function (str) {\n                if (str.indexOf('un') === 0) {\n                    return 'n' + str;\n                }\n                return 'en ' + str;\n            },\n            past: 'hai %s',\n            s: 'uns segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'unha hora',\n            hh: '%d horas',\n            d: 'un día',\n            dd: '%d días',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un ano',\n            yy: '%d anos',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return gl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Konkani Devanagari script [gom-deva]\n//! author : The Discoverer : https://github.com/WikiDiscoverer\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            s: ['थोडया सॅकंडांनी', 'थोडे सॅकंड'],\n            ss: [number + ' सॅकंडांनी', number + ' सॅकंड'],\n            m: ['एका मिणटान', 'एक मिनूट'],\n            mm: [number + ' मिणटांनी', number + ' मिणटां'],\n            h: ['एका वरान', 'एक वर'],\n            hh: [number + ' वरांनी', number + ' वरां'],\n            d: ['एका दिसान', 'एक दीस'],\n            dd: [number + ' दिसांनी', number + ' दीस'],\n            M: ['एका म्हयन्यान', 'एक म्हयनो'],\n            MM: [number + ' म्हयन्यानी', number + ' म्हयने'],\n            y: ['एका वर्सान', 'एक वर्स'],\n            yy: [number + ' वर्सांनी', number + ' वर्सां'],\n        };\n        return isFuture ? format[key][0] : format[key][1];\n    }\n\n    var gomDeva = moment.defineLocale('gom-deva', {\n        months: {\n            standalone:\n                'जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(\n                    '_'\n                ),\n            format: 'जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या'.split(\n                '_'\n            ),\n            isFormat: /MMMM(\\s)+D[oD]?/,\n        },\n        monthsShort:\n            'जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार'.split('_'),\n        weekdaysShort: 'आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.'.split('_'),\n        weekdaysMin: 'आ_सो_मं_बु_ब्रे_सु_शे'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'A h:mm [वाजतां]',\n            LTS: 'A h:mm:ss [वाजतां]',\n            L: 'DD-MM-YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY A h:mm [वाजतां]',\n            LLLL: 'dddd, MMMM Do, YYYY, A h:mm [वाजतां]',\n            llll: 'ddd, D MMM YYYY, A h:mm [वाजतां]',\n        },\n        calendar: {\n            sameDay: '[आयज] LT',\n            nextDay: '[फाल्यां] LT',\n            nextWeek: '[फुडलो] dddd[,] LT',\n            lastDay: '[काल] LT',\n            lastWeek: '[फाटलो] dddd[,] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s',\n            past: '%s आदीं',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(वेर)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // the ordinal 'वेर' only applies to day of the month\n                case 'D':\n                    return number + 'वेर';\n                default:\n                case 'M':\n                case 'Q':\n                case 'DDD':\n                case 'd':\n                case 'w':\n                case 'W':\n                    return number;\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week\n            doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)\n        },\n        meridiemParse: /राती|सकाळीं|दनपारां|सांजे/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'राती') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'सकाळीं') {\n                return hour;\n            } else if (meridiem === 'दनपारां') {\n                return hour > 12 ? hour : hour + 12;\n            } else if (meridiem === 'सांजे') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'राती';\n            } else if (hour < 12) {\n                return 'सकाळीं';\n            } else if (hour < 16) {\n                return 'दनपारां';\n            } else if (hour < 20) {\n                return 'सांजे';\n            } else {\n                return 'राती';\n            }\n        },\n    });\n\n    return gomDeva;\n\n})));\n","//! moment.js locale configuration\n//! locale : Konkani Latin script [gom-latn]\n//! author : The Discoverer : https://github.com/WikiDiscoverer\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            s: ['thoddea sekondamni', 'thodde sekond'],\n            ss: [number + ' sekondamni', number + ' sekond'],\n            m: ['eka mintan', 'ek minut'],\n            mm: [number + ' mintamni', number + ' mintam'],\n            h: ['eka voran', 'ek vor'],\n            hh: [number + ' voramni', number + ' voram'],\n            d: ['eka disan', 'ek dis'],\n            dd: [number + ' disamni', number + ' dis'],\n            M: ['eka mhoinean', 'ek mhoino'],\n            MM: [number + ' mhoineamni', number + ' mhoine'],\n            y: ['eka vorsan', 'ek voros'],\n            yy: [number + ' vorsamni', number + ' vorsam'],\n        };\n        return isFuture ? format[key][0] : format[key][1];\n    }\n\n    var gomLatn = moment.defineLocale('gom-latn', {\n        months: {\n            standalone:\n                'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split(\n                    '_'\n                ),\n            format: 'Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea'.split(\n                '_'\n            ),\n            isFormat: /MMMM(\\s)+D[oD]?/,\n        },\n        monthsShort:\n            'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),\n        monthsParseExact: true,\n        weekdays: \"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var\".split('_'),\n        weekdaysShort: 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),\n        weekdaysMin: 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'A h:mm [vazta]',\n            LTS: 'A h:mm:ss [vazta]',\n            L: 'DD-MM-YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY A h:mm [vazta]',\n            LLLL: 'dddd, MMMM Do, YYYY, A h:mm [vazta]',\n            llll: 'ddd, D MMM YYYY, A h:mm [vazta]',\n        },\n        calendar: {\n            sameDay: '[Aiz] LT',\n            nextDay: '[Faleam] LT',\n            nextWeek: '[Fuddlo] dddd[,] LT',\n            lastDay: '[Kal] LT',\n            lastWeek: '[Fattlo] dddd[,] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s',\n            past: '%s adim',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(er)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // the ordinal 'er' only applies to day of the month\n                case 'D':\n                    return number + 'er';\n                default:\n                case 'M':\n                case 'Q':\n                case 'DDD':\n                case 'd':\n                case 'w':\n                case 'W':\n                    return number;\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week\n            doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)\n        },\n        meridiemParse: /rati|sokallim|donparam|sanje/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'rati') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'sokallim') {\n                return hour;\n            } else if (meridiem === 'donparam') {\n                return hour > 12 ? hour : hour + 12;\n            } else if (meridiem === 'sanje') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'rati';\n            } else if (hour < 12) {\n                return 'sokallim';\n            } else if (hour < 16) {\n                return 'donparam';\n            } else if (hour < 20) {\n                return 'sanje';\n            } else {\n                return 'rati';\n            }\n        },\n    });\n\n    return gomLatn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Gujarati [gu]\n//! author : Kaushik Thanki : https://github.com/Kaushik1987\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '૧',\n            2: '૨',\n            3: '૩',\n            4: '૪',\n            5: '૫',\n            6: '૬',\n            7: '૭',\n            8: '૮',\n            9: '૯',\n            0: '૦',\n        },\n        numberMap = {\n            '૧': '1',\n            '૨': '2',\n            '૩': '3',\n            '૪': '4',\n            '૫': '5',\n            '૬': '6',\n            '૭': '7',\n            '૮': '8',\n            '૯': '9',\n            '૦': '0',\n        };\n\n    var gu = moment.defineLocale('gu', {\n        months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split(\n            '_'\n        ),\n        monthsShort:\n            'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split(\n            '_'\n        ),\n        weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),\n        weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm વાગ્યે',\n            LTS: 'A h:mm:ss વાગ્યે',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm વાગ્યે',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે',\n        },\n        calendar: {\n            sameDay: '[આજ] LT',\n            nextDay: '[કાલે] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[ગઇકાલે] LT',\n            lastWeek: '[પાછલા] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s મા',\n            past: '%s પહેલા',\n            s: 'અમુક પળો',\n            ss: '%d સેકંડ',\n            m: 'એક મિનિટ',\n            mm: '%d મિનિટ',\n            h: 'એક કલાક',\n            hh: '%d કલાક',\n            d: 'એક દિવસ',\n            dd: '%d દિવસ',\n            M: 'એક મહિનો',\n            MM: '%d મહિનો',\n            y: 'એક વર્ષ',\n            yy: '%d વર્ષ',\n        },\n        preparse: function (string) {\n            return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        // Gujarati notation for meridiems are quite fuzzy in practice. While there exists\n        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati.\n        meridiemParse: /રાત|બપોર|સવાર|સાંજ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'રાત') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'સવાર') {\n                return hour;\n            } else if (meridiem === 'બપોર') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'સાંજ') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'રાત';\n            } else if (hour < 10) {\n                return 'સવાર';\n            } else if (hour < 17) {\n                return 'બપોર';\n            } else if (hour < 20) {\n                return 'સાંજ';\n            } else {\n                return 'રાત';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return gu;\n\n})));\n","//! moment.js locale configuration\n//! locale : Hebrew [he]\n//! author : Tomer Cohen : https://github.com/tomer\n//! author : Moshe Simantov : https://github.com/DevelopmentIL\n//! author : Tal Ater : https://github.com/TalAter\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var he = moment.defineLocale('he', {\n        months: 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split(\n            '_'\n        ),\n        monthsShort:\n            'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),\n        weekdays: 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),\n        weekdaysShort: 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),\n        weekdaysMin: 'א_ב_ג_ד_ה_ו_ש'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [ב]MMMM YYYY',\n            LLL: 'D [ב]MMMM YYYY HH:mm',\n            LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',\n            l: 'D/M/YYYY',\n            ll: 'D MMM YYYY',\n            lll: 'D MMM YYYY HH:mm',\n            llll: 'ddd, D MMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[היום ב־]LT',\n            nextDay: '[מחר ב־]LT',\n            nextWeek: 'dddd [בשעה] LT',\n            lastDay: '[אתמול ב־]LT',\n            lastWeek: '[ביום] dddd [האחרון בשעה] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'בעוד %s',\n            past: 'לפני %s',\n            s: 'מספר שניות',\n            ss: '%d שניות',\n            m: 'דקה',\n            mm: '%d דקות',\n            h: 'שעה',\n            hh: function (number) {\n                if (number === 2) {\n                    return 'שעתיים';\n                }\n                return number + ' שעות';\n            },\n            d: 'יום',\n            dd: function (number) {\n                if (number === 2) {\n                    return 'יומיים';\n                }\n                return number + ' ימים';\n            },\n            M: 'חודש',\n            MM: function (number) {\n                if (number === 2) {\n                    return 'חודשיים';\n                }\n                return number + ' חודשים';\n            },\n            y: 'שנה',\n            yy: function (number) {\n                if (number === 2) {\n                    return 'שנתיים';\n                } else if (number % 10 === 0 && number !== 10) {\n                    return number + ' שנה';\n                }\n                return number + ' שנים';\n            },\n        },\n        meridiemParse:\n            /אחה\"צ|לפנה\"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,\n        isPM: function (input) {\n            return /^(אחה\"צ|אחרי הצהריים|בערב)$/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 5) {\n                return 'לפנות בוקר';\n            } else if (hour < 10) {\n                return 'בבוקר';\n            } else if (hour < 12) {\n                return isLower ? 'לפנה\"צ' : 'לפני הצהריים';\n            } else if (hour < 18) {\n                return isLower ? 'אחה\"צ' : 'אחרי הצהריים';\n            } else {\n                return 'בערב';\n            }\n        },\n    });\n\n    return he;\n\n})));\n","//! moment.js locale configuration\n//! locale : Hindi [hi]\n//! author : Mayank Singhal : https://github.com/mayanksinghal\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '१',\n            2: '२',\n            3: '३',\n            4: '४',\n            5: '५',\n            6: '६',\n            7: '७',\n            8: '८',\n            9: '९',\n            0: '०',\n        },\n        numberMap = {\n            '१': '1',\n            '२': '2',\n            '३': '3',\n            '४': '4',\n            '५': '5',\n            '६': '6',\n            '७': '7',\n            '८': '8',\n            '९': '9',\n            '०': '0',\n        },\n        monthsParse = [\n            /^जन/i,\n            /^फ़र|फर/i,\n            /^मार्च/i,\n            /^अप्रै/i,\n            /^मई/i,\n            /^जून/i,\n            /^जुल/i,\n            /^अग/i,\n            /^सितं|सित/i,\n            /^अक्टू/i,\n            /^नव|नवं/i,\n            /^दिसं|दिस/i,\n        ],\n        shortMonthsParse = [\n            /^जन/i,\n            /^फ़र/i,\n            /^मार्च/i,\n            /^अप्रै/i,\n            /^मई/i,\n            /^जून/i,\n            /^जुल/i,\n            /^अग/i,\n            /^सित/i,\n            /^अक्टू/i,\n            /^नव/i,\n            /^दिस/i,\n        ];\n\n    var hi = moment.defineLocale('hi', {\n        months: {\n            format: 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split(\n                '_'\n            ),\n            standalone:\n                'जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर'.split(\n                    '_'\n                ),\n        },\n        monthsShort:\n            'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),\n        weekdays: 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n        weekdaysShort: 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),\n        weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm बजे',\n            LTS: 'A h:mm:ss बजे',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm बजे',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm बजे',\n        },\n\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: shortMonthsParse,\n\n        monthsRegex:\n            /^(जनवरी|जन\\.?|फ़रवरी|फरवरी|फ़र\\.?|मार्च?|अप्रैल|अप्रै\\.?|मई?|जून?|जुलाई|जुल\\.?|अगस्त|अग\\.?|सितम्बर|सितंबर|सित\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर|नव\\.?|दिसम्बर|दिसंबर|दिस\\.?)/i,\n\n        monthsShortRegex:\n            /^(जनवरी|जन\\.?|फ़रवरी|फरवरी|फ़र\\.?|मार्च?|अप्रैल|अप्रै\\.?|मई?|जून?|जुलाई|जुल\\.?|अगस्त|अग\\.?|सितम्बर|सितंबर|सित\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर|नव\\.?|दिसम्बर|दिसंबर|दिस\\.?)/i,\n\n        monthsStrictRegex:\n            /^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,\n\n        monthsShortStrictRegex:\n            /^(जन\\.?|फ़र\\.?|मार्च?|अप्रै\\.?|मई?|जून?|जुल\\.?|अग\\.?|सित\\.?|अक्टू\\.?|नव\\.?|दिस\\.?)/i,\n\n        calendar: {\n            sameDay: '[आज] LT',\n            nextDay: '[कल] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[कल] LT',\n            lastWeek: '[पिछले] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s में',\n            past: '%s पहले',\n            s: 'कुछ ही क्षण',\n            ss: '%d सेकंड',\n            m: 'एक मिनट',\n            mm: '%d मिनट',\n            h: 'एक घंटा',\n            hh: '%d घंटे',\n            d: 'एक दिन',\n            dd: '%d दिन',\n            M: 'एक महीने',\n            MM: '%d महीने',\n            y: 'एक वर्ष',\n            yy: '%d वर्ष',\n        },\n        preparse: function (string) {\n            return string.replace(/[१२३४५६७८९०]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        // Hindi notation for meridiems are quite fuzzy in practice. While there exists\n        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.\n        meridiemParse: /रात|सुबह|दोपहर|शाम/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'रात') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'सुबह') {\n                return hour;\n            } else if (meridiem === 'दोपहर') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'शाम') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'रात';\n            } else if (hour < 10) {\n                return 'सुबह';\n            } else if (hour < 17) {\n                return 'दोपहर';\n            } else if (hour < 20) {\n                return 'शाम';\n            } else {\n                return 'रात';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return hi;\n\n})));\n","//! moment.js locale configuration\n//! locale : Croatian [hr]\n//! author : Bojan Marković : https://github.com/bmarkovic\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function translate(number, withoutSuffix, key) {\n        var result = number + ' ';\n        switch (key) {\n            case 'ss':\n                if (number === 1) {\n                    result += 'sekunda';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'sekunde';\n                } else {\n                    result += 'sekundi';\n                }\n                return result;\n            case 'm':\n                return withoutSuffix ? 'jedna minuta' : 'jedne minute';\n            case 'mm':\n                if (number === 1) {\n                    result += 'minuta';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'minute';\n                } else {\n                    result += 'minuta';\n                }\n                return result;\n            case 'h':\n                return withoutSuffix ? 'jedan sat' : 'jednog sata';\n            case 'hh':\n                if (number === 1) {\n                    result += 'sat';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'sata';\n                } else {\n                    result += 'sati';\n                }\n                return result;\n            case 'dd':\n                if (number === 1) {\n                    result += 'dan';\n                } else {\n                    result += 'dana';\n                }\n                return result;\n            case 'MM':\n                if (number === 1) {\n                    result += 'mjesec';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'mjeseca';\n                } else {\n                    result += 'mjeseci';\n                }\n                return result;\n            case 'yy':\n                if (number === 1) {\n                    result += 'godina';\n                } else if (number === 2 || number === 3 || number === 4) {\n                    result += 'godine';\n                } else {\n                    result += 'godina';\n                }\n                return result;\n        }\n    }\n\n    var hr = moment.defineLocale('hr', {\n        months: {\n            format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split(\n                '_'\n            ),\n            standalone:\n                'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split(\n                    '_'\n                ),\n        },\n        monthsShort:\n            'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(\n            '_'\n        ),\n        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'Do MMMM YYYY',\n            LLL: 'Do MMMM YYYY H:mm',\n            LLLL: 'dddd, Do MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[danas u] LT',\n            nextDay: '[sutra u] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[u] [nedjelju] [u] LT';\n                    case 3:\n                        return '[u] [srijedu] [u] LT';\n                    case 6:\n                        return '[u] [subotu] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[u] dddd [u] LT';\n                }\n            },\n            lastDay: '[jučer u] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[prošlu] [nedjelju] [u] LT';\n                    case 3:\n                        return '[prošlu] [srijedu] [u] LT';\n                    case 6:\n                        return '[prošle] [subote] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[prošli] dddd [u] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'prije %s',\n            s: 'par sekundi',\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: 'dan',\n            dd: translate,\n            M: 'mjesec',\n            MM: translate,\n            y: 'godinu',\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return hr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Hungarian [hu]\n//! author : Adam Brunner : https://github.com/adambrunner\n//! author : Peter Viszt  : https://github.com/passatgt\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var weekEndings =\n        'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');\n    function translate(number, withoutSuffix, key, isFuture) {\n        var num = number;\n        switch (key) {\n            case 's':\n                return isFuture || withoutSuffix\n                    ? 'néhány másodperc'\n                    : 'néhány másodperce';\n            case 'ss':\n                return num + (isFuture || withoutSuffix)\n                    ? ' másodperc'\n                    : ' másodperce';\n            case 'm':\n                return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');\n            case 'mm':\n                return num + (isFuture || withoutSuffix ? ' perc' : ' perce');\n            case 'h':\n                return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');\n            case 'hh':\n                return num + (isFuture || withoutSuffix ? ' óra' : ' órája');\n            case 'd':\n                return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');\n            case 'dd':\n                return num + (isFuture || withoutSuffix ? ' nap' : ' napja');\n            case 'M':\n                return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');\n            case 'MM':\n                return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');\n            case 'y':\n                return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');\n            case 'yy':\n                return num + (isFuture || withoutSuffix ? ' év' : ' éve');\n        }\n        return '';\n    }\n    function week(isFuture) {\n        return (\n            (isFuture ? '' : '[múlt] ') +\n            '[' +\n            weekEndings[this.day()] +\n            '] LT[-kor]'\n        );\n    }\n\n    var hu = moment.defineLocale('hu', {\n        months: 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),\n        weekdaysShort: 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),\n        weekdaysMin: 'v_h_k_sze_cs_p_szo'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'YYYY.MM.DD.',\n            LL: 'YYYY. MMMM D.',\n            LLL: 'YYYY. MMMM D. H:mm',\n            LLLL: 'YYYY. MMMM D., dddd H:mm',\n        },\n        meridiemParse: /de|du/i,\n        isPM: function (input) {\n            return input.charAt(1).toLowerCase() === 'u';\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower === true ? 'de' : 'DE';\n            } else {\n                return isLower === true ? 'du' : 'DU';\n            }\n        },\n        calendar: {\n            sameDay: '[ma] LT[-kor]',\n            nextDay: '[holnap] LT[-kor]',\n            nextWeek: function () {\n                return week.call(this, true);\n            },\n            lastDay: '[tegnap] LT[-kor]',\n            lastWeek: function () {\n                return week.call(this, false);\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s múlva',\n            past: '%s',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return hu;\n\n})));\n","//! moment.js locale configuration\n//! locale : Armenian [hy-am]\n//! author : Armendarabyan : https://github.com/armendarabyan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var hyAm = moment.defineLocale('hy-am', {\n        months: {\n            format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split(\n                '_'\n            ),\n            standalone:\n                'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split(\n                    '_'\n                ),\n        },\n        monthsShort: 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),\n        weekdays:\n            'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split(\n                '_'\n            ),\n        weekdaysShort: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n        weekdaysMin: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY թ.',\n            LLL: 'D MMMM YYYY թ., HH:mm',\n            LLLL: 'dddd, D MMMM YYYY թ., HH:mm',\n        },\n        calendar: {\n            sameDay: '[այսօր] LT',\n            nextDay: '[վաղը] LT',\n            lastDay: '[երեկ] LT',\n            nextWeek: function () {\n                return 'dddd [օրը ժամը] LT';\n            },\n            lastWeek: function () {\n                return '[անցած] dddd [օրը ժամը] LT';\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s հետո',\n            past: '%s առաջ',\n            s: 'մի քանի վայրկյան',\n            ss: '%d վայրկյան',\n            m: 'րոպե',\n            mm: '%d րոպե',\n            h: 'ժամ',\n            hh: '%d ժամ',\n            d: 'օր',\n            dd: '%d օր',\n            M: 'ամիս',\n            MM: '%d ամիս',\n            y: 'տարի',\n            yy: '%d տարի',\n        },\n        meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,\n        isPM: function (input) {\n            return /^(ցերեկվա|երեկոյան)$/.test(input);\n        },\n        meridiem: function (hour) {\n            if (hour < 4) {\n                return 'գիշերվա';\n            } else if (hour < 12) {\n                return 'առավոտվա';\n            } else if (hour < 17) {\n                return 'ցերեկվա';\n            } else {\n                return 'երեկոյան';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}|\\d{1,2}-(ին|րդ)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'DDD':\n                case 'w':\n                case 'W':\n                case 'DDDo':\n                    if (number === 1) {\n                        return number + '-ին';\n                    }\n                    return number + '-րդ';\n                default:\n                    return number;\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return hyAm;\n\n})));\n","//! moment.js locale configuration\n//! locale : Indonesian [id]\n//! author : Mohammad Satrio Utomo : https://github.com/tyok\n//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var id = moment.defineLocale('id', {\n        months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),\n        weekdays: 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),\n        weekdaysShort: 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),\n        weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [pukul] HH.mm',\n            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',\n        },\n        meridiemParse: /pagi|siang|sore|malam/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'pagi') {\n                return hour;\n            } else if (meridiem === 'siang') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'sore' || meridiem === 'malam') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 11) {\n                return 'pagi';\n            } else if (hours < 15) {\n                return 'siang';\n            } else if (hours < 19) {\n                return 'sore';\n            } else {\n                return 'malam';\n            }\n        },\n        calendar: {\n            sameDay: '[Hari ini pukul] LT',\n            nextDay: '[Besok pukul] LT',\n            nextWeek: 'dddd [pukul] LT',\n            lastDay: '[Kemarin pukul] LT',\n            lastWeek: 'dddd [lalu pukul] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dalam %s',\n            past: '%s yang lalu',\n            s: 'beberapa detik',\n            ss: '%d detik',\n            m: 'semenit',\n            mm: '%d menit',\n            h: 'sejam',\n            hh: '%d jam',\n            d: 'sehari',\n            dd: '%d hari',\n            M: 'sebulan',\n            MM: '%d bulan',\n            y: 'setahun',\n            yy: '%d tahun',\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return id;\n\n})));\n","//! moment.js locale configuration\n//! locale : Icelandic [is]\n//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function plural(n) {\n        if (n % 100 === 11) {\n            return true;\n        } else if (n % 10 === 1) {\n            return false;\n        }\n        return true;\n    }\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        switch (key) {\n            case 's':\n                return withoutSuffix || isFuture\n                    ? 'nokkrar sekúndur'\n                    : 'nokkrum sekúndum';\n            case 'ss':\n                if (plural(number)) {\n                    return (\n                        result +\n                        (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum')\n                    );\n                }\n                return result + 'sekúnda';\n            case 'm':\n                return withoutSuffix ? 'mínúta' : 'mínútu';\n            case 'mm':\n                if (plural(number)) {\n                    return (\n                        result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum')\n                    );\n                } else if (withoutSuffix) {\n                    return result + 'mínúta';\n                }\n                return result + 'mínútu';\n            case 'hh':\n                if (plural(number)) {\n                    return (\n                        result +\n                        (withoutSuffix || isFuture\n                            ? 'klukkustundir'\n                            : 'klukkustundum')\n                    );\n                }\n                return result + 'klukkustund';\n            case 'd':\n                if (withoutSuffix) {\n                    return 'dagur';\n                }\n                return isFuture ? 'dag' : 'degi';\n            case 'dd':\n                if (plural(number)) {\n                    if (withoutSuffix) {\n                        return result + 'dagar';\n                    }\n                    return result + (isFuture ? 'daga' : 'dögum');\n                } else if (withoutSuffix) {\n                    return result + 'dagur';\n                }\n                return result + (isFuture ? 'dag' : 'degi');\n            case 'M':\n                if (withoutSuffix) {\n                    return 'mánuður';\n                }\n                return isFuture ? 'mánuð' : 'mánuði';\n            case 'MM':\n                if (plural(number)) {\n                    if (withoutSuffix) {\n                        return result + 'mánuðir';\n                    }\n                    return result + (isFuture ? 'mánuði' : 'mánuðum');\n                } else if (withoutSuffix) {\n                    return result + 'mánuður';\n                }\n                return result + (isFuture ? 'mánuð' : 'mánuði');\n            case 'y':\n                return withoutSuffix || isFuture ? 'ár' : 'ári';\n            case 'yy':\n                if (plural(number)) {\n                    return result + (withoutSuffix || isFuture ? 'ár' : 'árum');\n                }\n                return result + (withoutSuffix || isFuture ? 'ár' : 'ári');\n        }\n    }\n\n    var is = moment.defineLocale('is', {\n        months: 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),\n        weekdays:\n            'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split(\n                '_'\n            ),\n        weekdaysShort: 'sun_mán_þri_mið_fim_fös_lau'.split('_'),\n        weekdaysMin: 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY [kl.] H:mm',\n            LLLL: 'dddd, D. MMMM YYYY [kl.] H:mm',\n        },\n        calendar: {\n            sameDay: '[í dag kl.] LT',\n            nextDay: '[á morgun kl.] LT',\n            nextWeek: 'dddd [kl.] LT',\n            lastDay: '[í gær kl.] LT',\n            lastWeek: '[síðasta] dddd [kl.] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'eftir %s',\n            past: 'fyrir %s síðan',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: 'klukkustund',\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return is;\n\n})));\n","//! moment.js locale configuration\n//! locale : Italian (Switzerland) [it-ch]\n//! author : xfh : https://github.com/xfh\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var itCh = moment.defineLocale('it-ch', {\n        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(\n            '_'\n        ),\n        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\n        weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(\n            '_'\n        ),\n        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\n        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Oggi alle] LT',\n            nextDay: '[Domani alle] LT',\n            nextWeek: 'dddd [alle] LT',\n            lastDay: '[Ieri alle] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[la scorsa] dddd [alle] LT';\n                    default:\n                        return '[lo scorso] dddd [alle] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: function (s) {\n                return (/^[0-9].+$/.test(s) ? 'tra' : 'in') + ' ' + s;\n            },\n            past: '%s fa',\n            s: 'alcuni secondi',\n            ss: '%d secondi',\n            m: 'un minuto',\n            mm: '%d minuti',\n            h: \"un'ora\",\n            hh: '%d ore',\n            d: 'un giorno',\n            dd: '%d giorni',\n            M: 'un mese',\n            MM: '%d mesi',\n            y: 'un anno',\n            yy: '%d anni',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return itCh;\n\n})));\n","//! moment.js locale configuration\n//! locale : Italian [it]\n//! author : Lorenzo : https://github.com/aliem\n//! author: Mattia Larentis: https://github.com/nostalgiaz\n//! author: Marco : https://github.com/Manfre98\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var it = moment.defineLocale('it', {\n        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(\n            '_'\n        ),\n        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\n        weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(\n            '_'\n        ),\n        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\n        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return (\n                    '[Oggi a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            nextDay: function () {\n                return (\n                    '[Domani a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            nextWeek: function () {\n                return (\n                    'dddd [a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            lastDay: function () {\n                return (\n                    '[Ieri a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return (\n                            '[La scorsa] dddd [a' +\n                            (this.hours() > 1\n                                ? 'lle '\n                                : this.hours() === 0\n                                  ? ' '\n                                  : \"ll'\") +\n                            ']LT'\n                        );\n                    default:\n                        return (\n                            '[Lo scorso] dddd [a' +\n                            (this.hours() > 1\n                                ? 'lle '\n                                : this.hours() === 0\n                                  ? ' '\n                                  : \"ll'\") +\n                            ']LT'\n                        );\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'tra %s',\n            past: '%s fa',\n            s: 'alcuni secondi',\n            ss: '%d secondi',\n            m: 'un minuto',\n            mm: '%d minuti',\n            h: \"un'ora\",\n            hh: '%d ore',\n            d: 'un giorno',\n            dd: '%d giorni',\n            w: 'una settimana',\n            ww: '%d settimane',\n            M: 'un mese',\n            MM: '%d mesi',\n            y: 'un anno',\n            yy: '%d anni',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return it;\n\n})));\n","//! moment.js locale configuration\n//! locale : Japanese [ja]\n//! author : LI Long : https://github.com/baryon\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ja = moment.defineLocale('ja', {\n        eras: [\n            {\n                since: '2019-05-01',\n                offset: 1,\n                name: '令和',\n                narrow: '㋿',\n                abbr: 'R',\n            },\n            {\n                since: '1989-01-08',\n                until: '2019-04-30',\n                offset: 1,\n                name: '平成',\n                narrow: '㍻',\n                abbr: 'H',\n            },\n            {\n                since: '1926-12-25',\n                until: '1989-01-07',\n                offset: 1,\n                name: '昭和',\n                narrow: '㍼',\n                abbr: 'S',\n            },\n            {\n                since: '1912-07-30',\n                until: '1926-12-24',\n                offset: 1,\n                name: '大正',\n                narrow: '㍽',\n                abbr: 'T',\n            },\n            {\n                since: '1873-01-01',\n                until: '1912-07-29',\n                offset: 6,\n                name: '明治',\n                narrow: '㍾',\n                abbr: 'M',\n            },\n            {\n                since: '0001-01-01',\n                until: '1873-12-31',\n                offset: 1,\n                name: '西暦',\n                narrow: 'AD',\n                abbr: 'AD',\n            },\n            {\n                since: '0000-12-31',\n                until: -Infinity,\n                offset: 1,\n                name: '紀元前',\n                narrow: 'BC',\n                abbr: 'BC',\n            },\n        ],\n        eraYearOrdinalRegex: /(元|\\d+)年/,\n        eraYearOrdinalParse: function (input, match) {\n            return match[1] === '元' ? 1 : parseInt(match[1] || input, 10);\n        },\n        months: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n            '_'\n        ),\n        weekdays: '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),\n        weekdaysShort: '日_月_火_水_木_金_土'.split('_'),\n        weekdaysMin: '日_月_火_水_木_金_土'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY/MM/DD',\n            LL: 'YYYY年M月D日',\n            LLL: 'YYYY年M月D日 HH:mm',\n            LLLL: 'YYYY年M月D日 dddd HH:mm',\n            l: 'YYYY/MM/DD',\n            ll: 'YYYY年M月D日',\n            lll: 'YYYY年M月D日 HH:mm',\n            llll: 'YYYY年M月D日(ddd) HH:mm',\n        },\n        meridiemParse: /午前|午後/i,\n        isPM: function (input) {\n            return input === '午後';\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return '午前';\n            } else {\n                return '午後';\n            }\n        },\n        calendar: {\n            sameDay: '[今日] LT',\n            nextDay: '[明日] LT',\n            nextWeek: function (now) {\n                if (now.week() !== this.week()) {\n                    return '[来週]dddd LT';\n                } else {\n                    return 'dddd LT';\n                }\n            },\n            lastDay: '[昨日] LT',\n            lastWeek: function (now) {\n                if (this.week() !== now.week()) {\n                    return '[先週]dddd LT';\n                } else {\n                    return 'dddd LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}日/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'y':\n                    return number === 1 ? '元年' : number + '年';\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '日';\n                default:\n                    return number;\n            }\n        },\n        relativeTime: {\n            future: '%s後',\n            past: '%s前',\n            s: '数秒',\n            ss: '%d秒',\n            m: '1分',\n            mm: '%d分',\n            h: '1時間',\n            hh: '%d時間',\n            d: '1日',\n            dd: '%d日',\n            M: '1ヶ月',\n            MM: '%dヶ月',\n            y: '1年',\n            yy: '%d年',\n        },\n    });\n\n    return ja;\n\n})));\n","//! moment.js locale configuration\n//! locale : Javanese [jv]\n//! author : Rony Lantip : https://github.com/lantip\n//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var jv = moment.defineLocale('jv', {\n        months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),\n        weekdays: 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),\n        weekdaysShort: 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),\n        weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [pukul] HH.mm',\n            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',\n        },\n        meridiemParse: /enjing|siyang|sonten|ndalu/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'enjing') {\n                return hour;\n            } else if (meridiem === 'siyang') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'sonten' || meridiem === 'ndalu') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 11) {\n                return 'enjing';\n            } else if (hours < 15) {\n                return 'siyang';\n            } else if (hours < 19) {\n                return 'sonten';\n            } else {\n                return 'ndalu';\n            }\n        },\n        calendar: {\n            sameDay: '[Dinten puniko pukul] LT',\n            nextDay: '[Mbenjang pukul] LT',\n            nextWeek: 'dddd [pukul] LT',\n            lastDay: '[Kala wingi pukul] LT',\n            lastWeek: 'dddd [kepengker pukul] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'wonten ing %s',\n            past: '%s ingkang kepengker',\n            s: 'sawetawis detik',\n            ss: '%d detik',\n            m: 'setunggal menit',\n            mm: '%d menit',\n            h: 'setunggal jam',\n            hh: '%d jam',\n            d: 'sedinten',\n            dd: '%d dinten',\n            M: 'sewulan',\n            MM: '%d wulan',\n            y: 'setaun',\n            yy: '%d taun',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return jv;\n\n})));\n","//! moment.js locale configuration\n//! locale : Georgian [ka]\n//! author : Irakli Janiashvili : https://github.com/IrakliJani\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ka = moment.defineLocale('ka', {\n        months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split(\n            '_'\n        ),\n        monthsShort: 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),\n        weekdays: {\n            standalone:\n                'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split(\n                    '_'\n                ),\n            format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split(\n                '_'\n            ),\n            isFormat: /(წინა|შემდეგ)/,\n        },\n        weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),\n        weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[დღეს] LT[-ზე]',\n            nextDay: '[ხვალ] LT[-ზე]',\n            lastDay: '[გუშინ] LT[-ზე]',\n            nextWeek: '[შემდეგ] dddd LT[-ზე]',\n            lastWeek: '[წინა] dddd LT-ზე',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: function (s) {\n                return s.replace(\n                    /(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,\n                    function ($0, $1, $2) {\n                        return $2 === 'ი' ? $1 + 'ში' : $1 + $2 + 'ში';\n                    }\n                );\n            },\n            past: function (s) {\n                if (/(წამი|წუთი|საათი|დღე|თვე)/.test(s)) {\n                    return s.replace(/(ი|ე)$/, 'ის წინ');\n                }\n                if (/წელი/.test(s)) {\n                    return s.replace(/წელი$/, 'წლის წინ');\n                }\n                return s;\n            },\n            s: 'რამდენიმე წამი',\n            ss: '%d წამი',\n            m: 'წუთი',\n            mm: '%d წუთი',\n            h: 'საათი',\n            hh: '%d საათი',\n            d: 'დღე',\n            dd: '%d დღე',\n            M: 'თვე',\n            MM: '%d თვე',\n            y: 'წელი',\n            yy: '%d წელი',\n        },\n        dayOfMonthOrdinalParse: /0|1-ლი|მე-\\d{1,2}|\\d{1,2}-ე/,\n        ordinal: function (number) {\n            if (number === 0) {\n                return number;\n            }\n            if (number === 1) {\n                return number + '-ლი';\n            }\n            if (\n                number < 20 ||\n                (number <= 100 && number % 20 === 0) ||\n                number % 100 === 0\n            ) {\n                return 'მე-' + number;\n            }\n            return number + '-ე';\n        },\n        week: {\n            dow: 1,\n            doy: 7,\n        },\n    });\n\n    return ka;\n\n})));\n","//! moment.js locale configuration\n//! locale : Kazakh [kk]\n//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        0: '-ші',\n        1: '-ші',\n        2: '-ші',\n        3: '-ші',\n        4: '-ші',\n        5: '-ші',\n        6: '-шы',\n        7: '-ші',\n        8: '-ші',\n        9: '-шы',\n        10: '-шы',\n        20: '-шы',\n        30: '-шы',\n        40: '-шы',\n        50: '-ші',\n        60: '-шы',\n        70: '-ші',\n        80: '-ші',\n        90: '-шы',\n        100: '-ші',\n    };\n\n    var kk = moment.defineLocale('kk', {\n        months: 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split(\n            '_'\n        ),\n        monthsShort: 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),\n        weekdays: 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split(\n            '_'\n        ),\n        weekdaysShort: 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),\n        weekdaysMin: 'жк_дй_сй_ср_бй_жм_сн'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Бүгін сағат] LT',\n            nextDay: '[Ертең сағат] LT',\n            nextWeek: 'dddd [сағат] LT',\n            lastDay: '[Кеше сағат] LT',\n            lastWeek: '[Өткен аптаның] dddd [сағат] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s ішінде',\n            past: '%s бұрын',\n            s: 'бірнеше секунд',\n            ss: '%d секунд',\n            m: 'бір минут',\n            mm: '%d минут',\n            h: 'бір сағат',\n            hh: '%d сағат',\n            d: 'бір күн',\n            dd: '%d күн',\n            M: 'бір ай',\n            MM: '%d ай',\n            y: 'бір жыл',\n            yy: '%d жыл',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(ші|шы)/,\n        ordinal: function (number) {\n            var a = number % 10,\n                b = number >= 100 ? 100 : null;\n            return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return kk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Cambodian [km]\n//! author : Kruy Vanna : https://github.com/kruyvanna\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '១',\n            2: '២',\n            3: '៣',\n            4: '៤',\n            5: '៥',\n            6: '៦',\n            7: '៧',\n            8: '៨',\n            9: '៩',\n            0: '០',\n        },\n        numberMap = {\n            '១': '1',\n            '២': '2',\n            '៣': '3',\n            '៤': '4',\n            '៥': '5',\n            '៦': '6',\n            '៧': '7',\n            '៨': '8',\n            '៩': '9',\n            '០': '0',\n        };\n\n    var km = moment.defineLocale('km', {\n        months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(\n            '_'\n        ),\n        monthsShort:\n            'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(\n                '_'\n            ),\n        weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),\n        weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),\n        weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ព្រឹក|ល្ងាច/,\n        isPM: function (input) {\n            return input === 'ល្ងាច';\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ព្រឹក';\n            } else {\n                return 'ល្ងាច';\n            }\n        },\n        calendar: {\n            sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',\n            nextDay: '[ស្អែក ម៉ោង] LT',\n            nextWeek: 'dddd [ម៉ោង] LT',\n            lastDay: '[ម្សិលមិញ ម៉ោង] LT',\n            lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%sទៀត',\n            past: '%sមុន',\n            s: 'ប៉ុន្មានវិនាទី',\n            ss: '%d វិនាទី',\n            m: 'មួយនាទី',\n            mm: '%d នាទី',\n            h: 'មួយម៉ោង',\n            hh: '%d ម៉ោង',\n            d: 'មួយថ្ងៃ',\n            dd: '%d ថ្ងៃ',\n            M: 'មួយខែ',\n            MM: '%d ខែ',\n            y: 'មួយឆ្នាំ',\n            yy: '%d ឆ្នាំ',\n        },\n        dayOfMonthOrdinalParse: /ទី\\d{1,2}/,\n        ordinal: 'ទី%d',\n        preparse: function (string) {\n            return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return km;\n\n})));\n","//! moment.js locale configuration\n//! locale : Kannada [kn]\n//! author : Rajeev Naik : https://github.com/rajeevnaikte\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '೧',\n            2: '೨',\n            3: '೩',\n            4: '೪',\n            5: '೫',\n            6: '೬',\n            7: '೭',\n            8: '೮',\n            9: '೯',\n            0: '೦',\n        },\n        numberMap = {\n            '೧': '1',\n            '೨': '2',\n            '೩': '3',\n            '೪': '4',\n            '೫': '5',\n            '೬': '6',\n            '೭': '7',\n            '೮': '8',\n            '೯': '9',\n            '೦': '0',\n        };\n\n    var kn = moment.defineLocale('kn', {\n        months: 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split(\n            '_'\n        ),\n        monthsShort:\n            'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split(\n            '_'\n        ),\n        weekdaysShort: 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),\n        weekdaysMin: 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm',\n            LTS: 'A h:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm',\n        },\n        calendar: {\n            sameDay: '[ಇಂದು] LT',\n            nextDay: '[ನಾಳೆ] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[ನಿನ್ನೆ] LT',\n            lastWeek: '[ಕೊನೆಯ] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s ನಂತರ',\n            past: '%s ಹಿಂದೆ',\n            s: 'ಕೆಲವು ಕ್ಷಣಗಳು',\n            ss: '%d ಸೆಕೆಂಡುಗಳು',\n            m: 'ಒಂದು ನಿಮಿಷ',\n            mm: '%d ನಿಮಿಷ',\n            h: 'ಒಂದು ಗಂಟೆ',\n            hh: '%d ಗಂಟೆ',\n            d: 'ಒಂದು ದಿನ',\n            dd: '%d ದಿನ',\n            M: 'ಒಂದು ತಿಂಗಳು',\n            MM: '%d ತಿಂಗಳು',\n            y: 'ಒಂದು ವರ್ಷ',\n            yy: '%d ವರ್ಷ',\n        },\n        preparse: function (string) {\n            return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'ರಾತ್ರಿ') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') {\n                return hour;\n            } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'ಸಂಜೆ') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'ರಾತ್ರಿ';\n            } else if (hour < 10) {\n                return 'ಬೆಳಿಗ್ಗೆ';\n            } else if (hour < 17) {\n                return 'ಮಧ್ಯಾಹ್ನ';\n            } else if (hour < 20) {\n                return 'ಸಂಜೆ';\n            } else {\n                return 'ರಾತ್ರಿ';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ನೇ)/,\n        ordinal: function (number) {\n            return number + 'ನೇ';\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return kn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Korean [ko]\n//! author : Kyungwook, Park : https://github.com/kyungw00k\n//! author : Jeeeyul Lee <jeeeyul@gmail.com>\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ko = moment.defineLocale('ko', {\n        months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),\n        monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split(\n            '_'\n        ),\n        weekdays: '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),\n        weekdaysShort: '일_월_화_수_목_금_토'.split('_'),\n        weekdaysMin: '일_월_화_수_목_금_토'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm',\n            LTS: 'A h:mm:ss',\n            L: 'YYYY.MM.DD.',\n            LL: 'YYYY년 MMMM D일',\n            LLL: 'YYYY년 MMMM D일 A h:mm',\n            LLLL: 'YYYY년 MMMM D일 dddd A h:mm',\n            l: 'YYYY.MM.DD.',\n            ll: 'YYYY년 MMMM D일',\n            lll: 'YYYY년 MMMM D일 A h:mm',\n            llll: 'YYYY년 MMMM D일 dddd A h:mm',\n        },\n        calendar: {\n            sameDay: '오늘 LT',\n            nextDay: '내일 LT',\n            nextWeek: 'dddd LT',\n            lastDay: '어제 LT',\n            lastWeek: '지난주 dddd LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s 후',\n            past: '%s 전',\n            s: '몇 초',\n            ss: '%d초',\n            m: '1분',\n            mm: '%d분',\n            h: '한 시간',\n            hh: '%d시간',\n            d: '하루',\n            dd: '%d일',\n            M: '한 달',\n            MM: '%d달',\n            y: '일 년',\n            yy: '%d년',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(일|월|주)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '일';\n                case 'M':\n                    return number + '월';\n                case 'w':\n                case 'W':\n                    return number + '주';\n                default:\n                    return number;\n            }\n        },\n        meridiemParse: /오전|오후/,\n        isPM: function (token) {\n            return token === '오후';\n        },\n        meridiem: function (hour, minute, isUpper) {\n            return hour < 12 ? '오전' : '오후';\n        },\n    });\n\n    return ko;\n\n})));\n","//! moment.js locale configuration\n//! locale : Northern Kurdish [ku-kmr]\n//! authors : Mazlum Özdogan : https://github.com/mergehez\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(num, withoutSuffix, key, isFuture) {\n        var format = {\n            s: ['çend sanîye', 'çend sanîyeyan'],\n            ss: [num + ' sanîye', num + ' sanîyeyan'],\n            m: ['deqîqeyek', 'deqîqeyekê'],\n            mm: [num + ' deqîqe', num + ' deqîqeyan'],\n            h: ['saetek', 'saetekê'],\n            hh: [num + ' saet', num + ' saetan'],\n            d: ['rojek', 'rojekê'],\n            dd: [num + ' roj', num + ' rojan'],\n            w: ['hefteyek', 'hefteyekê'],\n            ww: [num + ' hefte', num + ' hefteyan'],\n            M: ['mehek', 'mehekê'],\n            MM: [num + ' meh', num + ' mehan'],\n            y: ['salek', 'salekê'],\n            yy: [num + ' sal', num + ' salan'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n    // function obliqueNumSuffix(num) {\n    //     if(num.includes(':'))\n    //         num = parseInt(num.split(':')[0]);\n    //     else\n    //         num = parseInt(num);\n    //     return num == 0 || num % 10 == 1 ? 'ê'\n    //                         : (num > 10 && num % 10 == 0 ? 'î' : 'an');\n    // }\n    function ezafeNumSuffix(num) {\n        num = '' + num;\n        var l = num.substring(num.length - 1),\n            ll = num.length > 1 ? num.substring(num.length - 2) : '';\n        if (\n            !(ll == 12 || ll == 13) &&\n            (l == '2' || l == '3' || ll == '50' || l == '70' || l == '80')\n        )\n            return 'yê';\n        return 'ê';\n    }\n\n    var kuKmr = moment.defineLocale('ku-kmr', {\n        // According to the spelling rules defined by the work group of Weqfa Mezopotamyayê (Mesopotamia Foundation)\n        // this should be: 'Kanûna Paşîn_Sibat_Adar_Nîsan_Gulan_Hezîran_Tîrmeh_Tebax_Îlon_Çirîya Pêşîn_Çirîya Paşîn_Kanûna Pêşîn'\n        // But the names below are more well known and handy\n        months: 'Rêbendan_Sibat_Adar_Nîsan_Gulan_Hezîran_Tîrmeh_Tebax_Îlon_Cotmeh_Mijdar_Berfanbar'.split(\n            '_'\n        ),\n        monthsShort: 'Rêb_Sib_Ada_Nîs_Gul_Hez_Tîr_Teb_Îlo_Cot_Mij_Ber'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'Yekşem_Duşem_Sêşem_Çarşem_Pêncşem_În_Şemî'.split('_'),\n        weekdaysShort: 'Yek_Du_Sê_Çar_Pên_În_Şem'.split('_'),\n        weekdaysMin: 'Ye_Du_Sê_Ça_Pê_În_Şe'.split('_'),\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower ? 'bn' : 'BN';\n            } else {\n                return isLower ? 'pn' : 'PN';\n            }\n        },\n        meridiemParse: /bn|BN|pn|PN/,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'Do MMMM[a] YYYY[an]',\n            LLL: 'Do MMMM[a] YYYY[an] HH:mm',\n            LLLL: 'dddd, Do MMMM[a] YYYY[an] HH:mm',\n            ll: 'Do MMM[.] YYYY[an]',\n            lll: 'Do MMM[.] YYYY[an] HH:mm',\n            llll: 'ddd[.], Do MMM[.] YYYY[an] HH:mm',\n        },\n        calendar: {\n            sameDay: '[Îro di saet] LT [de]',\n            nextDay: '[Sibê di saet] LT [de]',\n            nextWeek: 'dddd [di saet] LT [de]',\n            lastDay: '[Duh di saet] LT [de]',\n            lastWeek: 'dddd[a borî di saet] LT [de]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'di %s de',\n            past: 'berî %s',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            w: processRelativeTime,\n            ww: processRelativeTime,\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(?:yê|ê|\\.)/,\n        ordinal: function (num, period) {\n            var p = period.toLowerCase();\n            if (p.includes('w') || p.includes('m')) return num + '.';\n\n            return num + ezafeNumSuffix(num);\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return kuKmr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Kurdish [ku]\n//! author : Shahram Mebashar : https://github.com/ShahramMebashar\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '١',\n            2: '٢',\n            3: '٣',\n            4: '٤',\n            5: '٥',\n            6: '٦',\n            7: '٧',\n            8: '٨',\n            9: '٩',\n            0: '٠',\n        },\n        numberMap = {\n            '١': '1',\n            '٢': '2',\n            '٣': '3',\n            '٤': '4',\n            '٥': '5',\n            '٦': '6',\n            '٧': '7',\n            '٨': '8',\n            '٩': '9',\n            '٠': '0',\n        },\n        months = [\n            'کانونی دووەم',\n            'شوبات',\n            'ئازار',\n            'نیسان',\n            'ئایار',\n            'حوزەیران',\n            'تەمموز',\n            'ئاب',\n            'ئەیلوول',\n            'تشرینی یەكەم',\n            'تشرینی دووەم',\n            'كانونی یەکەم',\n        ];\n\n    var ku = moment.defineLocale('ku', {\n        months: months,\n        monthsShort: months,\n        weekdays:\n            'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split(\n                '_'\n            ),\n        weekdaysShort:\n            'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'),\n        weekdaysMin: 'ی_د_س_چ_پ_ه_ش'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ئێواره‌|به‌یانی/,\n        isPM: function (input) {\n            return /ئێواره‌/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'به‌یانی';\n            } else {\n                return 'ئێواره‌';\n            }\n        },\n        calendar: {\n            sameDay: '[ئه‌مرۆ كاتژمێر] LT',\n            nextDay: '[به‌یانی كاتژمێر] LT',\n            nextWeek: 'dddd [كاتژمێر] LT',\n            lastDay: '[دوێنێ كاتژمێر] LT',\n            lastWeek: 'dddd [كاتژمێر] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'له‌ %s',\n            past: '%s',\n            s: 'چه‌ند چركه‌یه‌ك',\n            ss: 'چركه‌ %d',\n            m: 'یه‌ك خوله‌ك',\n            mm: '%d خوله‌ك',\n            h: 'یه‌ك كاتژمێر',\n            hh: '%d كاتژمێر',\n            d: 'یه‌ك ڕۆژ',\n            dd: '%d ڕۆژ',\n            M: 'یه‌ك مانگ',\n            MM: '%d مانگ',\n            y: 'یه‌ك ساڵ',\n            yy: '%d ساڵ',\n        },\n        preparse: function (string) {\n            return string\n                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n                    return numberMap[match];\n                })\n                .replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string\n                .replace(/\\d/g, function (match) {\n                    return symbolMap[match];\n                })\n                .replace(/,/g, '،');\n        },\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return ku;\n\n})));\n","//! moment.js locale configuration\n//! locale : Kyrgyz [ky]\n//! author : Chyngyz Arystan uulu : https://github.com/chyngyz\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        0: '-чү',\n        1: '-чи',\n        2: '-чи',\n        3: '-чү',\n        4: '-чү',\n        5: '-чи',\n        6: '-чы',\n        7: '-чи',\n        8: '-чи',\n        9: '-чу',\n        10: '-чу',\n        20: '-чы',\n        30: '-чу',\n        40: '-чы',\n        50: '-чү',\n        60: '-чы',\n        70: '-чи',\n        80: '-чи',\n        90: '-чу',\n        100: '-чү',\n    };\n\n    var ky = moment.defineLocale('ky', {\n        months: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(\n            '_'\n        ),\n        monthsShort: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split(\n            '_'\n        ),\n        weekdays: 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split(\n            '_'\n        ),\n        weekdaysShort: 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),\n        weekdaysMin: 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Бүгүн саат] LT',\n            nextDay: '[Эртең саат] LT',\n            nextWeek: 'dddd [саат] LT',\n            lastDay: '[Кечээ саат] LT',\n            lastWeek: '[Өткөн аптанын] dddd [күнү] [саат] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s ичинде',\n            past: '%s мурун',\n            s: 'бирнече секунд',\n            ss: '%d секунд',\n            m: 'бир мүнөт',\n            mm: '%d мүнөт',\n            h: 'бир саат',\n            hh: '%d саат',\n            d: 'бир күн',\n            dd: '%d күн',\n            M: 'бир ай',\n            MM: '%d ай',\n            y: 'бир жыл',\n            yy: '%d жыл',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(чи|чы|чү|чу)/,\n        ordinal: function (number) {\n            var a = number % 10,\n                b = number >= 100 ? 100 : null;\n            return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return ky;\n\n})));\n","//! moment.js locale configuration\n//! locale : Luxembourgish [lb]\n//! author : mweimerskirch : https://github.com/mweimerskirch\n//! author : David Raison : https://github.com/kwisatz\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            m: ['eng Minutt', 'enger Minutt'],\n            h: ['eng Stonn', 'enger Stonn'],\n            d: ['een Dag', 'engem Dag'],\n            M: ['ee Mount', 'engem Mount'],\n            y: ['ee Joer', 'engem Joer'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n    function processFutureTime(string) {\n        var number = string.substr(0, string.indexOf(' '));\n        if (eifelerRegelAppliesToNumber(number)) {\n            return 'a ' + string;\n        }\n        return 'an ' + string;\n    }\n    function processPastTime(string) {\n        var number = string.substr(0, string.indexOf(' '));\n        if (eifelerRegelAppliesToNumber(number)) {\n            return 'viru ' + string;\n        }\n        return 'virun ' + string;\n    }\n    /**\n     * Returns true if the word before the given number loses the '-n' ending.\n     * e.g. 'an 10 Deeg' but 'a 5 Deeg'\n     *\n     * @param number {integer}\n     * @returns {boolean}\n     */\n    function eifelerRegelAppliesToNumber(number) {\n        number = parseInt(number, 10);\n        if (isNaN(number)) {\n            return false;\n        }\n        if (number < 0) {\n            // Negative Number --> always true\n            return true;\n        } else if (number < 10) {\n            // Only 1 digit\n            if (4 <= number && number <= 7) {\n                return true;\n            }\n            return false;\n        } else if (number < 100) {\n            // 2 digits\n            var lastDigit = number % 10,\n                firstDigit = number / 10;\n            if (lastDigit === 0) {\n                return eifelerRegelAppliesToNumber(firstDigit);\n            }\n            return eifelerRegelAppliesToNumber(lastDigit);\n        } else if (number < 10000) {\n            // 3 or 4 digits --> recursively check first digit\n            while (number >= 10) {\n                number = number / 10;\n            }\n            return eifelerRegelAppliesToNumber(number);\n        } else {\n            // Anything larger than 4 digits: recursively check first n-3 digits\n            number = number / 1000;\n            return eifelerRegelAppliesToNumber(number);\n        }\n    }\n\n    var lb = moment.defineLocale('lb', {\n        months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n            '_'\n        ),\n        monthsShort:\n            'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split(\n                '_'\n            ),\n        weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),\n        weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm [Auer]',\n            LTS: 'H:mm:ss [Auer]',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm [Auer]',\n            LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]',\n        },\n        calendar: {\n            sameDay: '[Haut um] LT',\n            sameElse: 'L',\n            nextDay: '[Muer um] LT',\n            nextWeek: 'dddd [um] LT',\n            lastDay: '[Gëschter um] LT',\n            lastWeek: function () {\n                // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule\n                switch (this.day()) {\n                    case 2:\n                    case 4:\n                        return '[Leschten] dddd [um] LT';\n                    default:\n                        return '[Leschte] dddd [um] LT';\n                }\n            },\n        },\n        relativeTime: {\n            future: processFutureTime,\n            past: processPastTime,\n            s: 'e puer Sekonnen',\n            ss: '%d Sekonnen',\n            m: processRelativeTime,\n            mm: '%d Minutten',\n            h: processRelativeTime,\n            hh: '%d Stonnen',\n            d: processRelativeTime,\n            dd: '%d Deeg',\n            M: processRelativeTime,\n            MM: '%d Méint',\n            y: processRelativeTime,\n            yy: '%d Joer',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return lb;\n\n})));\n","//! moment.js locale configuration\n//! locale : Lao [lo]\n//! author : Ryan Hart : https://github.com/ryanhart2\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var lo = moment.defineLocale('lo', {\n        months: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(\n            '_'\n        ),\n        monthsShort:\n            'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(\n                '_'\n            ),\n        weekdays: 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n        weekdaysShort: 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n        weekdaysMin: 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'ວັນdddd D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,\n        isPM: function (input) {\n            return input === 'ຕອນແລງ';\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ຕອນເຊົ້າ';\n            } else {\n                return 'ຕອນແລງ';\n            }\n        },\n        calendar: {\n            sameDay: '[ມື້ນີ້ເວລາ] LT',\n            nextDay: '[ມື້ອື່ນເວລາ] LT',\n            nextWeek: '[ວັນ]dddd[ໜ້າເວລາ] LT',\n            lastDay: '[ມື້ວານນີ້ເວລາ] LT',\n            lastWeek: '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'ອີກ %s',\n            past: '%sຜ່ານມາ',\n            s: 'ບໍ່ເທົ່າໃດວິນາທີ',\n            ss: '%d ວິນາທີ',\n            m: '1 ນາທີ',\n            mm: '%d ນາທີ',\n            h: '1 ຊົ່ວໂມງ',\n            hh: '%d ຊົ່ວໂມງ',\n            d: '1 ມື້',\n            dd: '%d ມື້',\n            M: '1 ເດືອນ',\n            MM: '%d ເດືອນ',\n            y: '1 ປີ',\n            yy: '%d ປີ',\n        },\n        dayOfMonthOrdinalParse: /(ທີ່)\\d{1,2}/,\n        ordinal: function (number) {\n            return 'ທີ່' + number;\n        },\n    });\n\n    return lo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Lithuanian [lt]\n//! author : Mindaugas Mozūras : https://github.com/mmozuras\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var units = {\n        ss: 'sekundė_sekundžių_sekundes',\n        m: 'minutė_minutės_minutę',\n        mm: 'minutės_minučių_minutes',\n        h: 'valanda_valandos_valandą',\n        hh: 'valandos_valandų_valandas',\n        d: 'diena_dienos_dieną',\n        dd: 'dienos_dienų_dienas',\n        M: 'mėnuo_mėnesio_mėnesį',\n        MM: 'mėnesiai_mėnesių_mėnesius',\n        y: 'metai_metų_metus',\n        yy: 'metai_metų_metus',\n    };\n    function translateSeconds(number, withoutSuffix, key, isFuture) {\n        if (withoutSuffix) {\n            return 'kelios sekundės';\n        } else {\n            return isFuture ? 'kelių sekundžių' : 'kelias sekundes';\n        }\n    }\n    function translateSingular(number, withoutSuffix, key, isFuture) {\n        return withoutSuffix\n            ? forms(key)[0]\n            : isFuture\n              ? forms(key)[1]\n              : forms(key)[2];\n    }\n    function special(number) {\n        return number % 10 === 0 || (number > 10 && number < 20);\n    }\n    function forms(key) {\n        return units[key].split('_');\n    }\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        if (number === 1) {\n            return (\n                result + translateSingular(number, withoutSuffix, key[0], isFuture)\n            );\n        } else if (withoutSuffix) {\n            return result + (special(number) ? forms(key)[1] : forms(key)[0]);\n        } else {\n            if (isFuture) {\n                return result + forms(key)[1];\n            } else {\n                return result + (special(number) ? forms(key)[1] : forms(key)[2]);\n            }\n        }\n    }\n    var lt = moment.defineLocale('lt', {\n        months: {\n            format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split(\n                '_'\n            ),\n            standalone:\n                'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split(\n                    '_'\n                ),\n            isFormat: /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?|MMMM?(\\[[^\\[\\]]*\\]|\\s)+D[oD]?/,\n        },\n        monthsShort: 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),\n        weekdays: {\n            format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split(\n                '_'\n            ),\n            standalone:\n                'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split(\n                    '_'\n                ),\n            isFormat: /dddd HH:mm/,\n        },\n        weekdaysShort: 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),\n        weekdaysMin: 'S_P_A_T_K_Pn_Š'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'YYYY [m.] MMMM D [d.]',\n            LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n            LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',\n            l: 'YYYY-MM-DD',\n            ll: 'YYYY [m.] MMMM D [d.]',\n            lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n            llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]',\n        },\n        calendar: {\n            sameDay: '[Šiandien] LT',\n            nextDay: '[Rytoj] LT',\n            nextWeek: 'dddd LT',\n            lastDay: '[Vakar] LT',\n            lastWeek: '[Praėjusį] dddd LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'po %s',\n            past: 'prieš %s',\n            s: translateSeconds,\n            ss: translate,\n            m: translateSingular,\n            mm: translate,\n            h: translateSingular,\n            hh: translate,\n            d: translateSingular,\n            dd: translate,\n            M: translateSingular,\n            MM: translate,\n            y: translateSingular,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-oji/,\n        ordinal: function (number) {\n            return number + '-oji';\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return lt;\n\n})));\n","//! moment.js locale configuration\n//! locale : Latvian [lv]\n//! author : Kristaps Karlsons : https://github.com/skakri\n//! author : Jānis Elmeris : https://github.com/JanisE\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var units = {\n        ss: 'sekundes_sekundēm_sekunde_sekundes'.split('_'),\n        m: 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n        mm: 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n        h: 'stundas_stundām_stunda_stundas'.split('_'),\n        hh: 'stundas_stundām_stunda_stundas'.split('_'),\n        d: 'dienas_dienām_diena_dienas'.split('_'),\n        dd: 'dienas_dienām_diena_dienas'.split('_'),\n        M: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n        MM: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n        y: 'gada_gadiem_gads_gadi'.split('_'),\n        yy: 'gada_gadiem_gads_gadi'.split('_'),\n    };\n    /**\n     * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.\n     */\n    function format(forms, number, withoutSuffix) {\n        if (withoutSuffix) {\n            // E.g. \"21 minūte\", \"3 minūtes\".\n            return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];\n        } else {\n            // E.g. \"21 minūtes\" as in \"pēc 21 minūtes\".\n            // E.g. \"3 minūtēm\" as in \"pēc 3 minūtēm\".\n            return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];\n        }\n    }\n    function relativeTimeWithPlural(number, withoutSuffix, key) {\n        return number + ' ' + format(units[key], number, withoutSuffix);\n    }\n    function relativeTimeWithSingular(number, withoutSuffix, key) {\n        return format(units[key], number, withoutSuffix);\n    }\n    function relativeSeconds(number, withoutSuffix) {\n        return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';\n    }\n\n    var lv = moment.defineLocale('lv', {\n        months: 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),\n        weekdays:\n            'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split(\n                '_'\n            ),\n        weekdaysShort: 'Sv_P_O_T_C_Pk_S'.split('_'),\n        weekdaysMin: 'Sv_P_O_T_C_Pk_S'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY.',\n            LL: 'YYYY. [gada] D. MMMM',\n            LLL: 'YYYY. [gada] D. MMMM, HH:mm',\n            LLLL: 'YYYY. [gada] D. MMMM, dddd, HH:mm',\n        },\n        calendar: {\n            sameDay: '[Šodien pulksten] LT',\n            nextDay: '[Rīt pulksten] LT',\n            nextWeek: 'dddd [pulksten] LT',\n            lastDay: '[Vakar pulksten] LT',\n            lastWeek: '[Pagājušā] dddd [pulksten] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'pēc %s',\n            past: 'pirms %s',\n            s: relativeSeconds,\n            ss: relativeTimeWithPlural,\n            m: relativeTimeWithSingular,\n            mm: relativeTimeWithPlural,\n            h: relativeTimeWithSingular,\n            hh: relativeTimeWithPlural,\n            d: relativeTimeWithSingular,\n            dd: relativeTimeWithPlural,\n            M: relativeTimeWithSingular,\n            MM: relativeTimeWithPlural,\n            y: relativeTimeWithSingular,\n            yy: relativeTimeWithPlural,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return lv;\n\n})));\n","//! moment.js locale configuration\n//! locale : Montenegrin [me]\n//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var translator = {\n        words: {\n            //Different grammatical cases\n            ss: ['sekund', 'sekunda', 'sekundi'],\n            m: ['jedan minut', 'jednog minuta'],\n            mm: ['minut', 'minuta', 'minuta'],\n            h: ['jedan sat', 'jednog sata'],\n            hh: ['sat', 'sata', 'sati'],\n            dd: ['dan', 'dana', 'dana'],\n            MM: ['mjesec', 'mjeseca', 'mjeseci'],\n            yy: ['godina', 'godine', 'godina'],\n        },\n        correctGrammaticalCase: function (number, wordKey) {\n            return number === 1\n                ? wordKey[0]\n                : number >= 2 && number <= 4\n                  ? wordKey[1]\n                  : wordKey[2];\n        },\n        translate: function (number, withoutSuffix, key) {\n            var wordKey = translator.words[key];\n            if (key.length === 1) {\n                return withoutSuffix ? wordKey[0] : wordKey[1];\n            } else {\n                return (\n                    number +\n                    ' ' +\n                    translator.correctGrammaticalCase(number, wordKey)\n                );\n            }\n        },\n    };\n\n    var me = moment.defineLocale('me', {\n        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(\n            '_'\n        ),\n        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd, D. MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[danas u] LT',\n            nextDay: '[sjutra u] LT',\n\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[u] [nedjelju] [u] LT';\n                    case 3:\n                        return '[u] [srijedu] [u] LT';\n                    case 6:\n                        return '[u] [subotu] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[u] dddd [u] LT';\n                }\n            },\n            lastDay: '[juče u] LT',\n            lastWeek: function () {\n                var lastWeekDays = [\n                    '[prošle] [nedjelje] [u] LT',\n                    '[prošlog] [ponedjeljka] [u] LT',\n                    '[prošlog] [utorka] [u] LT',\n                    '[prošle] [srijede] [u] LT',\n                    '[prošlog] [četvrtka] [u] LT',\n                    '[prošlog] [petka] [u] LT',\n                    '[prošle] [subote] [u] LT',\n                ];\n                return lastWeekDays[this.day()];\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'prije %s',\n            s: 'nekoliko sekundi',\n            ss: translator.translate,\n            m: translator.translate,\n            mm: translator.translate,\n            h: translator.translate,\n            hh: translator.translate,\n            d: 'dan',\n            dd: translator.translate,\n            M: 'mjesec',\n            MM: translator.translate,\n            y: 'godinu',\n            yy: translator.translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return me;\n\n})));\n","//! moment.js locale configuration\n//! locale : Maori [mi]\n//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var mi = moment.defineLocale('mi', {\n        months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split(\n            '_'\n        ),\n        monthsShort:\n            'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split(\n                '_'\n            ),\n        monthsRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n        monthsStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n        monthsShortRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n        monthsShortStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,2}/i,\n        weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),\n        weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n        weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [i] HH:mm',\n            LLLL: 'dddd, D MMMM YYYY [i] HH:mm',\n        },\n        calendar: {\n            sameDay: '[i teie mahana, i] LT',\n            nextDay: '[apopo i] LT',\n            nextWeek: 'dddd [i] LT',\n            lastDay: '[inanahi i] LT',\n            lastWeek: 'dddd [whakamutunga i] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'i roto i %s',\n            past: '%s i mua',\n            s: 'te hēkona ruarua',\n            ss: '%d hēkona',\n            m: 'he meneti',\n            mm: '%d meneti',\n            h: 'te haora',\n            hh: '%d haora',\n            d: 'he ra',\n            dd: '%d ra',\n            M: 'he marama',\n            MM: '%d marama',\n            y: 'he tau',\n            yy: '%d tau',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return mi;\n\n})));\n","//! moment.js locale configuration\n//! locale : Macedonian [mk]\n//! author : Borislav Mickov : https://github.com/B0k0\n//! author : Sashko Todorov : https://github.com/bkyceh\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var mk = moment.defineLocale('mk', {\n        months: 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split(\n            '_'\n        ),\n        monthsShort: 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),\n        weekdays: 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split(\n            '_'\n        ),\n        weekdaysShort: 'нед_пон_вто_сре_чет_пет_саб'.split('_'),\n        weekdaysMin: 'нe_пo_вт_ср_че_пе_сa'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'D.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY H:mm',\n            LLLL: 'dddd, D MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[Денес во] LT',\n            nextDay: '[Утре во] LT',\n            nextWeek: '[Во] dddd [во] LT',\n            lastDay: '[Вчера во] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                    case 3:\n                    case 6:\n                        return '[Изминатата] dddd [во] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[Изминатиот] dddd [во] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'за %s',\n            past: 'пред %s',\n            s: 'неколку секунди',\n            ss: '%d секунди',\n            m: 'една минута',\n            mm: '%d минути',\n            h: 'еден час',\n            hh: '%d часа',\n            d: 'еден ден',\n            dd: '%d дена',\n            M: 'еден месец',\n            MM: '%d месеци',\n            y: 'една година',\n            yy: '%d години',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n        ordinal: function (number) {\n            var lastDigit = number % 10,\n                last2Digits = number % 100;\n            if (number === 0) {\n                return number + '-ев';\n            } else if (last2Digits === 0) {\n                return number + '-ен';\n            } else if (last2Digits > 10 && last2Digits < 20) {\n                return number + '-ти';\n            } else if (lastDigit === 1) {\n                return number + '-ви';\n            } else if (lastDigit === 2) {\n                return number + '-ри';\n            } else if (lastDigit === 7 || lastDigit === 8) {\n                return number + '-ми';\n            } else {\n                return number + '-ти';\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return mk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Malayalam [ml]\n//! author : Floyd Pink : https://github.com/floydpink\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ml = moment.defineLocale('ml', {\n        months: 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split(\n            '_'\n        ),\n        monthsShort:\n            'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split(\n                '_'\n            ),\n        weekdaysShort: 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),\n        weekdaysMin: 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm -നു',\n            LTS: 'A h:mm:ss -നു',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm -നു',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm -നു',\n        },\n        calendar: {\n            sameDay: '[ഇന്ന്] LT',\n            nextDay: '[നാളെ] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[ഇന്നലെ] LT',\n            lastWeek: '[കഴിഞ്ഞ] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s കഴിഞ്ഞ്',\n            past: '%s മുൻപ്',\n            s: 'അൽപ നിമിഷങ്ങൾ',\n            ss: '%d സെക്കൻഡ്',\n            m: 'ഒരു മിനിറ്റ്',\n            mm: '%d മിനിറ്റ്',\n            h: 'ഒരു മണിക്കൂർ',\n            hh: '%d മണിക്കൂർ',\n            d: 'ഒരു ദിവസം',\n            dd: '%d ദിവസം',\n            M: 'ഒരു മാസം',\n            MM: '%d മാസം',\n            y: 'ഒരു വർഷം',\n            yy: '%d വർഷം',\n        },\n        meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (\n                (meridiem === 'രാത്രി' && hour >= 4) ||\n                meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||\n                meridiem === 'വൈകുന്നേരം'\n            ) {\n                return hour + 12;\n            } else {\n                return hour;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'രാത്രി';\n            } else if (hour < 12) {\n                return 'രാവിലെ';\n            } else if (hour < 17) {\n                return 'ഉച്ച കഴിഞ്ഞ്';\n            } else if (hour < 20) {\n                return 'വൈകുന്നേരം';\n            } else {\n                return 'രാത്രി';\n            }\n        },\n    });\n\n    return ml;\n\n})));\n","//! moment.js locale configuration\n//! locale : Mongolian [mn]\n//! author : Javkhlantugs Nyamdorj : https://github.com/javkhaanj7\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function translate(number, withoutSuffix, key, isFuture) {\n        switch (key) {\n            case 's':\n                return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын';\n            case 'ss':\n                return number + (withoutSuffix ? ' секунд' : ' секундын');\n            case 'm':\n            case 'mm':\n                return number + (withoutSuffix ? ' минут' : ' минутын');\n            case 'h':\n            case 'hh':\n                return number + (withoutSuffix ? ' цаг' : ' цагийн');\n            case 'd':\n            case 'dd':\n                return number + (withoutSuffix ? ' өдөр' : ' өдрийн');\n            case 'M':\n            case 'MM':\n                return number + (withoutSuffix ? ' сар' : ' сарын');\n            case 'y':\n            case 'yy':\n                return number + (withoutSuffix ? ' жил' : ' жилийн');\n            default:\n                return number;\n        }\n    }\n\n    var mn = moment.defineLocale('mn', {\n        months: 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split(\n            '_'\n        ),\n        monthsShort:\n            '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'),\n        weekdaysShort: 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'),\n        weekdaysMin: 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'YYYY оны MMMMын D',\n            LLL: 'YYYY оны MMMMын D HH:mm',\n            LLLL: 'dddd, YYYY оны MMMMын D HH:mm',\n        },\n        meridiemParse: /ҮӨ|ҮХ/i,\n        isPM: function (input) {\n            return input === 'ҮХ';\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ҮӨ';\n            } else {\n                return 'ҮХ';\n            }\n        },\n        calendar: {\n            sameDay: '[Өнөөдөр] LT',\n            nextDay: '[Маргааш] LT',\n            nextWeek: '[Ирэх] dddd LT',\n            lastDay: '[Өчигдөр] LT',\n            lastWeek: '[Өнгөрсөн] dddd LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s дараа',\n            past: '%s өмнө',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2} өдөр/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + ' өдөр';\n                default:\n                    return number;\n            }\n        },\n    });\n\n    return mn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Marathi [mr]\n//! author : Harshad Kale : https://github.com/kalehv\n//! author : Vivek Athalye : https://github.com/vnathalye\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '१',\n            2: '२',\n            3: '३',\n            4: '४',\n            5: '५',\n            6: '६',\n            7: '७',\n            8: '८',\n            9: '९',\n            0: '०',\n        },\n        numberMap = {\n            '१': '1',\n            '२': '2',\n            '३': '3',\n            '४': '4',\n            '५': '5',\n            '६': '6',\n            '७': '7',\n            '८': '8',\n            '९': '9',\n            '०': '0',\n        };\n\n    function relativeTimeMr(number, withoutSuffix, string, isFuture) {\n        var output = '';\n        if (withoutSuffix) {\n            switch (string) {\n                case 's':\n                    output = 'काही सेकंद';\n                    break;\n                case 'ss':\n                    output = '%d सेकंद';\n                    break;\n                case 'm':\n                    output = 'एक मिनिट';\n                    break;\n                case 'mm':\n                    output = '%d मिनिटे';\n                    break;\n                case 'h':\n                    output = 'एक तास';\n                    break;\n                case 'hh':\n                    output = '%d तास';\n                    break;\n                case 'd':\n                    output = 'एक दिवस';\n                    break;\n                case 'dd':\n                    output = '%d दिवस';\n                    break;\n                case 'M':\n                    output = 'एक महिना';\n                    break;\n                case 'MM':\n                    output = '%d महिने';\n                    break;\n                case 'y':\n                    output = 'एक वर्ष';\n                    break;\n                case 'yy':\n                    output = '%d वर्षे';\n                    break;\n            }\n        } else {\n            switch (string) {\n                case 's':\n                    output = 'काही सेकंदां';\n                    break;\n                case 'ss':\n                    output = '%d सेकंदां';\n                    break;\n                case 'm':\n                    output = 'एका मिनिटा';\n                    break;\n                case 'mm':\n                    output = '%d मिनिटां';\n                    break;\n                case 'h':\n                    output = 'एका तासा';\n                    break;\n                case 'hh':\n                    output = '%d तासां';\n                    break;\n                case 'd':\n                    output = 'एका दिवसा';\n                    break;\n                case 'dd':\n                    output = '%d दिवसां';\n                    break;\n                case 'M':\n                    output = 'एका महिन्या';\n                    break;\n                case 'MM':\n                    output = '%d महिन्यां';\n                    break;\n                case 'y':\n                    output = 'एका वर्षा';\n                    break;\n                case 'yy':\n                    output = '%d वर्षां';\n                    break;\n            }\n        }\n        return output.replace(/%d/i, number);\n    }\n\n    var mr = moment.defineLocale('mr', {\n        months: 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(\n            '_'\n        ),\n        monthsShort:\n            'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n        weekdaysShort: 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),\n        weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm वाजता',\n            LTS: 'A h:mm:ss वाजता',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm वाजता',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm वाजता',\n        },\n        calendar: {\n            sameDay: '[आज] LT',\n            nextDay: '[उद्या] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[काल] LT',\n            lastWeek: '[मागील] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%sमध्ये',\n            past: '%sपूर्वी',\n            s: relativeTimeMr,\n            ss: relativeTimeMr,\n            m: relativeTimeMr,\n            mm: relativeTimeMr,\n            h: relativeTimeMr,\n            hh: relativeTimeMr,\n            d: relativeTimeMr,\n            dd: relativeTimeMr,\n            M: relativeTimeMr,\n            MM: relativeTimeMr,\n            y: relativeTimeMr,\n            yy: relativeTimeMr,\n        },\n        preparse: function (string) {\n            return string.replace(/[१२३४५६७८९०]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        meridiemParse: /पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'पहाटे' || meridiem === 'सकाळी') {\n                return hour;\n            } else if (\n                meridiem === 'दुपारी' ||\n                meridiem === 'सायंकाळी' ||\n                meridiem === 'रात्री'\n            ) {\n                return hour >= 12 ? hour : hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour >= 0 && hour < 6) {\n                return 'पहाटे';\n            } else if (hour < 12) {\n                return 'सकाळी';\n            } else if (hour < 17) {\n                return 'दुपारी';\n            } else if (hour < 20) {\n                return 'सायंकाळी';\n            } else {\n                return 'रात्री';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return mr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Malay [ms-my]\n//! note : DEPRECATED, the correct one is [ms]\n//! author : Weldan Jamili : https://github.com/weldan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var msMy = moment.defineLocale('ms-my', {\n        months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),\n        weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),\n        weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),\n        weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [pukul] HH.mm',\n            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',\n        },\n        meridiemParse: /pagi|tengahari|petang|malam/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'pagi') {\n                return hour;\n            } else if (meridiem === 'tengahari') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'petang' || meridiem === 'malam') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 11) {\n                return 'pagi';\n            } else if (hours < 15) {\n                return 'tengahari';\n            } else if (hours < 19) {\n                return 'petang';\n            } else {\n                return 'malam';\n            }\n        },\n        calendar: {\n            sameDay: '[Hari ini pukul] LT',\n            nextDay: '[Esok pukul] LT',\n            nextWeek: 'dddd [pukul] LT',\n            lastDay: '[Kelmarin pukul] LT',\n            lastWeek: 'dddd [lepas pukul] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dalam %s',\n            past: '%s yang lepas',\n            s: 'beberapa saat',\n            ss: '%d saat',\n            m: 'seminit',\n            mm: '%d minit',\n            h: 'sejam',\n            hh: '%d jam',\n            d: 'sehari',\n            dd: '%d hari',\n            M: 'sebulan',\n            MM: '%d bulan',\n            y: 'setahun',\n            yy: '%d tahun',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return msMy;\n\n})));\n","//! moment.js locale configuration\n//! locale : Malay [ms]\n//! author : Weldan Jamili : https://github.com/weldan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ms = moment.defineLocale('ms', {\n        months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),\n        weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),\n        weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),\n        weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [pukul] HH.mm',\n            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',\n        },\n        meridiemParse: /pagi|tengahari|petang|malam/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'pagi') {\n                return hour;\n            } else if (meridiem === 'tengahari') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'petang' || meridiem === 'malam') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 11) {\n                return 'pagi';\n            } else if (hours < 15) {\n                return 'tengahari';\n            } else if (hours < 19) {\n                return 'petang';\n            } else {\n                return 'malam';\n            }\n        },\n        calendar: {\n            sameDay: '[Hari ini pukul] LT',\n            nextDay: '[Esok pukul] LT',\n            nextWeek: 'dddd [pukul] LT',\n            lastDay: '[Kelmarin pukul] LT',\n            lastWeek: 'dddd [lepas pukul] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dalam %s',\n            past: '%s yang lepas',\n            s: 'beberapa saat',\n            ss: '%d saat',\n            m: 'seminit',\n            mm: '%d minit',\n            h: 'sejam',\n            hh: '%d jam',\n            d: 'sehari',\n            dd: '%d hari',\n            M: 'sebulan',\n            MM: '%d bulan',\n            y: 'setahun',\n            yy: '%d tahun',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return ms;\n\n})));\n","//! moment.js locale configuration\n//! locale : Maltese (Malta) [mt]\n//! author : Alessandro Maruccia : https://github.com/alesma\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var mt = moment.defineLocale('mt', {\n        months: 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),\n        weekdays:\n            'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split(\n                '_'\n            ),\n        weekdaysShort: 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),\n        weekdaysMin: 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Illum fil-]LT',\n            nextDay: '[Għada fil-]LT',\n            nextWeek: 'dddd [fil-]LT',\n            lastDay: '[Il-bieraħ fil-]LT',\n            lastWeek: 'dddd [li għadda] [fil-]LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'f’ %s',\n            past: '%s ilu',\n            s: 'ftit sekondi',\n            ss: '%d sekondi',\n            m: 'minuta',\n            mm: '%d minuti',\n            h: 'siegħa',\n            hh: '%d siegħat',\n            d: 'ġurnata',\n            dd: '%d ġranet',\n            M: 'xahar',\n            MM: '%d xhur',\n            y: 'sena',\n            yy: '%d sni',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return mt;\n\n})));\n","//! moment.js locale configuration\n//! locale : Burmese [my]\n//! author : Squar team, mysquar.com\n//! author : David Rossellat : https://github.com/gholadr\n//! author : Tin Aung Lin : https://github.com/thanyawzinmin\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '၁',\n            2: '၂',\n            3: '၃',\n            4: '၄',\n            5: '၅',\n            6: '၆',\n            7: '၇',\n            8: '၈',\n            9: '၉',\n            0: '၀',\n        },\n        numberMap = {\n            '၁': '1',\n            '၂': '2',\n            '၃': '3',\n            '၄': '4',\n            '၅': '5',\n            '၆': '6',\n            '၇': '7',\n            '၈': '8',\n            '၉': '9',\n            '၀': '0',\n        };\n\n    var my = moment.defineLocale('my', {\n        months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split(\n            '_'\n        ),\n        monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),\n        weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split(\n            '_'\n        ),\n        weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),\n        weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),\n\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[ယနေ.] LT [မှာ]',\n            nextDay: '[မနက်ဖြန်] LT [မှာ]',\n            nextWeek: 'dddd LT [မှာ]',\n            lastDay: '[မနေ.က] LT [မှာ]',\n            lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'လာမည့် %s မှာ',\n            past: 'လွန်ခဲ့သော %s က',\n            s: 'စက္ကန်.အနည်းငယ်',\n            ss: '%d စက္ကန့်',\n            m: 'တစ်မိနစ်',\n            mm: '%d မိနစ်',\n            h: 'တစ်နာရီ',\n            hh: '%d နာရီ',\n            d: 'တစ်ရက်',\n            dd: '%d ရက်',\n            M: 'တစ်လ',\n            MM: '%d လ',\n            y: 'တစ်နှစ်',\n            yy: '%d နှစ်',\n        },\n        preparse: function (string) {\n            return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return my;\n\n})));\n","//! moment.js locale configuration\n//! locale : Norwegian Bokmål [nb]\n//! authors : Espen Hovlandsdal : https://github.com/rexxars\n//!           Sigurd Gartmann : https://github.com/sigurdga\n//!           Stephen Ramthun : https://github.com/stephenramthun\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var nb = moment.defineLocale('nb', {\n        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n        weekdaysShort: 'sø._ma._ti._on._to._fr._lø.'.split('_'),\n        weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY [kl.] HH:mm',\n            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',\n        },\n        calendar: {\n            sameDay: '[i dag kl.] LT',\n            nextDay: '[i morgen kl.] LT',\n            nextWeek: 'dddd [kl.] LT',\n            lastDay: '[i går kl.] LT',\n            lastWeek: '[forrige] dddd [kl.] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'om %s',\n            past: '%s siden',\n            s: 'noen sekunder',\n            ss: '%d sekunder',\n            m: 'ett minutt',\n            mm: '%d minutter',\n            h: 'én time',\n            hh: '%d timer',\n            d: 'én dag',\n            dd: '%d dager',\n            w: 'én uke',\n            ww: '%d uker',\n            M: 'én måned',\n            MM: '%d måneder',\n            y: 'ett år',\n            yy: '%d år',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return nb;\n\n})));\n","//! moment.js locale configuration\n//! locale : Nepalese [ne]\n//! author : suvash : https://github.com/suvash\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '१',\n            2: '२',\n            3: '३',\n            4: '४',\n            5: '५',\n            6: '६',\n            7: '७',\n            8: '८',\n            9: '९',\n            0: '०',\n        },\n        numberMap = {\n            '१': '1',\n            '२': '2',\n            '३': '3',\n            '४': '4',\n            '५': '5',\n            '६': '6',\n            '७': '7',\n            '८': '8',\n            '९': '9',\n            '०': '0',\n        };\n\n    var ne = moment.defineLocale('ne', {\n        months: 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split(\n            '_'\n        ),\n        monthsShort:\n            'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split(\n            '_'\n        ),\n        weekdaysShort: 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),\n        weekdaysMin: 'आ._सो._मं._बु._बि._शु._श.'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'Aको h:mm बजे',\n            LTS: 'Aको h:mm:ss बजे',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, Aको h:mm बजे',\n            LLLL: 'dddd, D MMMM YYYY, Aको h:mm बजे',\n        },\n        preparse: function (string) {\n            return string.replace(/[१२३४५६७८९०]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        meridiemParse: /राति|बिहान|दिउँसो|साँझ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'राति') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'बिहान') {\n                return hour;\n            } else if (meridiem === 'दिउँसो') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'साँझ') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 3) {\n                return 'राति';\n            } else if (hour < 12) {\n                return 'बिहान';\n            } else if (hour < 16) {\n                return 'दिउँसो';\n            } else if (hour < 20) {\n                return 'साँझ';\n            } else {\n                return 'राति';\n            }\n        },\n        calendar: {\n            sameDay: '[आज] LT',\n            nextDay: '[भोलि] LT',\n            nextWeek: '[आउँदो] dddd[,] LT',\n            lastDay: '[हिजो] LT',\n            lastWeek: '[गएको] dddd[,] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%sमा',\n            past: '%s अगाडि',\n            s: 'केही क्षण',\n            ss: '%d सेकेण्ड',\n            m: 'एक मिनेट',\n            mm: '%d मिनेट',\n            h: 'एक घण्टा',\n            hh: '%d घण्टा',\n            d: 'एक दिन',\n            dd: '%d दिन',\n            M: 'एक महिना',\n            MM: '%d महिना',\n            y: 'एक बर्ष',\n            yy: '%d बर्ष',\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return ne;\n\n})));\n","//! moment.js locale configuration\n//! locale : Dutch (Belgium) [nl-be]\n//! author : Joris Röling : https://github.com/jorisroling\n//! author : Jacob Middag : https://github.com/middagj\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortWithDots =\n            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n        monthsShortWithoutDots =\n            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n        monthsParse = [\n            /^jan/i,\n            /^feb/i,\n            /^(maart|mrt\\.?)$/i,\n            /^apr/i,\n            /^mei$/i,\n            /^jun[i.]?$/i,\n            /^jul[i.]?$/i,\n            /^aug/i,\n            /^sep/i,\n            /^okt/i,\n            /^nov/i,\n            /^dec/i,\n        ],\n        monthsRegex =\n            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n\n    var nlBe = moment.defineLocale('nl-be', {\n        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortWithDots;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShortWithoutDots[m.month()];\n            } else {\n                return monthsShortWithDots[m.month()];\n            }\n        },\n\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,\n        monthsShortStrictRegex:\n            /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n\n        weekdays:\n            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),\n        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[vandaag om] LT',\n            nextDay: '[morgen om] LT',\n            nextWeek: 'dddd [om] LT',\n            lastDay: '[gisteren om] LT',\n            lastWeek: '[afgelopen] dddd [om] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'over %s',\n            past: '%s geleden',\n            s: 'een paar seconden',\n            ss: '%d seconden',\n            m: 'één minuut',\n            mm: '%d minuten',\n            h: 'één uur',\n            hh: '%d uur',\n            d: 'één dag',\n            dd: '%d dagen',\n            M: 'één maand',\n            MM: '%d maanden',\n            y: 'één jaar',\n            yy: '%d jaar',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n        ordinal: function (number) {\n            return (\n                number +\n                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n            );\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return nlBe;\n\n})));\n","//! moment.js locale configuration\n//! locale : Dutch [nl]\n//! author : Joris Röling : https://github.com/jorisroling\n//! author : Jacob Middag : https://github.com/middagj\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortWithDots =\n            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n        monthsShortWithoutDots =\n            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n        monthsParse = [\n            /^jan/i,\n            /^feb/i,\n            /^(maart|mrt\\.?)$/i,\n            /^apr/i,\n            /^mei$/i,\n            /^jun[i.]?$/i,\n            /^jul[i.]?$/i,\n            /^aug/i,\n            /^sep/i,\n            /^okt/i,\n            /^nov/i,\n            /^dec/i,\n        ],\n        monthsRegex =\n            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n\n    var nl = moment.defineLocale('nl', {\n        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortWithDots;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShortWithoutDots[m.month()];\n            } else {\n                return monthsShortWithDots[m.month()];\n            }\n        },\n\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,\n        monthsShortStrictRegex:\n            /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n\n        weekdays:\n            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),\n        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD-MM-YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[vandaag om] LT',\n            nextDay: '[morgen om] LT',\n            nextWeek: 'dddd [om] LT',\n            lastDay: '[gisteren om] LT',\n            lastWeek: '[afgelopen] dddd [om] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'over %s',\n            past: '%s geleden',\n            s: 'een paar seconden',\n            ss: '%d seconden',\n            m: 'één minuut',\n            mm: '%d minuten',\n            h: 'één uur',\n            hh: '%d uur',\n            d: 'één dag',\n            dd: '%d dagen',\n            w: 'één week',\n            ww: '%d weken',\n            M: 'één maand',\n            MM: '%d maanden',\n            y: 'één jaar',\n            yy: '%d jaar',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n        ordinal: function (number) {\n            return (\n                number +\n                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n            );\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return nl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Nynorsk [nn]\n//! authors : https://github.com/mechuwind\n//!           Stephen Ramthun : https://github.com/stephenramthun\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var nn = moment.defineLocale('nn', {\n        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),\n        weekdaysShort: 'su._må._ty._on._to._fr._lau.'.split('_'),\n        weekdaysMin: 'su_må_ty_on_to_fr_la'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY [kl.] H:mm',\n            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',\n        },\n        calendar: {\n            sameDay: '[I dag klokka] LT',\n            nextDay: '[I morgon klokka] LT',\n            nextWeek: 'dddd [klokka] LT',\n            lastDay: '[I går klokka] LT',\n            lastWeek: '[Føregåande] dddd [klokka] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'om %s',\n            past: '%s sidan',\n            s: 'nokre sekund',\n            ss: '%d sekund',\n            m: 'eit minutt',\n            mm: '%d minutt',\n            h: 'ein time',\n            hh: '%d timar',\n            d: 'ein dag',\n            dd: '%d dagar',\n            w: 'ei veke',\n            ww: '%d veker',\n            M: 'ein månad',\n            MM: '%d månader',\n            y: 'eit år',\n            yy: '%d år',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return nn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Occitan, lengadocian dialecte [oc-lnc]\n//! author : Quentin PAGÈS : https://github.com/Quenty31\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ocLnc = moment.defineLocale('oc-lnc', {\n        months: {\n            standalone:\n                'genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre'.split(\n                    '_'\n                ),\n            format: \"de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre\".split(\n                '_'\n            ),\n            isFormat: /D[oD]?(\\s)+MMMM/,\n        },\n        monthsShort:\n            'gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte'.split(\n            '_'\n        ),\n        weekdaysShort: 'dg._dl._dm._dc._dj._dv._ds.'.split('_'),\n        weekdaysMin: 'dg_dl_dm_dc_dj_dv_ds'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM [de] YYYY',\n            ll: 'D MMM YYYY',\n            LLL: 'D MMMM [de] YYYY [a] H:mm',\n            lll: 'D MMM YYYY, H:mm',\n            LLLL: 'dddd D MMMM [de] YYYY [a] H:mm',\n            llll: 'ddd D MMM YYYY, H:mm',\n        },\n        calendar: {\n            sameDay: '[uèi a] LT',\n            nextDay: '[deman a] LT',\n            nextWeek: 'dddd [a] LT',\n            lastDay: '[ièr a] LT',\n            lastWeek: 'dddd [passat a] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: \"d'aquí %s\",\n            past: 'fa %s',\n            s: 'unas segondas',\n            ss: '%d segondas',\n            m: 'una minuta',\n            mm: '%d minutas',\n            h: 'una ora',\n            hh: '%d oras',\n            d: 'un jorn',\n            dd: '%d jorns',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un an',\n            yy: '%d ans',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(r|n|t|è|a)/,\n        ordinal: function (number, period) {\n            var output =\n                number === 1\n                    ? 'r'\n                    : number === 2\n                      ? 'n'\n                      : number === 3\n                        ? 'r'\n                        : number === 4\n                          ? 't'\n                          : 'è';\n            if (period === 'w' || period === 'W') {\n                output = 'a';\n            }\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4,\n        },\n    });\n\n    return ocLnc;\n\n})));\n","//! moment.js locale configuration\n//! locale : Punjabi (India) [pa-in]\n//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '੧',\n            2: '੨',\n            3: '੩',\n            4: '੪',\n            5: '੫',\n            6: '੬',\n            7: '੭',\n            8: '੮',\n            9: '੯',\n            0: '੦',\n        },\n        numberMap = {\n            '੧': '1',\n            '੨': '2',\n            '੩': '3',\n            '੪': '4',\n            '੫': '5',\n            '੬': '6',\n            '੭': '7',\n            '੮': '8',\n            '੯': '9',\n            '੦': '0',\n        };\n\n    var paIn = moment.defineLocale('pa-in', {\n        // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi.\n        months: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(\n            '_'\n        ),\n        monthsShort:\n            'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(\n                '_'\n            ),\n        weekdays: 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split(\n            '_'\n        ),\n        weekdaysShort: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n        weekdaysMin: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm ਵਜੇ',\n            LTS: 'A h:mm:ss ਵਜੇ',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm ਵਜੇ',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm ਵਜੇ',\n        },\n        calendar: {\n            sameDay: '[ਅਜ] LT',\n            nextDay: '[ਕਲ] LT',\n            nextWeek: '[ਅਗਲਾ] dddd, LT',\n            lastDay: '[ਕਲ] LT',\n            lastWeek: '[ਪਿਛਲੇ] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s ਵਿੱਚ',\n            past: '%s ਪਿਛਲੇ',\n            s: 'ਕੁਝ ਸਕਿੰਟ',\n            ss: '%d ਸਕਿੰਟ',\n            m: 'ਇਕ ਮਿੰਟ',\n            mm: '%d ਮਿੰਟ',\n            h: 'ਇੱਕ ਘੰਟਾ',\n            hh: '%d ਘੰਟੇ',\n            d: 'ਇੱਕ ਦਿਨ',\n            dd: '%d ਦਿਨ',\n            M: 'ਇੱਕ ਮਹੀਨਾ',\n            MM: '%d ਮਹੀਨੇ',\n            y: 'ਇੱਕ ਸਾਲ',\n            yy: '%d ਸਾਲ',\n        },\n        preparse: function (string) {\n            return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        // Punjabi notation for meridiems are quite fuzzy in practice. While there exists\n        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.\n        meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'ਰਾਤ') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'ਸਵੇਰ') {\n                return hour;\n            } else if (meridiem === 'ਦੁਪਹਿਰ') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'ਸ਼ਾਮ') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'ਰਾਤ';\n            } else if (hour < 10) {\n                return 'ਸਵੇਰ';\n            } else if (hour < 17) {\n                return 'ਦੁਪਹਿਰ';\n            } else if (hour < 20) {\n                return 'ਸ਼ਾਮ';\n            } else {\n                return 'ਰਾਤ';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return paIn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Polish [pl]\n//! author : Rafal Hirsz : https://github.com/evoL\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsNominative =\n            'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split(\n                '_'\n            ),\n        monthsSubjective =\n            'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split(\n                '_'\n            ),\n        monthsParse = [\n            /^sty/i,\n            /^lut/i,\n            /^mar/i,\n            /^kwi/i,\n            /^maj/i,\n            /^cze/i,\n            /^lip/i,\n            /^sie/i,\n            /^wrz/i,\n            /^paź/i,\n            /^lis/i,\n            /^gru/i,\n        ];\n    function plural(n) {\n        return n % 10 < 5 && n % 10 > 1 && ~~(n / 10) % 10 !== 1;\n    }\n    function translate(number, withoutSuffix, key) {\n        var result = number + ' ';\n        switch (key) {\n            case 'ss':\n                return result + (plural(number) ? 'sekundy' : 'sekund');\n            case 'm':\n                return withoutSuffix ? 'minuta' : 'minutę';\n            case 'mm':\n                return result + (plural(number) ? 'minuty' : 'minut');\n            case 'h':\n                return withoutSuffix ? 'godzina' : 'godzinę';\n            case 'hh':\n                return result + (plural(number) ? 'godziny' : 'godzin');\n            case 'ww':\n                return result + (plural(number) ? 'tygodnie' : 'tygodni');\n            case 'MM':\n                return result + (plural(number) ? 'miesiące' : 'miesięcy');\n            case 'yy':\n                return result + (plural(number) ? 'lata' : 'lat');\n        }\n    }\n\n    var pl = moment.defineLocale('pl', {\n        months: function (momentToFormat, format) {\n            if (!momentToFormat) {\n                return monthsNominative;\n            } else if (/D MMMM/.test(format)) {\n                return monthsSubjective[momentToFormat.month()];\n            } else {\n                return monthsNominative[momentToFormat.month()];\n            }\n        },\n        monthsShort: 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays:\n            'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),\n        weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),\n        weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Dziś o] LT',\n            nextDay: '[Jutro o] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[W niedzielę o] LT';\n\n                    case 2:\n                        return '[We wtorek o] LT';\n\n                    case 3:\n                        return '[W środę o] LT';\n\n                    case 6:\n                        return '[W sobotę o] LT';\n\n                    default:\n                        return '[W] dddd [o] LT';\n                }\n            },\n            lastDay: '[Wczoraj o] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[W zeszłą niedzielę o] LT';\n                    case 3:\n                        return '[W zeszłą środę o] LT';\n                    case 6:\n                        return '[W zeszłą sobotę o] LT';\n                    default:\n                        return '[W zeszły] dddd [o] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: '%s temu',\n            s: 'kilka sekund',\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: '1 dzień',\n            dd: '%d dni',\n            w: 'tydzień',\n            ww: translate,\n            M: 'miesiąc',\n            MM: translate,\n            y: 'rok',\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return pl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Portuguese (Brazil) [pt-br]\n//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ptBr = moment.defineLocale('pt-br', {\n        months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(\n            '_'\n        ),\n        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n        weekdays:\n            'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split(\n                '_'\n            ),\n        weekdaysShort: 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),\n        weekdaysMin: 'do_2ª_3ª_4ª_5ª_6ª_sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm',\n        },\n        calendar: {\n            sameDay: '[Hoje às] LT',\n            nextDay: '[Amanhã às] LT',\n            nextWeek: 'dddd [às] LT',\n            lastDay: '[Ontem às] LT',\n            lastWeek: function () {\n                return this.day() === 0 || this.day() === 6\n                    ? '[Último] dddd [às] LT' // Saturday + Sunday\n                    : '[Última] dddd [às] LT'; // Monday - Friday\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'em %s',\n            past: 'há %s',\n            s: 'poucos segundos',\n            ss: '%d segundos',\n            m: 'um minuto',\n            mm: '%d minutos',\n            h: 'uma hora',\n            hh: '%d horas',\n            d: 'um dia',\n            dd: '%d dias',\n            M: 'um mês',\n            MM: '%d meses',\n            y: 'um ano',\n            yy: '%d anos',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        invalidDate: 'Data inválida',\n    });\n\n    return ptBr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Portuguese [pt]\n//! author : Jefferson : https://github.com/jalex79\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var pt = moment.defineLocale('pt', {\n        months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(\n            '_'\n        ),\n        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n        weekdays:\n            'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split(\n                '_'\n            ),\n        weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),\n        weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY HH:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Hoje às] LT',\n            nextDay: '[Amanhã às] LT',\n            nextWeek: 'dddd [às] LT',\n            lastDay: '[Ontem às] LT',\n            lastWeek: function () {\n                return this.day() === 0 || this.day() === 6\n                    ? '[Último] dddd [às] LT' // Saturday + Sunday\n                    : '[Última] dddd [às] LT'; // Monday - Friday\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'em %s',\n            past: 'há %s',\n            s: 'segundos',\n            ss: '%d segundos',\n            m: 'um minuto',\n            mm: '%d minutos',\n            h: 'uma hora',\n            hh: '%d horas',\n            d: 'um dia',\n            dd: '%d dias',\n            w: 'uma semana',\n            ww: '%d semanas',\n            M: 'um mês',\n            MM: '%d meses',\n            y: 'um ano',\n            yy: '%d anos',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}º/,\n        ordinal: '%dº',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return pt;\n\n})));\n","//! moment.js locale configuration\n//! locale : Romanian [ro]\n//! author : Vlad Gurdiga : https://github.com/gurdiga\n//! author : Valentin Agachi : https://github.com/avaly\n//! author : Emanuel Cepoi : https://github.com/cepem\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function relativeTimeWithPlural(number, withoutSuffix, key) {\n        var format = {\n                ss: 'secunde',\n                mm: 'minute',\n                hh: 'ore',\n                dd: 'zile',\n                ww: 'săptămâni',\n                MM: 'luni',\n                yy: 'ani',\n            },\n            separator = ' ';\n        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {\n            separator = ' de ';\n        }\n        return number + separator + format[key];\n    }\n\n    var ro = moment.defineLocale('ro', {\n        months: 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split(\n            '_'\n        ),\n        monthsShort:\n            'ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),\n        weekdaysShort: 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),\n        weekdaysMin: 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY H:mm',\n            LLLL: 'dddd, D MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[azi la] LT',\n            nextDay: '[mâine la] LT',\n            nextWeek: 'dddd [la] LT',\n            lastDay: '[ieri la] LT',\n            lastWeek: '[fosta] dddd [la] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'peste %s',\n            past: '%s în urmă',\n            s: 'câteva secunde',\n            ss: relativeTimeWithPlural,\n            m: 'un minut',\n            mm: relativeTimeWithPlural,\n            h: 'o oră',\n            hh: relativeTimeWithPlural,\n            d: 'o zi',\n            dd: relativeTimeWithPlural,\n            w: 'o săptămână',\n            ww: relativeTimeWithPlural,\n            M: 'o lună',\n            MM: relativeTimeWithPlural,\n            y: 'un an',\n            yy: relativeTimeWithPlural,\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return ro;\n\n})));\n","//! moment.js locale configuration\n//! locale : Russian [ru]\n//! author : Viktorminator : https://github.com/Viktorminator\n//! author : Menelion Elensúle : https://github.com/Oire\n//! author : Коренберг Марк : https://github.com/socketpair\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function plural(word, num) {\n        var forms = word.split('_');\n        return num % 10 === 1 && num % 100 !== 11\n            ? forms[0]\n            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)\n              ? forms[1]\n              : forms[2];\n    }\n    function relativeTimeWithPlural(number, withoutSuffix, key) {\n        var format = {\n            ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n            mm: withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',\n            hh: 'час_часа_часов',\n            dd: 'день_дня_дней',\n            ww: 'неделя_недели_недель',\n            MM: 'месяц_месяца_месяцев',\n            yy: 'год_года_лет',\n        };\n        if (key === 'm') {\n            return withoutSuffix ? 'минута' : 'минуту';\n        } else {\n            return number + ' ' + plural(format[key], +number);\n        }\n    }\n    var monthsParse = [\n        /^янв/i,\n        /^фев/i,\n        /^мар/i,\n        /^апр/i,\n        /^ма[йя]/i,\n        /^июн/i,\n        /^июл/i,\n        /^авг/i,\n        /^сен/i,\n        /^окт/i,\n        /^ноя/i,\n        /^дек/i,\n    ];\n\n    // http://new.gramota.ru/spravka/rules/139-prop : § 103\n    // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637\n    // CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753\n    var ru = moment.defineLocale('ru', {\n        months: {\n            format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split(\n                '_'\n            ),\n            standalone:\n                'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(\n                    '_'\n                ),\n        },\n        monthsShort: {\n            // по CLDR именно \"июл.\" и \"июн.\", но какой смысл менять букву на точку?\n            format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split(\n                '_'\n            ),\n            standalone:\n                'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split(\n                    '_'\n                ),\n        },\n        weekdays: {\n            standalone:\n                'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split(\n                    '_'\n                ),\n            format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split(\n                '_'\n            ),\n            isFormat: /\\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/,\n        },\n        weekdaysShort: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),\n        weekdaysMin: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n\n        // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки\n        monthsRegex:\n            /^(январ[ья]|янв\\.?|феврал[ья]|февр?\\.?|марта?|мар\\.?|апрел[ья]|апр\\.?|ма[йя]|июн[ья]|июн\\.?|июл[ья]|июл\\.?|августа?|авг\\.?|сентябр[ья]|сент?\\.?|октябр[ья]|окт\\.?|ноябр[ья]|нояб?\\.?|декабр[ья]|дек\\.?)/i,\n\n        // копия предыдущего\n        monthsShortRegex:\n            /^(январ[ья]|янв\\.?|феврал[ья]|февр?\\.?|марта?|мар\\.?|апрел[ья]|апр\\.?|ма[йя]|июн[ья]|июн\\.?|июл[ья]|июл\\.?|августа?|авг\\.?|сентябр[ья]|сент?\\.?|октябр[ья]|окт\\.?|ноябр[ья]|нояб?\\.?|декабр[ья]|дек\\.?)/i,\n\n        // полные названия с падежами\n        monthsStrictRegex:\n            /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,\n\n        // Выражение, которое соответствует только сокращённым формам\n        monthsShortStrictRegex:\n            /^(янв\\.|февр?\\.|мар[т.]|апр\\.|ма[яй]|июн[ья.]|июл[ья.]|авг\\.|сент?\\.|окт\\.|нояб?\\.|дек\\.)/i,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY г.',\n            LLL: 'D MMMM YYYY г., H:mm',\n            LLLL: 'dddd, D MMMM YYYY г., H:mm',\n        },\n        calendar: {\n            sameDay: '[Сегодня, в] LT',\n            nextDay: '[Завтра, в] LT',\n            lastDay: '[Вчера, в] LT',\n            nextWeek: function (now) {\n                if (now.week() !== this.week()) {\n                    switch (this.day()) {\n                        case 0:\n                            return '[В следующее] dddd, [в] LT';\n                        case 1:\n                        case 2:\n                        case 4:\n                            return '[В следующий] dddd, [в] LT';\n                        case 3:\n                        case 5:\n                        case 6:\n                            return '[В следующую] dddd, [в] LT';\n                    }\n                } else {\n                    if (this.day() === 2) {\n                        return '[Во] dddd, [в] LT';\n                    } else {\n                        return '[В] dddd, [в] LT';\n                    }\n                }\n            },\n            lastWeek: function (now) {\n                if (now.week() !== this.week()) {\n                    switch (this.day()) {\n                        case 0:\n                            return '[В прошлое] dddd, [в] LT';\n                        case 1:\n                        case 2:\n                        case 4:\n                            return '[В прошлый] dddd, [в] LT';\n                        case 3:\n                        case 5:\n                        case 6:\n                            return '[В прошлую] dddd, [в] LT';\n                    }\n                } else {\n                    if (this.day() === 2) {\n                        return '[Во] dddd, [в] LT';\n                    } else {\n                        return '[В] dddd, [в] LT';\n                    }\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'через %s',\n            past: '%s назад',\n            s: 'несколько секунд',\n            ss: relativeTimeWithPlural,\n            m: relativeTimeWithPlural,\n            mm: relativeTimeWithPlural,\n            h: 'час',\n            hh: relativeTimeWithPlural,\n            d: 'день',\n            dd: relativeTimeWithPlural,\n            w: 'неделя',\n            ww: relativeTimeWithPlural,\n            M: 'месяц',\n            MM: relativeTimeWithPlural,\n            y: 'год',\n            yy: relativeTimeWithPlural,\n        },\n        meridiemParse: /ночи|утра|дня|вечера/i,\n        isPM: function (input) {\n            return /^(дня|вечера)$/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'ночи';\n            } else if (hour < 12) {\n                return 'утра';\n            } else if (hour < 17) {\n                return 'дня';\n            } else {\n                return 'вечера';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(й|го|я)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'M':\n                case 'd':\n                case 'DDD':\n                    return number + '-й';\n                case 'D':\n                    return number + '-го';\n                case 'w':\n                case 'W':\n                    return number + '-я';\n                default:\n                    return number;\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return ru;\n\n})));\n","//! moment.js locale configuration\n//! locale : Sindhi [sd]\n//! author : Narain Sagar : https://github.com/narainsagar\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = [\n            'جنوري',\n            'فيبروري',\n            'مارچ',\n            'اپريل',\n            'مئي',\n            'جون',\n            'جولاءِ',\n            'آگسٽ',\n            'سيپٽمبر',\n            'آڪٽوبر',\n            'نومبر',\n            'ڊسمبر',\n        ],\n        days = ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمع', 'ڇنڇر'];\n\n    var sd = moment.defineLocale('sd', {\n        months: months,\n        monthsShort: months,\n        weekdays: days,\n        weekdaysShort: days,\n        weekdaysMin: days,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd، D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /صبح|شام/,\n        isPM: function (input) {\n            return 'شام' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'صبح';\n            }\n            return 'شام';\n        },\n        calendar: {\n            sameDay: '[اڄ] LT',\n            nextDay: '[سڀاڻي] LT',\n            nextWeek: 'dddd [اڳين هفتي تي] LT',\n            lastDay: '[ڪالهه] LT',\n            lastWeek: '[گزريل هفتي] dddd [تي] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s پوء',\n            past: '%s اڳ',\n            s: 'چند سيڪنڊ',\n            ss: '%d سيڪنڊ',\n            m: 'هڪ منٽ',\n            mm: '%d منٽ',\n            h: 'هڪ ڪلاڪ',\n            hh: '%d ڪلاڪ',\n            d: 'هڪ ڏينهن',\n            dd: '%d ڏينهن',\n            M: 'هڪ مهينو',\n            MM: '%d مهينا',\n            y: 'هڪ سال',\n            yy: '%d سال',\n        },\n        preparse: function (string) {\n            return string.replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string.replace(/,/g, '،');\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return sd;\n\n})));\n","//! moment.js locale configuration\n//! locale : Northern Sami [se]\n//! authors : Bård Rolstad Henriksen : https://github.com/karamell\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var se = moment.defineLocale('se', {\n        months: 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split(\n            '_'\n        ),\n        monthsShort:\n            'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),\n        weekdays:\n            'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split(\n                '_'\n            ),\n        weekdaysShort: 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),\n        weekdaysMin: 's_v_m_g_d_b_L'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'MMMM D. [b.] YYYY',\n            LLL: 'MMMM D. [b.] YYYY [ti.] HH:mm',\n            LLLL: 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm',\n        },\n        calendar: {\n            sameDay: '[otne ti] LT',\n            nextDay: '[ihttin ti] LT',\n            nextWeek: 'dddd [ti] LT',\n            lastDay: '[ikte ti] LT',\n            lastWeek: '[ovddit] dddd [ti] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s geažes',\n            past: 'maŋit %s',\n            s: 'moadde sekunddat',\n            ss: '%d sekunddat',\n            m: 'okta minuhta',\n            mm: '%d minuhtat',\n            h: 'okta diimmu',\n            hh: '%d diimmut',\n            d: 'okta beaivi',\n            dd: '%d beaivvit',\n            M: 'okta mánnu',\n            MM: '%d mánut',\n            y: 'okta jahki',\n            yy: '%d jagit',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return se;\n\n})));\n","//! moment.js locale configuration\n//! locale : Sinhalese [si]\n//! author : Sampath Sitinamaluwa : https://github.com/sampathsris\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    /*jshint -W100*/\n    var si = moment.defineLocale('si', {\n        months: 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split(\n            '_'\n        ),\n        monthsShort: 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split(\n            '_'\n        ),\n        weekdays:\n            'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split(\n                '_'\n            ),\n        weekdaysShort: 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),\n        weekdaysMin: 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'a h:mm',\n            LTS: 'a h:mm:ss',\n            L: 'YYYY/MM/DD',\n            LL: 'YYYY MMMM D',\n            LLL: 'YYYY MMMM D, a h:mm',\n            LLLL: 'YYYY MMMM D [වැනි] dddd, a h:mm:ss',\n        },\n        calendar: {\n            sameDay: '[අද] LT[ට]',\n            nextDay: '[හෙට] LT[ට]',\n            nextWeek: 'dddd LT[ට]',\n            lastDay: '[ඊයේ] LT[ට]',\n            lastWeek: '[පසුගිය] dddd LT[ට]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%sකින්',\n            past: '%sකට පෙර',\n            s: 'තත්පර කිහිපය',\n            ss: 'තත්පර %d',\n            m: 'මිනිත්තුව',\n            mm: 'මිනිත්තු %d',\n            h: 'පැය',\n            hh: 'පැය %d',\n            d: 'දිනය',\n            dd: 'දින %d',\n            M: 'මාසය',\n            MM: 'මාස %d',\n            y: 'වසර',\n            yy: 'වසර %d',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2} වැනි/,\n        ordinal: function (number) {\n            return number + ' වැනි';\n        },\n        meridiemParse: /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,\n        isPM: function (input) {\n            return input === 'ප.ව.' || input === 'පස් වරු';\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours > 11) {\n                return isLower ? 'ප.ව.' : 'පස් වරු';\n            } else {\n                return isLower ? 'පෙ.ව.' : 'පෙර වරු';\n            }\n        },\n    });\n\n    return si;\n\n})));\n","//! moment.js locale configuration\n//! locale : Slovak [sk]\n//! author : Martin Minka : https://github.com/k2s\n//! based on work of petrbela : https://github.com/petrbela\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months =\n            'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split(\n                '_'\n            ),\n        monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');\n    function plural(n) {\n        return n > 1 && n < 5;\n    }\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        switch (key) {\n            case 's': // a few seconds / in a few seconds / a few seconds ago\n                return withoutSuffix || isFuture ? 'pár sekúnd' : 'pár sekundami';\n            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'sekundy' : 'sekúnd');\n                } else {\n                    return result + 'sekundami';\n                }\n            case 'm': // a minute / in a minute / a minute ago\n                return withoutSuffix ? 'minúta' : isFuture ? 'minútu' : 'minútou';\n            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'minúty' : 'minút');\n                } else {\n                    return result + 'minútami';\n                }\n            case 'h': // an hour / in an hour / an hour ago\n                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';\n            case 'hh': // 9 hours / in 9 hours / 9 hours ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'hodiny' : 'hodín');\n                } else {\n                    return result + 'hodinami';\n                }\n            case 'd': // a day / in a day / a day ago\n                return withoutSuffix || isFuture ? 'deň' : 'dňom';\n            case 'dd': // 9 days / in 9 days / 9 days ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'dni' : 'dní');\n                } else {\n                    return result + 'dňami';\n                }\n            case 'M': // a month / in a month / a month ago\n                return withoutSuffix || isFuture ? 'mesiac' : 'mesiacom';\n            case 'MM': // 9 months / in 9 months / 9 months ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'mesiace' : 'mesiacov');\n                } else {\n                    return result + 'mesiacmi';\n                }\n            case 'y': // a year / in a year / a year ago\n                return withoutSuffix || isFuture ? 'rok' : 'rokom';\n            case 'yy': // 9 years / in 9 years / 9 years ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'roky' : 'rokov');\n                } else {\n                    return result + 'rokmi';\n                }\n        }\n    }\n\n    var sk = moment.defineLocale('sk', {\n        months: months,\n        monthsShort: monthsShort,\n        weekdays: 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),\n        weekdaysShort: 'ne_po_ut_st_št_pi_so'.split('_'),\n        weekdaysMin: 'ne_po_ut_st_št_pi_so'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd D. MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[dnes o] LT',\n            nextDay: '[zajtra o] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[v nedeľu o] LT';\n                    case 1:\n                    case 2:\n                        return '[v] dddd [o] LT';\n                    case 3:\n                        return '[v stredu o] LT';\n                    case 4:\n                        return '[vo štvrtok o] LT';\n                    case 5:\n                        return '[v piatok o] LT';\n                    case 6:\n                        return '[v sobotu o] LT';\n                }\n            },\n            lastDay: '[včera o] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[minulú nedeľu o] LT';\n                    case 1:\n                    case 2:\n                        return '[minulý] dddd [o] LT';\n                    case 3:\n                        return '[minulú stredu o] LT';\n                    case 4:\n                    case 5:\n                        return '[minulý] dddd [o] LT';\n                    case 6:\n                        return '[minulú sobotu o] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'pred %s',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return sk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Slovenian [sl]\n//! author : Robert Sedovšek : https://github.com/sedovsek\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        switch (key) {\n            case 's':\n                return withoutSuffix || isFuture\n                    ? 'nekaj sekund'\n                    : 'nekaj sekundami';\n            case 'ss':\n                if (number === 1) {\n                    result += withoutSuffix ? 'sekundo' : 'sekundi';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';\n                } else if (number < 5) {\n                    result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';\n                } else {\n                    result += 'sekund';\n                }\n                return result;\n            case 'm':\n                return withoutSuffix ? 'ena minuta' : 'eno minuto';\n            case 'mm':\n                if (number === 1) {\n                    result += withoutSuffix ? 'minuta' : 'minuto';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'minuti' : 'minutama';\n                } else if (number < 5) {\n                    result += withoutSuffix || isFuture ? 'minute' : 'minutami';\n                } else {\n                    result += withoutSuffix || isFuture ? 'minut' : 'minutami';\n                }\n                return result;\n            case 'h':\n                return withoutSuffix ? 'ena ura' : 'eno uro';\n            case 'hh':\n                if (number === 1) {\n                    result += withoutSuffix ? 'ura' : 'uro';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'uri' : 'urama';\n                } else if (number < 5) {\n                    result += withoutSuffix || isFuture ? 'ure' : 'urami';\n                } else {\n                    result += withoutSuffix || isFuture ? 'ur' : 'urami';\n                }\n                return result;\n            case 'd':\n                return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';\n            case 'dd':\n                if (number === 1) {\n                    result += withoutSuffix || isFuture ? 'dan' : 'dnem';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';\n                } else {\n                    result += withoutSuffix || isFuture ? 'dni' : 'dnevi';\n                }\n                return result;\n            case 'M':\n                return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';\n            case 'MM':\n                if (number === 1) {\n                    result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';\n                } else if (number < 5) {\n                    result += withoutSuffix || isFuture ? 'mesece' : 'meseci';\n                } else {\n                    result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';\n                }\n                return result;\n            case 'y':\n                return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';\n            case 'yy':\n                if (number === 1) {\n                    result += withoutSuffix || isFuture ? 'leto' : 'letom';\n                } else if (number === 2) {\n                    result += withoutSuffix || isFuture ? 'leti' : 'letoma';\n                } else if (number < 5) {\n                    result += withoutSuffix || isFuture ? 'leta' : 'leti';\n                } else {\n                    result += withoutSuffix || isFuture ? 'let' : 'leti';\n                }\n                return result;\n        }\n    }\n\n    var sl = moment.defineLocale('sl', {\n        months: 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),\n        weekdaysShort: 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),\n        weekdaysMin: 'ne_po_to_sr_če_pe_so'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD. MM. YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd, D. MMMM YYYY H:mm',\n        },\n        calendar: {\n            sameDay: '[danes ob] LT',\n            nextDay: '[jutri ob] LT',\n\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[v] [nedeljo] [ob] LT';\n                    case 3:\n                        return '[v] [sredo] [ob] LT';\n                    case 6:\n                        return '[v] [soboto] [ob] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[v] dddd [ob] LT';\n                }\n            },\n            lastDay: '[včeraj ob] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[prejšnjo] [nedeljo] [ob] LT';\n                    case 3:\n                        return '[prejšnjo] [sredo] [ob] LT';\n                    case 6:\n                        return '[prejšnjo] [soboto] [ob] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[prejšnji] dddd [ob] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'čez %s',\n            past: 'pred %s',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return sl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Albanian [sq]\n//! author : Flakërim Ismani : https://github.com/flakerimi\n//! author : Menelion Elensúle : https://github.com/Oire\n//! author : Oerd Cukalla : https://github.com/oerd\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var sq = moment.defineLocale('sq', {\n        months: 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),\n        weekdays: 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split(\n            '_'\n        ),\n        weekdaysShort: 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),\n        weekdaysMin: 'D_H_Ma_Më_E_P_Sh'.split('_'),\n        weekdaysParseExact: true,\n        meridiemParse: /PD|MD/,\n        isPM: function (input) {\n            return input.charAt(0) === 'M';\n        },\n        meridiem: function (hours, minutes, isLower) {\n            return hours < 12 ? 'PD' : 'MD';\n        },\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Sot në] LT',\n            nextDay: '[Nesër në] LT',\n            nextWeek: 'dddd [në] LT',\n            lastDay: '[Dje në] LT',\n            lastWeek: 'dddd [e kaluar në] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'në %s',\n            past: '%s më parë',\n            s: 'disa sekonda',\n            ss: '%d sekonda',\n            m: 'një minutë',\n            mm: '%d minuta',\n            h: 'një orë',\n            hh: '%d orë',\n            d: 'një ditë',\n            dd: '%d ditë',\n            M: 'një muaj',\n            MM: '%d muaj',\n            y: 'një vit',\n            yy: '%d vite',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return sq;\n\n})));\n","//! moment.js locale configuration\n//! locale : Serbian Cyrillic [sr-cyrl]\n//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j\n//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var translator = {\n        words: {\n            //Different grammatical cases\n            ss: ['секунда', 'секунде', 'секунди'],\n            m: ['један минут', 'једног минута'],\n            mm: ['минут', 'минута', 'минута'],\n            h: ['један сат', 'једног сата'],\n            hh: ['сат', 'сата', 'сати'],\n            d: ['један дан', 'једног дана'],\n            dd: ['дан', 'дана', 'дана'],\n            M: ['један месец', 'једног месеца'],\n            MM: ['месец', 'месеца', 'месеци'],\n            y: ['једну годину', 'једне године'],\n            yy: ['годину', 'године', 'година'],\n        },\n        correctGrammaticalCase: function (number, wordKey) {\n            if (\n                number % 10 >= 1 &&\n                number % 10 <= 4 &&\n                (number % 100 < 10 || number % 100 >= 20)\n            ) {\n                return number % 10 === 1 ? wordKey[0] : wordKey[1];\n            }\n            return wordKey[2];\n        },\n        translate: function (number, withoutSuffix, key, isFuture) {\n            var wordKey = translator.words[key],\n                word;\n\n            if (key.length === 1) {\n                // Nominativ\n                if (key === 'y' && withoutSuffix) return 'једна година';\n                return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];\n            }\n\n            word = translator.correctGrammaticalCase(number, wordKey);\n            // Nominativ\n            if (key === 'yy' && withoutSuffix && word === 'годину') {\n                return number + ' година';\n            }\n\n            return number + ' ' + word;\n        },\n    };\n\n    var srCyrl = moment.defineLocale('sr-cyrl', {\n        months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split(\n            '_'\n        ),\n        monthsShort:\n            'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),\n        weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),\n        weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'D. M. YYYY.',\n            LL: 'D. MMMM YYYY.',\n            LLL: 'D. MMMM YYYY. H:mm',\n            LLLL: 'dddd, D. MMMM YYYY. H:mm',\n        },\n        calendar: {\n            sameDay: '[данас у] LT',\n            nextDay: '[сутра у] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[у] [недељу] [у] LT';\n                    case 3:\n                        return '[у] [среду] [у] LT';\n                    case 6:\n                        return '[у] [суботу] [у] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[у] dddd [у] LT';\n                }\n            },\n            lastDay: '[јуче у] LT',\n            lastWeek: function () {\n                var lastWeekDays = [\n                    '[прошле] [недеље] [у] LT',\n                    '[прошлог] [понедељка] [у] LT',\n                    '[прошлог] [уторка] [у] LT',\n                    '[прошле] [среде] [у] LT',\n                    '[прошлог] [четвртка] [у] LT',\n                    '[прошлог] [петка] [у] LT',\n                    '[прошле] [суботе] [у] LT',\n                ];\n                return lastWeekDays[this.day()];\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'за %s',\n            past: 'пре %s',\n            s: 'неколико секунди',\n            ss: translator.translate,\n            m: translator.translate,\n            mm: translator.translate,\n            h: translator.translate,\n            hh: translator.translate,\n            d: translator.translate,\n            dd: translator.translate,\n            M: translator.translate,\n            MM: translator.translate,\n            y: translator.translate,\n            yy: translator.translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 1st is the first week of the year.\n        },\n    });\n\n    return srCyrl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Serbian [sr]\n//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j\n//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var translator = {\n        words: {\n            //Different grammatical cases\n            ss: ['sekunda', 'sekunde', 'sekundi'],\n            m: ['jedan minut', 'jednog minuta'],\n            mm: ['minut', 'minuta', 'minuta'],\n            h: ['jedan sat', 'jednog sata'],\n            hh: ['sat', 'sata', 'sati'],\n            d: ['jedan dan', 'jednog dana'],\n            dd: ['dan', 'dana', 'dana'],\n            M: ['jedan mesec', 'jednog meseca'],\n            MM: ['mesec', 'meseca', 'meseci'],\n            y: ['jednu godinu', 'jedne godine'],\n            yy: ['godinu', 'godine', 'godina'],\n        },\n        correctGrammaticalCase: function (number, wordKey) {\n            if (\n                number % 10 >= 1 &&\n                number % 10 <= 4 &&\n                (number % 100 < 10 || number % 100 >= 20)\n            ) {\n                return number % 10 === 1 ? wordKey[0] : wordKey[1];\n            }\n            return wordKey[2];\n        },\n        translate: function (number, withoutSuffix, key, isFuture) {\n            var wordKey = translator.words[key],\n                word;\n\n            if (key.length === 1) {\n                // Nominativ\n                if (key === 'y' && withoutSuffix) return 'jedna godina';\n                return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];\n            }\n\n            word = translator.correctGrammaticalCase(number, wordKey);\n            // Nominativ\n            if (key === 'yy' && withoutSuffix && word === 'godinu') {\n                return number + ' godina';\n            }\n\n            return number + ' ' + word;\n        },\n    };\n\n    var sr = moment.defineLocale('sr', {\n        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split(\n            '_'\n        ),\n        weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),\n        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'D. M. YYYY.',\n            LL: 'D. MMMM YYYY.',\n            LLL: 'D. MMMM YYYY. H:mm',\n            LLLL: 'dddd, D. MMMM YYYY. H:mm',\n        },\n        calendar: {\n            sameDay: '[danas u] LT',\n            nextDay: '[sutra u] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[u] [nedelju] [u] LT';\n                    case 3:\n                        return '[u] [sredu] [u] LT';\n                    case 6:\n                        return '[u] [subotu] [u] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                    case 5:\n                        return '[u] dddd [u] LT';\n                }\n            },\n            lastDay: '[juče u] LT',\n            lastWeek: function () {\n                var lastWeekDays = [\n                    '[prošle] [nedelje] [u] LT',\n                    '[prošlog] [ponedeljka] [u] LT',\n                    '[prošlog] [utorka] [u] LT',\n                    '[prošle] [srede] [u] LT',\n                    '[prošlog] [četvrtka] [u] LT',\n                    '[prošlog] [petka] [u] LT',\n                    '[prošle] [subote] [u] LT',\n                ];\n                return lastWeekDays[this.day()];\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'pre %s',\n            s: 'nekoliko sekundi',\n            ss: translator.translate,\n            m: translator.translate,\n            mm: translator.translate,\n            h: translator.translate,\n            hh: translator.translate,\n            d: translator.translate,\n            dd: translator.translate,\n            M: translator.translate,\n            MM: translator.translate,\n            y: translator.translate,\n            yy: translator.translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return sr;\n\n})));\n","//! moment.js locale configuration\n//! locale : siSwati [ss]\n//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ss = moment.defineLocale('ss', {\n        months: \"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni\".split(\n            '_'\n        ),\n        monthsShort: 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),\n        weekdays:\n            'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split(\n                '_'\n            ),\n        weekdaysShort: 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),\n        weekdaysMin: 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Namuhla nga] LT',\n            nextDay: '[Kusasa nga] LT',\n            nextWeek: 'dddd [nga] LT',\n            lastDay: '[Itolo nga] LT',\n            lastWeek: 'dddd [leliphelile] [nga] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'nga %s',\n            past: 'wenteka nga %s',\n            s: 'emizuzwana lomcane',\n            ss: '%d mzuzwana',\n            m: 'umzuzu',\n            mm: '%d emizuzu',\n            h: 'lihora',\n            hh: '%d emahora',\n            d: 'lilanga',\n            dd: '%d emalanga',\n            M: 'inyanga',\n            MM: '%d tinyanga',\n            y: 'umnyaka',\n            yy: '%d iminyaka',\n        },\n        meridiemParse: /ekuseni|emini|entsambama|ebusuku/,\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 11) {\n                return 'ekuseni';\n            } else if (hours < 15) {\n                return 'emini';\n            } else if (hours < 19) {\n                return 'entsambama';\n            } else {\n                return 'ebusuku';\n            }\n        },\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'ekuseni') {\n                return hour;\n            } else if (meridiem === 'emini') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {\n                if (hour === 0) {\n                    return 0;\n                }\n                return hour + 12;\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}/,\n        ordinal: '%d',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return ss;\n\n})));\n","//! moment.js locale configuration\n//! locale : Swedish [sv]\n//! author : Jens Alm : https://github.com/ulmus\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var sv = moment.defineLocale('sv', {\n        months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n        weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),\n        weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),\n        weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY [kl.] HH:mm',\n            LLLL: 'dddd D MMMM YYYY [kl.] HH:mm',\n            lll: 'D MMM YYYY HH:mm',\n            llll: 'ddd D MMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Idag] LT',\n            nextDay: '[Imorgon] LT',\n            lastDay: '[Igår] LT',\n            nextWeek: '[På] dddd LT',\n            lastWeek: '[I] dddd[s] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'om %s',\n            past: 'för %s sedan',\n            s: 'några sekunder',\n            ss: '%d sekunder',\n            m: 'en minut',\n            mm: '%d minuter',\n            h: 'en timme',\n            hh: '%d timmar',\n            d: 'en dag',\n            dd: '%d dagar',\n            M: 'en månad',\n            MM: '%d månader',\n            y: 'ett år',\n            yy: '%d år',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(\\:e|\\:a)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? ':e'\n                        : b === 1\n                          ? ':a'\n                          : b === 2\n                            ? ':a'\n                            : b === 3\n                              ? ':e'\n                              : ':e';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return sv;\n\n})));\n","//! moment.js locale configuration\n//! locale : Swahili [sw]\n//! author : Fahad Kassim : https://github.com/fadsel\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var sw = moment.defineLocale('sw', {\n        months: 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),\n        weekdays:\n            'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split(\n                '_'\n            ),\n        weekdaysShort: 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),\n        weekdaysMin: 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'hh:mm A',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[leo saa] LT',\n            nextDay: '[kesho saa] LT',\n            nextWeek: '[wiki ijayo] dddd [saat] LT',\n            lastDay: '[jana] LT',\n            lastWeek: '[wiki iliyopita] dddd [saat] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s baadaye',\n            past: 'tokea %s',\n            s: 'hivi punde',\n            ss: 'sekunde %d',\n            m: 'dakika moja',\n            mm: 'dakika %d',\n            h: 'saa limoja',\n            hh: 'masaa %d',\n            d: 'siku moja',\n            dd: 'siku %d',\n            M: 'mwezi mmoja',\n            MM: 'miezi %d',\n            y: 'mwaka mmoja',\n            yy: 'miaka %d',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return sw;\n\n})));\n","//! moment.js locale configuration\n//! locale : Tamil [ta]\n//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var symbolMap = {\n            1: '௧',\n            2: '௨',\n            3: '௩',\n            4: '௪',\n            5: '௫',\n            6: '௬',\n            7: '௭',\n            8: '௮',\n            9: '௯',\n            0: '௦',\n        },\n        numberMap = {\n            '௧': '1',\n            '௨': '2',\n            '௩': '3',\n            '௪': '4',\n            '௫': '5',\n            '௬': '6',\n            '௭': '7',\n            '௮': '8',\n            '௯': '9',\n            '௦': '0',\n        };\n\n    var ta = moment.defineLocale('ta', {\n        months: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(\n            '_'\n        ),\n        monthsShort:\n            'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(\n                '_'\n            ),\n        weekdays:\n            'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split(\n                '_'\n            ),\n        weekdaysShort: 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split(\n            '_'\n        ),\n        weekdaysMin: 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, HH:mm',\n            LLLL: 'dddd, D MMMM YYYY, HH:mm',\n        },\n        calendar: {\n            sameDay: '[இன்று] LT',\n            nextDay: '[நாளை] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[நேற்று] LT',\n            lastWeek: '[கடந்த வாரம்] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s இல்',\n            past: '%s முன்',\n            s: 'ஒரு சில விநாடிகள்',\n            ss: '%d விநாடிகள்',\n            m: 'ஒரு நிமிடம்',\n            mm: '%d நிமிடங்கள்',\n            h: 'ஒரு மணி நேரம்',\n            hh: '%d மணி நேரம்',\n            d: 'ஒரு நாள்',\n            dd: '%d நாட்கள்',\n            M: 'ஒரு மாதம்',\n            MM: '%d மாதங்கள்',\n            y: 'ஒரு வருடம்',\n            yy: '%d ஆண்டுகள்',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}வது/,\n        ordinal: function (number) {\n            return number + 'வது';\n        },\n        preparse: function (string) {\n            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {\n                return numberMap[match];\n            });\n        },\n        postformat: function (string) {\n            return string.replace(/\\d/g, function (match) {\n                return symbolMap[match];\n            });\n        },\n        // refer http://ta.wikipedia.org/s/1er1\n        meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 2) {\n                return ' யாமம்';\n            } else if (hour < 6) {\n                return ' வைகறை'; // வைகறை\n            } else if (hour < 10) {\n                return ' காலை'; // காலை\n            } else if (hour < 14) {\n                return ' நண்பகல்'; // நண்பகல்\n            } else if (hour < 18) {\n                return ' எற்பாடு'; // எற்பாடு\n            } else if (hour < 22) {\n                return ' மாலை'; // மாலை\n            } else {\n                return ' யாமம்';\n            }\n        },\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'யாமம்') {\n                return hour < 2 ? hour : hour + 12;\n            } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {\n                return hour;\n            } else if (meridiem === 'நண்பகல்') {\n                return hour >= 10 ? hour : hour + 12;\n            } else {\n                return hour + 12;\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return ta;\n\n})));\n","//! moment.js locale configuration\n//! locale : Telugu [te]\n//! author : Krishna Chaitanya Thota : https://github.com/kcthota\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var te = moment.defineLocale('te', {\n        months: 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split(\n            '_'\n        ),\n        monthsShort:\n            'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split(\n                '_'\n            ),\n        weekdaysShort: 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),\n        weekdaysMin: 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),\n        longDateFormat: {\n            LT: 'A h:mm',\n            LTS: 'A h:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY, A h:mm',\n            LLLL: 'dddd, D MMMM YYYY, A h:mm',\n        },\n        calendar: {\n            sameDay: '[నేడు] LT',\n            nextDay: '[రేపు] LT',\n            nextWeek: 'dddd, LT',\n            lastDay: '[నిన్న] LT',\n            lastWeek: '[గత] dddd, LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s లో',\n            past: '%s క్రితం',\n            s: 'కొన్ని క్షణాలు',\n            ss: '%d సెకన్లు',\n            m: 'ఒక నిమిషం',\n            mm: '%d నిమిషాలు',\n            h: 'ఒక గంట',\n            hh: '%d గంటలు',\n            d: 'ఒక రోజు',\n            dd: '%d రోజులు',\n            M: 'ఒక నెల',\n            MM: '%d నెలలు',\n            y: 'ఒక సంవత్సరం',\n            yy: '%d సంవత్సరాలు',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}వ/,\n        ordinal: '%dవ',\n        meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'రాత్రి') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'ఉదయం') {\n                return hour;\n            } else if (meridiem === 'మధ్యాహ్నం') {\n                return hour >= 10 ? hour : hour + 12;\n            } else if (meridiem === 'సాయంత్రం') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'రాత్రి';\n            } else if (hour < 10) {\n                return 'ఉదయం';\n            } else if (hour < 17) {\n                return 'మధ్యాహ్నం';\n            } else if (hour < 20) {\n                return 'సాయంత్రం';\n            } else {\n                return 'రాత్రి';\n            }\n        },\n        week: {\n            dow: 0, // Sunday is the first day of the week.\n            doy: 6, // The week that contains Jan 6th is the first week of the year.\n        },\n    });\n\n    return te;\n\n})));\n","//! moment.js locale configuration\n//! locale : Tetun Dili (East Timor) [tet]\n//! author : Joshua Brooks : https://github.com/joshbrooks\n//! author : Onorio De J. Afonso : https://github.com/marobo\n//! author : Sonia Simoes : https://github.com/soniasimoes\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var tet = moment.defineLocale('tet', {\n        months: 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),\n        weekdays: 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),\n        weekdaysShort: 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),\n        weekdaysMin: 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Ohin iha] LT',\n            nextDay: '[Aban iha] LT',\n            nextWeek: 'dddd [iha] LT',\n            lastDay: '[Horiseik iha] LT',\n            lastWeek: 'dddd [semana kotuk] [iha] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'iha %s',\n            past: '%s liuba',\n            s: 'segundu balun',\n            ss: 'segundu %d',\n            m: 'minutu ida',\n            mm: 'minutu %d',\n            h: 'oras ida',\n            hh: 'oras %d',\n            d: 'loron ida',\n            dd: 'loron %d',\n            M: 'fulan ida',\n            MM: 'fulan %d',\n            y: 'tinan ida',\n            yy: 'tinan %d',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return tet;\n\n})));\n","//! moment.js locale configuration\n//! locale : Tajik [tg]\n//! author : Orif N. Jr. : https://github.com/orif-jr\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        0: '-ум',\n        1: '-ум',\n        2: '-юм',\n        3: '-юм',\n        4: '-ум',\n        5: '-ум',\n        6: '-ум',\n        7: '-ум',\n        8: '-ум',\n        9: '-ум',\n        10: '-ум',\n        12: '-ум',\n        13: '-ум',\n        20: '-ум',\n        30: '-юм',\n        40: '-ум',\n        50: '-ум',\n        60: '-ум',\n        70: '-ум',\n        80: '-ум',\n        90: '-ум',\n        100: '-ум',\n    };\n\n    var tg = moment.defineLocale('tg', {\n        months: {\n            format: 'январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри'.split(\n                '_'\n            ),\n            standalone:\n                'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(\n                    '_'\n                ),\n        },\n        monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n        weekdays: 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split(\n            '_'\n        ),\n        weekdaysShort: 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),\n        weekdaysMin: 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Имрӯз соати] LT',\n            nextDay: '[Фардо соати] LT',\n            lastDay: '[Дирӯз соати] LT',\n            nextWeek: 'dddd[и] [ҳафтаи оянда соати] LT',\n            lastWeek: 'dddd[и] [ҳафтаи гузашта соати] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'баъди %s',\n            past: '%s пеш',\n            s: 'якчанд сония',\n            m: 'як дақиқа',\n            mm: '%d дақиқа',\n            h: 'як соат',\n            hh: '%d соат',\n            d: 'як рӯз',\n            dd: '%d рӯз',\n            M: 'як моҳ',\n            MM: '%d моҳ',\n            y: 'як сол',\n            yy: '%d сол',\n        },\n        meridiemParse: /шаб|субҳ|рӯз|бегоҳ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === 'шаб') {\n                return hour < 4 ? hour : hour + 12;\n            } else if (meridiem === 'субҳ') {\n                return hour;\n            } else if (meridiem === 'рӯз') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === 'бегоҳ') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'шаб';\n            } else if (hour < 11) {\n                return 'субҳ';\n            } else if (hour < 16) {\n                return 'рӯз';\n            } else if (hour < 19) {\n                return 'бегоҳ';\n            } else {\n                return 'шаб';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(ум|юм)/,\n        ordinal: function (number) {\n            var a = number % 10,\n                b = number >= 100 ? 100 : null;\n            return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 1th is the first week of the year.\n        },\n    });\n\n    return tg;\n\n})));\n","//! moment.js locale configuration\n//! locale : Thai [th]\n//! author : Kridsada Thanabulpong : https://github.com/sirn\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var th = moment.defineLocale('th', {\n        months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split(\n            '_'\n        ),\n        monthsShort:\n            'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),\n        weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference\n        weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY เวลา H:mm',\n            LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm',\n        },\n        meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,\n        isPM: function (input) {\n            return input === 'หลังเที่ยง';\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'ก่อนเที่ยง';\n            } else {\n                return 'หลังเที่ยง';\n            }\n        },\n        calendar: {\n            sameDay: '[วันนี้ เวลา] LT',\n            nextDay: '[พรุ่งนี้ เวลา] LT',\n            nextWeek: 'dddd[หน้า เวลา] LT',\n            lastDay: '[เมื่อวานนี้ เวลา] LT',\n            lastWeek: '[วัน]dddd[ที่แล้ว เวลา] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'อีก %s',\n            past: '%sที่แล้ว',\n            s: 'ไม่กี่วินาที',\n            ss: '%d วินาที',\n            m: '1 นาที',\n            mm: '%d นาที',\n            h: '1 ชั่วโมง',\n            hh: '%d ชั่วโมง',\n            d: '1 วัน',\n            dd: '%d วัน',\n            w: '1 สัปดาห์',\n            ww: '%d สัปดาห์',\n            M: '1 เดือน',\n            MM: '%d เดือน',\n            y: '1 ปี',\n            yy: '%d ปี',\n        },\n    });\n\n    return th;\n\n})));\n","//! moment.js locale configuration\n//! locale : Turkmen [tk]\n//! author : Atamyrat Abdyrahmanov : https://github.com/atamyratabdy\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        1: \"'inji\",\n        5: \"'inji\",\n        8: \"'inji\",\n        70: \"'inji\",\n        80: \"'inji\",\n        2: \"'nji\",\n        7: \"'nji\",\n        20: \"'nji\",\n        50: \"'nji\",\n        3: \"'ünji\",\n        4: \"'ünji\",\n        100: \"'ünji\",\n        6: \"'njy\",\n        9: \"'unjy\",\n        10: \"'unjy\",\n        30: \"'unjy\",\n        60: \"'ynjy\",\n        90: \"'ynjy\",\n    };\n\n    var tk = moment.defineLocale('tk', {\n        months: 'Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr'.split(\n            '_'\n        ),\n        monthsShort: 'Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek'.split('_'),\n        weekdays: 'Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe'.split(\n            '_'\n        ),\n        weekdaysShort: 'Ýek_Duş_Siş_Çar_Pen_Ann_Şen'.split('_'),\n        weekdaysMin: 'Ýk_Dş_Sş_Çr_Pn_An_Şn'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[bugün sagat] LT',\n            nextDay: '[ertir sagat] LT',\n            nextWeek: '[indiki] dddd [sagat] LT',\n            lastDay: '[düýn] LT',\n            lastWeek: '[geçen] dddd [sagat] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s soň',\n            past: '%s öň',\n            s: 'birnäçe sekunt',\n            m: 'bir minut',\n            mm: '%d minut',\n            h: 'bir sagat',\n            hh: '%d sagat',\n            d: 'bir gün',\n            dd: '%d gün',\n            M: 'bir aý',\n            MM: '%d aý',\n            y: 'bir ýyl',\n            yy: '%d ýyl',\n        },\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'Do':\n                case 'DD':\n                    return number;\n                default:\n                    if (number === 0) {\n                        // special case for zero\n                        return number + \"'unjy\";\n                    }\n                    var a = number % 10,\n                        b = (number % 100) - a,\n                        c = number >= 100 ? 100 : null;\n                    return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return tk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Tagalog (Philippines) [tl-ph]\n//! author : Dan Hagman : https://github.com/hagmandan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var tlPh = moment.defineLocale('tl-ph', {\n        months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(\n            '_'\n        ),\n        monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),\n        weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(\n            '_'\n        ),\n        weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),\n        weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'MM/D/YYYY',\n            LL: 'MMMM D, YYYY',\n            LLL: 'MMMM D, YYYY HH:mm',\n            LLLL: 'dddd, MMMM DD, YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: 'LT [ngayong araw]',\n            nextDay: '[Bukas ng] LT',\n            nextWeek: 'LT [sa susunod na] dddd',\n            lastDay: 'LT [kahapon]',\n            lastWeek: 'LT [noong nakaraang] dddd',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'sa loob ng %s',\n            past: '%s ang nakalipas',\n            s: 'ilang segundo',\n            ss: '%d segundo',\n            m: 'isang minuto',\n            mm: '%d minuto',\n            h: 'isang oras',\n            hh: '%d oras',\n            d: 'isang araw',\n            dd: '%d araw',\n            M: 'isang buwan',\n            MM: '%d buwan',\n            y: 'isang taon',\n            yy: '%d taon',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}/,\n        ordinal: function (number) {\n            return number;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return tlPh;\n\n})));\n","//! moment.js locale configuration\n//! locale : Klingon [tlh]\n//! author : Dominika Kruk : https://github.com/amaranthrose\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');\n\n    function translateFuture(output) {\n        var time = output;\n        time =\n            output.indexOf('jaj') !== -1\n                ? time.slice(0, -3) + 'leS'\n                : output.indexOf('jar') !== -1\n                  ? time.slice(0, -3) + 'waQ'\n                  : output.indexOf('DIS') !== -1\n                    ? time.slice(0, -3) + 'nem'\n                    : time + ' pIq';\n        return time;\n    }\n\n    function translatePast(output) {\n        var time = output;\n        time =\n            output.indexOf('jaj') !== -1\n                ? time.slice(0, -3) + 'Hu’'\n                : output.indexOf('jar') !== -1\n                  ? time.slice(0, -3) + 'wen'\n                  : output.indexOf('DIS') !== -1\n                    ? time.slice(0, -3) + 'ben'\n                    : time + ' ret';\n        return time;\n    }\n\n    function translate(number, withoutSuffix, string, isFuture) {\n        var numberNoun = numberAsNoun(number);\n        switch (string) {\n            case 'ss':\n                return numberNoun + ' lup';\n            case 'mm':\n                return numberNoun + ' tup';\n            case 'hh':\n                return numberNoun + ' rep';\n            case 'dd':\n                return numberNoun + ' jaj';\n            case 'MM':\n                return numberNoun + ' jar';\n            case 'yy':\n                return numberNoun + ' DIS';\n        }\n    }\n\n    function numberAsNoun(number) {\n        var hundred = Math.floor((number % 1000) / 100),\n            ten = Math.floor((number % 100) / 10),\n            one = number % 10,\n            word = '';\n        if (hundred > 0) {\n            word += numbersNouns[hundred] + 'vatlh';\n        }\n        if (ten > 0) {\n            word += (word !== '' ? ' ' : '') + numbersNouns[ten] + 'maH';\n        }\n        if (one > 0) {\n            word += (word !== '' ? ' ' : '') + numbersNouns[one];\n        }\n        return word === '' ? 'pagh' : word;\n    }\n\n    var tlh = moment.defineLocale('tlh', {\n        months: 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split(\n            '_'\n        ),\n        monthsShort:\n            'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split(\n            '_'\n        ),\n        weekdaysShort:\n            'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n        weekdaysMin:\n            'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[DaHjaj] LT',\n            nextDay: '[wa’leS] LT',\n            nextWeek: 'LLL',\n            lastDay: '[wa’Hu’] LT',\n            lastWeek: 'LLL',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: translateFuture,\n            past: translatePast,\n            s: 'puS lup',\n            ss: translate,\n            m: 'wa’ tup',\n            mm: translate,\n            h: 'wa’ rep',\n            hh: translate,\n            d: 'wa’ jaj',\n            dd: translate,\n            M: 'wa’ jar',\n            MM: translate,\n            y: 'wa’ DIS',\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return tlh;\n\n})));\n","//! moment.js locale configuration\n//! locale : Turkish [tr]\n//! authors : Erhan Gundogan : https://github.com/erhangundogan,\n//!           Burak Yiğit Kaya: https://github.com/BYK\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        1: \"'inci\",\n        5: \"'inci\",\n        8: \"'inci\",\n        70: \"'inci\",\n        80: \"'inci\",\n        2: \"'nci\",\n        7: \"'nci\",\n        20: \"'nci\",\n        50: \"'nci\",\n        3: \"'üncü\",\n        4: \"'üncü\",\n        100: \"'üncü\",\n        6: \"'ncı\",\n        9: \"'uncu\",\n        10: \"'uncu\",\n        30: \"'uncu\",\n        60: \"'ıncı\",\n        90: \"'ıncı\",\n    };\n\n    var tr = moment.defineLocale('tr', {\n        months: 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split(\n            '_'\n        ),\n        monthsShort: 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),\n        weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split(\n            '_'\n        ),\n        weekdaysShort: 'Paz_Pzt_Sal_Çar_Per_Cum_Cmt'.split('_'),\n        weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower ? 'öö' : 'ÖÖ';\n            } else {\n                return isLower ? 'ös' : 'ÖS';\n            }\n        },\n        meridiemParse: /öö|ÖÖ|ös|ÖS/,\n        isPM: function (input) {\n            return input === 'ös' || input === 'ÖS';\n        },\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[bugün saat] LT',\n            nextDay: '[yarın saat] LT',\n            nextWeek: '[gelecek] dddd [saat] LT',\n            lastDay: '[dün] LT',\n            lastWeek: '[geçen] dddd [saat] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s sonra',\n            past: '%s önce',\n            s: 'birkaç saniye',\n            ss: '%d saniye',\n            m: 'bir dakika',\n            mm: '%d dakika',\n            h: 'bir saat',\n            hh: '%d saat',\n            d: 'bir gün',\n            dd: '%d gün',\n            w: 'bir hafta',\n            ww: '%d hafta',\n            M: 'bir ay',\n            MM: '%d ay',\n            y: 'bir yıl',\n            yy: '%d yıl',\n        },\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'Do':\n                case 'DD':\n                    return number;\n                default:\n                    if (number === 0) {\n                        // special case for zero\n                        return number + \"'ıncı\";\n                    }\n                    var a = number % 10,\n                        b = (number % 100) - a,\n                        c = number >= 100 ? 100 : null;\n                    return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return tr;\n\n})));\n","//! moment.js locale configuration\n//! locale : Talossan [tzl]\n//! author : Robin van der Vliet : https://github.com/robin0van0der0v\n//! author : Iustì Canun\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.\n    // This is currently too difficult (maybe even impossible) to add.\n    var tzl = moment.defineLocale('tzl', {\n        months: 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),\n        weekdays: 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),\n        weekdaysShort: 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),\n        weekdaysMin: 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),\n        longDateFormat: {\n            LT: 'HH.mm',\n            LTS: 'HH.mm.ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM [dallas] YYYY',\n            LLL: 'D. MMMM [dallas] YYYY HH.mm',\n            LLLL: 'dddd, [li] D. MMMM [dallas] YYYY HH.mm',\n        },\n        meridiemParse: /d\\'o|d\\'a/i,\n        isPM: function (input) {\n            return \"d'o\" === input.toLowerCase();\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours > 11) {\n                return isLower ? \"d'o\" : \"D'O\";\n            } else {\n                return isLower ? \"d'a\" : \"D'A\";\n            }\n        },\n        calendar: {\n            sameDay: '[oxhi à] LT',\n            nextDay: '[demà à] LT',\n            nextWeek: 'dddd [à] LT',\n            lastDay: '[ieiri à] LT',\n            lastWeek: '[sür el] dddd [lasteu à] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'osprei %s',\n            past: 'ja%s',\n            s: processRelativeTime,\n            ss: processRelativeTime,\n            m: processRelativeTime,\n            mm: processRelativeTime,\n            h: processRelativeTime,\n            hh: processRelativeTime,\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            s: ['viensas secunds', \"'iensas secunds\"],\n            ss: [number + ' secunds', '' + number + ' secunds'],\n            m: [\"'n míut\", \"'iens míut\"],\n            mm: [number + ' míuts', '' + number + ' míuts'],\n            h: [\"'n þora\", \"'iensa þora\"],\n            hh: [number + ' þoras', '' + number + ' þoras'],\n            d: [\"'n ziua\", \"'iensa ziua\"],\n            dd: [number + ' ziuas', '' + number + ' ziuas'],\n            M: [\"'n mes\", \"'iens mes\"],\n            MM: [number + ' mesen', '' + number + ' mesen'],\n            y: [\"'n ar\", \"'iens ar\"],\n            yy: [number + ' ars', '' + number + ' ars'],\n        };\n        return isFuture\n            ? format[key][0]\n            : withoutSuffix\n              ? format[key][0]\n              : format[key][1];\n    }\n\n    return tzl;\n\n})));\n","//! moment.js locale configuration\n//! locale : Central Atlas Tamazight Latin [tzm-latn]\n//! author : Abdel Said : https://github.com/abdelsaid\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var tzmLatn = moment.defineLocale('tzm-latn', {\n        months: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(\n            '_'\n        ),\n        monthsShort:\n            'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(\n                '_'\n            ),\n        weekdays: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n        weekdaysShort: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n        weekdaysMin: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[asdkh g] LT',\n            nextDay: '[aska g] LT',\n            nextWeek: 'dddd [g] LT',\n            lastDay: '[assant g] LT',\n            lastWeek: 'dddd [g] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dadkh s yan %s',\n            past: 'yan %s',\n            s: 'imik',\n            ss: '%d imik',\n            m: 'minuḍ',\n            mm: '%d minuḍ',\n            h: 'saɛa',\n            hh: '%d tassaɛin',\n            d: 'ass',\n            dd: '%d ossan',\n            M: 'ayowr',\n            MM: '%d iyyirn',\n            y: 'asgas',\n            yy: '%d isgasn',\n        },\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return tzmLatn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Central Atlas Tamazight [tzm]\n//! author : Abdel Said : https://github.com/abdelsaid\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var tzm = moment.defineLocale('tzm', {\n        months: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(\n            '_'\n        ),\n        monthsShort:\n            'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(\n                '_'\n            ),\n        weekdays: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n        weekdaysShort: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n        weekdaysMin: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',\n            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',\n            nextWeek: 'dddd [ⴴ] LT',\n            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',\n            lastWeek: 'dddd [ⴴ] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',\n            past: 'ⵢⴰⵏ %s',\n            s: 'ⵉⵎⵉⴽ',\n            ss: '%d ⵉⵎⵉⴽ',\n            m: 'ⵎⵉⵏⵓⴺ',\n            mm: '%d ⵎⵉⵏⵓⴺ',\n            h: 'ⵙⴰⵄⴰ',\n            hh: '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',\n            d: 'ⴰⵙⵙ',\n            dd: '%d oⵙⵙⴰⵏ',\n            M: 'ⴰⵢoⵓⵔ',\n            MM: '%d ⵉⵢⵢⵉⵔⵏ',\n            y: 'ⴰⵙⴳⴰⵙ',\n            yy: '%d ⵉⵙⴳⴰⵙⵏ',\n        },\n        week: {\n            dow: 6, // Saturday is the first day of the week.\n            doy: 12, // The week that contains Jan 12th is the first week of the year.\n        },\n    });\n\n    return tzm;\n\n})));\n","//! moment.js locale configuration\n//! locale : Uyghur (China) [ug-cn]\n//! author: boyaq : https://github.com/boyaq\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var ugCn = moment.defineLocale('ug-cn', {\n        months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(\n            '_'\n        ),\n        monthsShort:\n            'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(\n                '_'\n            ),\n        weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split(\n            '_'\n        ),\n        weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n        weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY-MM-DD',\n            LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',\n            LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',\n            LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',\n        },\n        meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (\n                meridiem === 'يېرىم كېچە' ||\n                meridiem === 'سەھەر' ||\n                meridiem === 'چۈشتىن بۇرۇن'\n            ) {\n                return hour;\n            } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {\n                return hour + 12;\n            } else {\n                return hour >= 11 ? hour : hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            var hm = hour * 100 + minute;\n            if (hm < 600) {\n                return 'يېرىم كېچە';\n            } else if (hm < 900) {\n                return 'سەھەر';\n            } else if (hm < 1130) {\n                return 'چۈشتىن بۇرۇن';\n            } else if (hm < 1230) {\n                return 'چۈش';\n            } else if (hm < 1800) {\n                return 'چۈشتىن كېيىن';\n            } else {\n                return 'كەچ';\n            }\n        },\n        calendar: {\n            sameDay: '[بۈگۈن سائەت] LT',\n            nextDay: '[ئەتە سائەت] LT',\n            nextWeek: '[كېلەركى] dddd [سائەت] LT',\n            lastDay: '[تۆنۈگۈن] LT',\n            lastWeek: '[ئالدىنقى] dddd [سائەت] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s كېيىن',\n            past: '%s بۇرۇن',\n            s: 'نەچچە سېكونت',\n            ss: '%d سېكونت',\n            m: 'بىر مىنۇت',\n            mm: '%d مىنۇت',\n            h: 'بىر سائەت',\n            hh: '%d سائەت',\n            d: 'بىر كۈن',\n            dd: '%d كۈن',\n            M: 'بىر ئاي',\n            MM: '%d ئاي',\n            y: 'بىر يىل',\n            yy: '%d يىل',\n        },\n\n        dayOfMonthOrdinalParse: /\\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '-كۈنى';\n                case 'w':\n                case 'W':\n                    return number + '-ھەپتە';\n                default:\n                    return number;\n            }\n        },\n        preparse: function (string) {\n            return string.replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string.replace(/,/g, '،');\n        },\n        week: {\n            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 1st is the first week of the year.\n        },\n    });\n\n    return ugCn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Ukrainian [uk]\n//! author : zemlanin : https://github.com/zemlanin\n//! Author : Menelion Elensúle : https://github.com/Oire\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function plural(word, num) {\n        var forms = word.split('_');\n        return num % 10 === 1 && num % 100 !== 11\n            ? forms[0]\n            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)\n              ? forms[1]\n              : forms[2];\n    }\n    function relativeTimeWithPlural(number, withoutSuffix, key) {\n        var format = {\n            ss: withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',\n            mm: withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',\n            hh: withoutSuffix ? 'година_години_годин' : 'годину_години_годин',\n            dd: 'день_дні_днів',\n            MM: 'місяць_місяці_місяців',\n            yy: 'рік_роки_років',\n        };\n        if (key === 'm') {\n            return withoutSuffix ? 'хвилина' : 'хвилину';\n        } else if (key === 'h') {\n            return withoutSuffix ? 'година' : 'годину';\n        } else {\n            return number + ' ' + plural(format[key], +number);\n        }\n    }\n    function weekdaysCaseReplace(m, format) {\n        var weekdays = {\n                nominative:\n                    'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split(\n                        '_'\n                    ),\n                accusative:\n                    'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split(\n                        '_'\n                    ),\n                genitive:\n                    'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split(\n                        '_'\n                    ),\n            },\n            nounCase;\n\n        if (m === true) {\n            return weekdays['nominative']\n                .slice(1, 7)\n                .concat(weekdays['nominative'].slice(0, 1));\n        }\n        if (!m) {\n            return weekdays['nominative'];\n        }\n\n        nounCase = /(\\[[ВвУу]\\]) ?dddd/.test(format)\n            ? 'accusative'\n            : /\\[?(?:минулої|наступної)? ?\\] ?dddd/.test(format)\n              ? 'genitive'\n              : 'nominative';\n        return weekdays[nounCase][m.day()];\n    }\n    function processHoursFunction(str) {\n        return function () {\n            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';\n        };\n    }\n\n    var uk = moment.defineLocale('uk', {\n        months: {\n            format: 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split(\n                '_'\n            ),\n            standalone:\n                'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split(\n                    '_'\n                ),\n        },\n        monthsShort: 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split(\n            '_'\n        ),\n        weekdays: weekdaysCaseReplace,\n        weekdaysShort: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n        weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY р.',\n            LLL: 'D MMMM YYYY р., HH:mm',\n            LLLL: 'dddd, D MMMM YYYY р., HH:mm',\n        },\n        calendar: {\n            sameDay: processHoursFunction('[Сьогодні '),\n            nextDay: processHoursFunction('[Завтра '),\n            lastDay: processHoursFunction('[Вчора '),\n            nextWeek: processHoursFunction('[У] dddd ['),\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                    case 3:\n                    case 5:\n                    case 6:\n                        return processHoursFunction('[Минулої] dddd [').call(this);\n                    case 1:\n                    case 2:\n                    case 4:\n                        return processHoursFunction('[Минулого] dddd [').call(this);\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'за %s',\n            past: '%s тому',\n            s: 'декілька секунд',\n            ss: relativeTimeWithPlural,\n            m: relativeTimeWithPlural,\n            mm: relativeTimeWithPlural,\n            h: 'годину',\n            hh: relativeTimeWithPlural,\n            d: 'день',\n            dd: relativeTimeWithPlural,\n            M: 'місяць',\n            MM: relativeTimeWithPlural,\n            y: 'рік',\n            yy: relativeTimeWithPlural,\n        },\n        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason\n        meridiemParse: /ночі|ранку|дня|вечора/,\n        isPM: function (input) {\n            return /^(дня|вечора)$/.test(input);\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 4) {\n                return 'ночі';\n            } else if (hour < 12) {\n                return 'ранку';\n            } else if (hour < 17) {\n                return 'дня';\n            } else {\n                return 'вечора';\n            }\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}-(й|го)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'M':\n                case 'd':\n                case 'DDD':\n                case 'w':\n                case 'W':\n                    return number + '-й';\n                case 'D':\n                    return number + '-го';\n                default:\n                    return number;\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return uk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Urdu [ur]\n//! author : Sawood Alam : https://github.com/ibnesayeed\n//! author : Zack : https://github.com/ZackVision\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = [\n            'جنوری',\n            'فروری',\n            'مارچ',\n            'اپریل',\n            'مئی',\n            'جون',\n            'جولائی',\n            'اگست',\n            'ستمبر',\n            'اکتوبر',\n            'نومبر',\n            'دسمبر',\n        ],\n        days = ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'];\n\n    var ur = moment.defineLocale('ur', {\n        months: months,\n        monthsShort: months,\n        weekdays: days,\n        weekdaysShort: days,\n        weekdaysMin: days,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd، D MMMM YYYY HH:mm',\n        },\n        meridiemParse: /صبح|شام/,\n        isPM: function (input) {\n            return 'شام' === input;\n        },\n        meridiem: function (hour, minute, isLower) {\n            if (hour < 12) {\n                return 'صبح';\n            }\n            return 'شام';\n        },\n        calendar: {\n            sameDay: '[آج بوقت] LT',\n            nextDay: '[کل بوقت] LT',\n            nextWeek: 'dddd [بوقت] LT',\n            lastDay: '[گذشتہ روز بوقت] LT',\n            lastWeek: '[گذشتہ] dddd [بوقت] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s بعد',\n            past: '%s قبل',\n            s: 'چند سیکنڈ',\n            ss: '%d سیکنڈ',\n            m: 'ایک منٹ',\n            mm: '%d منٹ',\n            h: 'ایک گھنٹہ',\n            hh: '%d گھنٹے',\n            d: 'ایک دن',\n            dd: '%d دن',\n            M: 'ایک ماہ',\n            MM: '%d ماہ',\n            y: 'ایک سال',\n            yy: '%d سال',\n        },\n        preparse: function (string) {\n            return string.replace(/،/g, ',');\n        },\n        postformat: function (string) {\n            return string.replace(/,/g, '،');\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return ur;\n\n})));\n","//! moment.js locale configuration\n//! locale : Uzbek Latin [uz-latn]\n//! author : Rasulbek Mirzayev : github.com/Rasulbeeek\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var uzLatn = moment.defineLocale('uz-latn', {\n        months: 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split(\n            '_'\n        ),\n        monthsShort: 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),\n        weekdays:\n            'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split(\n                '_'\n            ),\n        weekdaysShort: 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),\n        weekdaysMin: 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'D MMMM YYYY, dddd HH:mm',\n        },\n        calendar: {\n            sameDay: '[Bugun soat] LT [da]',\n            nextDay: '[Ertaga] LT [da]',\n            nextWeek: 'dddd [kuni soat] LT [da]',\n            lastDay: '[Kecha soat] LT [da]',\n            lastWeek: \"[O'tgan] dddd [kuni soat] LT [da]\",\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'Yaqin %s ichida',\n            past: 'Bir necha %s oldin',\n            s: 'soniya',\n            ss: '%d soniya',\n            m: 'bir daqiqa',\n            mm: '%d daqiqa',\n            h: 'bir soat',\n            hh: '%d soat',\n            d: 'bir kun',\n            dd: '%d kun',\n            M: 'bir oy',\n            MM: '%d oy',\n            y: 'bir yil',\n            yy: '%d yil',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return uzLatn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Uzbek [uz]\n//! author : Sardor Muminov : https://github.com/muminoff\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var uz = moment.defineLocale('uz', {\n        months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(\n            '_'\n        ),\n        monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n        weekdays: 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),\n        weekdaysShort: 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),\n        weekdaysMin: 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'D MMMM YYYY, dddd HH:mm',\n        },\n        calendar: {\n            sameDay: '[Бугун соат] LT [да]',\n            nextDay: '[Эртага] LT [да]',\n            nextWeek: 'dddd [куни соат] LT [да]',\n            lastDay: '[Кеча соат] LT [да]',\n            lastWeek: '[Утган] dddd [куни соат] LT [да]',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'Якин %s ичида',\n            past: 'Бир неча %s олдин',\n            s: 'фурсат',\n            ss: '%d фурсат',\n            m: 'бир дакика',\n            mm: '%d дакика',\n            h: 'бир соат',\n            hh: '%d соат',\n            d: 'бир кун',\n            dd: '%d кун',\n            M: 'бир ой',\n            MM: '%d ой',\n            y: 'бир йил',\n            yy: '%d йил',\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return uz;\n\n})));\n","//! moment.js locale configuration\n//! locale : Vietnamese [vi]\n//! author : Bang Nguyen : https://github.com/bangnk\n//! author : Chien Kira : https://github.com/chienkira\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var vi = moment.defineLocale('vi', {\n        months: 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split(\n            '_'\n        ),\n        monthsShort:\n            'Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays: 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split(\n            '_'\n        ),\n        weekdaysShort: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n        weekdaysMin: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n        weekdaysParseExact: true,\n        meridiemParse: /sa|ch/i,\n        isPM: function (input) {\n            return /^ch$/i.test(input);\n        },\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower ? 'sa' : 'SA';\n            } else {\n                return isLower ? 'ch' : 'CH';\n            }\n        },\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM [năm] YYYY',\n            LLL: 'D MMMM [năm] YYYY HH:mm',\n            LLLL: 'dddd, D MMMM [năm] YYYY HH:mm',\n            l: 'DD/M/YYYY',\n            ll: 'D MMM YYYY',\n            lll: 'D MMM YYYY HH:mm',\n            llll: 'ddd, D MMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Hôm nay lúc] LT',\n            nextDay: '[Ngày mai lúc] LT',\n            nextWeek: 'dddd [tuần tới lúc] LT',\n            lastDay: '[Hôm qua lúc] LT',\n            lastWeek: 'dddd [tuần trước lúc] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s tới',\n            past: '%s trước',\n            s: 'vài giây',\n            ss: '%d giây',\n            m: 'một phút',\n            mm: '%d phút',\n            h: 'một giờ',\n            hh: '%d giờ',\n            d: 'một ngày',\n            dd: '%d ngày',\n            w: 'một tuần',\n            ww: '%d tuần',\n            M: 'một tháng',\n            MM: '%d tháng',\n            y: 'một năm',\n            yy: '%d năm',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}/,\n        ordinal: function (number) {\n            return number;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return vi;\n\n})));\n","//! moment.js locale configuration\n//! locale : Pseudo [x-pseudo]\n//! author : Andrew Hood : https://github.com/andrewhood125\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var xPseudo = moment.defineLocale('x-pseudo', {\n        months: 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split(\n            '_'\n        ),\n        monthsShort:\n            'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split(\n                '_'\n            ),\n        monthsParseExact: true,\n        weekdays:\n            'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split(\n                '_'\n            ),\n        weekdaysShort: 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),\n        weekdaysMin: 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[T~ódá~ý át] LT',\n            nextDay: '[T~ómó~rró~w át] LT',\n            nextWeek: 'dddd [át] LT',\n            lastDay: '[Ý~ést~érdá~ý át] LT',\n            lastWeek: '[L~ást] dddd [át] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'í~ñ %s',\n            past: '%s á~gó',\n            s: 'á ~féw ~sécó~ñds',\n            ss: '%d s~écóñ~ds',\n            m: 'á ~míñ~úté',\n            mm: '%d m~íñú~tés',\n            h: 'á~ñ hó~úr',\n            hh: '%d h~óúrs',\n            d: 'á ~dáý',\n            dd: '%d d~áýs',\n            M: 'á ~móñ~th',\n            MM: '%d m~óñt~hs',\n            y: 'á ~ýéár',\n            yy: '%d ý~éárs',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return xPseudo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Yoruba Nigeria [yo]\n//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var yo = moment.defineLocale('yo', {\n        months: 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split(\n            '_'\n        ),\n        monthsShort: 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),\n        weekdays: 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),\n        weekdaysShort: 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),\n        weekdaysMin: 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),\n        longDateFormat: {\n            LT: 'h:mm A',\n            LTS: 'h:mm:ss A',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY h:mm A',\n            LLLL: 'dddd, D MMMM YYYY h:mm A',\n        },\n        calendar: {\n            sameDay: '[Ònì ni] LT',\n            nextDay: '[Ọ̀la ni] LT',\n            nextWeek: \"dddd [Ọsẹ̀ tón'bọ] [ni] LT\",\n            lastDay: '[Àna ni] LT',\n            lastWeek: 'dddd [Ọsẹ̀ tólọ́] [ni] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'ní %s',\n            past: '%s kọjá',\n            s: 'ìsẹjú aayá die',\n            ss: 'aayá %d',\n            m: 'ìsẹjú kan',\n            mm: 'ìsẹjú %d',\n            h: 'wákati kan',\n            hh: 'wákati %d',\n            d: 'ọjọ́ kan',\n            dd: 'ọjọ́ %d',\n            M: 'osù kan',\n            MM: 'osù %d',\n            y: 'ọdún kan',\n            yy: 'ọdún %d',\n        },\n        dayOfMonthOrdinalParse: /ọjọ́\\s\\d{1,2}/,\n        ordinal: 'ọjọ́ %d',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return yo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Chinese (China) [zh-cn]\n//! author : suupic : https://github.com/suupic\n//! author : Zeno Zeng : https://github.com/zenozeng\n//! author : uu109 : https://github.com/uu109\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var zhCn = moment.defineLocale('zh-cn', {\n        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n            '_'\n        ),\n        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n            '_'\n        ),\n        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n        weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),\n        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY/MM/DD',\n            LL: 'YYYY年M月D日',\n            LLL: 'YYYY年M月D日Ah点mm分',\n            LLLL: 'YYYY年M月D日ddddAh点mm分',\n            l: 'YYYY/M/D',\n            ll: 'YYYY年M月D日',\n            lll: 'YYYY年M月D日 HH:mm',\n            llll: 'YYYY年M月D日dddd HH:mm',\n        },\n        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n                return hour;\n            } else if (meridiem === '下午' || meridiem === '晚上') {\n                return hour + 12;\n            } else {\n                // '中午'\n                return hour >= 11 ? hour : hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            var hm = hour * 100 + minute;\n            if (hm < 600) {\n                return '凌晨';\n            } else if (hm < 900) {\n                return '早上';\n            } else if (hm < 1130) {\n                return '上午';\n            } else if (hm < 1230) {\n                return '中午';\n            } else if (hm < 1800) {\n                return '下午';\n            } else {\n                return '晚上';\n            }\n        },\n        calendar: {\n            sameDay: '[今天]LT',\n            nextDay: '[明天]LT',\n            nextWeek: function (now) {\n                if (now.week() !== this.week()) {\n                    return '[下]dddLT';\n                } else {\n                    return '[本]dddLT';\n                }\n            },\n            lastDay: '[昨天]LT',\n            lastWeek: function (now) {\n                if (this.week() !== now.week()) {\n                    return '[上]dddLT';\n                } else {\n                    return '[本]dddLT';\n                }\n            },\n            sameElse: 'L',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(日|月|周)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '日';\n                case 'M':\n                    return number + '月';\n                case 'w':\n                case 'W':\n                    return number + '周';\n                default:\n                    return number;\n            }\n        },\n        relativeTime: {\n            future: '%s后',\n            past: '%s前',\n            s: '几秒',\n            ss: '%d 秒',\n            m: '1 分钟',\n            mm: '%d 分钟',\n            h: '1 小时',\n            hh: '%d 小时',\n            d: '1 天',\n            dd: '%d 天',\n            w: '1 周',\n            ww: '%d 周',\n            M: '1 个月',\n            MM: '%d 个月',\n            y: '1 年',\n            yy: '%d 年',\n        },\n        week: {\n            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return zhCn;\n\n})));\n","//! moment.js locale configuration\n//! locale : Chinese (Hong Kong) [zh-hk]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n//! author : Konstantin : https://github.com/skfd\n//! author : Anthony : https://github.com/anthonylau\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var zhHk = moment.defineLocale('zh-hk', {\n        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n            '_'\n        ),\n        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n            '_'\n        ),\n        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY/MM/DD',\n            LL: 'YYYY年M月D日',\n            LLL: 'YYYY年M月D日 HH:mm',\n            LLLL: 'YYYY年M月D日dddd HH:mm',\n            l: 'YYYY/M/D',\n            ll: 'YYYY年M月D日',\n            lll: 'YYYY年M月D日 HH:mm',\n            llll: 'YYYY年M月D日dddd HH:mm',\n        },\n        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n                return hour;\n            } else if (meridiem === '中午') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === '下午' || meridiem === '晚上') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            var hm = hour * 100 + minute;\n            if (hm < 600) {\n                return '凌晨';\n            } else if (hm < 900) {\n                return '早上';\n            } else if (hm < 1200) {\n                return '上午';\n            } else if (hm === 1200) {\n                return '中午';\n            } else if (hm < 1800) {\n                return '下午';\n            } else {\n                return '晚上';\n            }\n        },\n        calendar: {\n            sameDay: '[今天]LT',\n            nextDay: '[明天]LT',\n            nextWeek: '[下]ddddLT',\n            lastDay: '[昨天]LT',\n            lastWeek: '[上]ddddLT',\n            sameElse: 'L',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '日';\n                case 'M':\n                    return number + '月';\n                case 'w':\n                case 'W':\n                    return number + '週';\n                default:\n                    return number;\n            }\n        },\n        relativeTime: {\n            future: '%s後',\n            past: '%s前',\n            s: '幾秒',\n            ss: '%d 秒',\n            m: '1 分鐘',\n            mm: '%d 分鐘',\n            h: '1 小時',\n            hh: '%d 小時',\n            d: '1 天',\n            dd: '%d 天',\n            M: '1 個月',\n            MM: '%d 個月',\n            y: '1 年',\n            yy: '%d 年',\n        },\n    });\n\n    return zhHk;\n\n})));\n","//! moment.js locale configuration\n//! locale : Chinese (Macau) [zh-mo]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n//! author : Tan Yuanhong : https://github.com/le0tan\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var zhMo = moment.defineLocale('zh-mo', {\n        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n            '_'\n        ),\n        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n            '_'\n        ),\n        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'YYYY年M月D日',\n            LLL: 'YYYY年M月D日 HH:mm',\n            LLLL: 'YYYY年M月D日dddd HH:mm',\n            l: 'D/M/YYYY',\n            ll: 'YYYY年M月D日',\n            lll: 'YYYY年M月D日 HH:mm',\n            llll: 'YYYY年M月D日dddd HH:mm',\n        },\n        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n                return hour;\n            } else if (meridiem === '中午') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === '下午' || meridiem === '晚上') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            var hm = hour * 100 + minute;\n            if (hm < 600) {\n                return '凌晨';\n            } else if (hm < 900) {\n                return '早上';\n            } else if (hm < 1130) {\n                return '上午';\n            } else if (hm < 1230) {\n                return '中午';\n            } else if (hm < 1800) {\n                return '下午';\n            } else {\n                return '晚上';\n            }\n        },\n        calendar: {\n            sameDay: '[今天] LT',\n            nextDay: '[明天] LT',\n            nextWeek: '[下]dddd LT',\n            lastDay: '[昨天] LT',\n            lastWeek: '[上]dddd LT',\n            sameElse: 'L',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '日';\n                case 'M':\n                    return number + '月';\n                case 'w':\n                case 'W':\n                    return number + '週';\n                default:\n                    return number;\n            }\n        },\n        relativeTime: {\n            future: '%s內',\n            past: '%s前',\n            s: '幾秒',\n            ss: '%d 秒',\n            m: '1 分鐘',\n            mm: '%d 分鐘',\n            h: '1 小時',\n            hh: '%d 小時',\n            d: '1 天',\n            dd: '%d 天',\n            M: '1 個月',\n            MM: '%d 個月',\n            y: '1 年',\n            yy: '%d 年',\n        },\n    });\n\n    return zhMo;\n\n})));\n","//! moment.js locale configuration\n//! locale : Chinese (Taiwan) [zh-tw]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var zhTw = moment.defineLocale('zh-tw', {\n        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n            '_'\n        ),\n        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n            '_'\n        ),\n        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'YYYY/MM/DD',\n            LL: 'YYYY年M月D日',\n            LLL: 'YYYY年M月D日 HH:mm',\n            LLLL: 'YYYY年M月D日dddd HH:mm',\n            l: 'YYYY/M/D',\n            ll: 'YYYY年M月D日',\n            lll: 'YYYY年M月D日 HH:mm',\n            llll: 'YYYY年M月D日dddd HH:mm',\n        },\n        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n        meridiemHour: function (hour, meridiem) {\n            if (hour === 12) {\n                hour = 0;\n            }\n            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n                return hour;\n            } else if (meridiem === '中午') {\n                return hour >= 11 ? hour : hour + 12;\n            } else if (meridiem === '下午' || meridiem === '晚上') {\n                return hour + 12;\n            }\n        },\n        meridiem: function (hour, minute, isLower) {\n            var hm = hour * 100 + minute;\n            if (hm < 600) {\n                return '凌晨';\n            } else if (hm < 900) {\n                return '早上';\n            } else if (hm < 1130) {\n                return '上午';\n            } else if (hm < 1230) {\n                return '中午';\n            } else if (hm < 1800) {\n                return '下午';\n            } else {\n                return '晚上';\n            }\n        },\n        calendar: {\n            sameDay: '[今天] LT',\n            nextDay: '[明天] LT',\n            nextWeek: '[下]dddd LT',\n            lastDay: '[昨天] LT',\n            lastWeek: '[上]dddd LT',\n            sameElse: 'L',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'DDD':\n                    return number + '日';\n                case 'M':\n                    return number + '月';\n                case 'w':\n                case 'W':\n                    return number + '週';\n                default:\n                    return number;\n            }\n        },\n        relativeTime: {\n            future: '%s後',\n            past: '%s前',\n            s: '幾秒',\n            ss: '%d 秒',\n            m: '1 分鐘',\n            mm: '%d 分鐘',\n            h: '1 小時',\n            hh: '%d 小時',\n            d: '1 天',\n            dd: '%d 天',\n            M: '1 個月',\n            MM: '%d 個月',\n            y: '1 年',\n            yy: '%d 年',\n        },\n    });\n\n    return zhTw;\n\n})));\n","//! moment.js\n//! version : 2.30.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\n    var hookCallback;\n\n    function hooks() {\n        return hookCallback.apply(null, arguments);\n    }\n\n    // This is done to register the method called with moment()\n    // without creating circular dependencies.\n    function setHookCallback(callback) {\n        hookCallback = callback;\n    }\n\n    function isArray(input) {\n        return (\n            input instanceof Array ||\n            Object.prototype.toString.call(input) === '[object Array]'\n        );\n    }\n\n    function isObject(input) {\n        // IE8 will treat undefined and null as object if it wasn't for\n        // input != null\n        return (\n            input != null &&\n            Object.prototype.toString.call(input) === '[object Object]'\n        );\n    }\n\n    function hasOwnProp(a, b) {\n        return Object.prototype.hasOwnProperty.call(a, b);\n    }\n\n    function isObjectEmpty(obj) {\n        if (Object.getOwnPropertyNames) {\n            return Object.getOwnPropertyNames(obj).length === 0;\n        } else {\n            var k;\n            for (k in obj) {\n                if (hasOwnProp(obj, k)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n\n    function isUndefined(input) {\n        return input === void 0;\n    }\n\n    function isNumber(input) {\n        return (\n            typeof input === 'number' ||\n            Object.prototype.toString.call(input) === '[object Number]'\n        );\n    }\n\n    function isDate(input) {\n        return (\n            input instanceof Date ||\n            Object.prototype.toString.call(input) === '[object Date]'\n        );\n    }\n\n    function map(arr, fn) {\n        var res = [],\n            i,\n            arrLen = arr.length;\n        for (i = 0; i < arrLen; ++i) {\n            res.push(fn(arr[i], i));\n        }\n        return res;\n    }\n\n    function extend(a, b) {\n        for (var i in b) {\n            if (hasOwnProp(b, i)) {\n                a[i] = b[i];\n            }\n        }\n\n        if (hasOwnProp(b, 'toString')) {\n            a.toString = b.toString;\n        }\n\n        if (hasOwnProp(b, 'valueOf')) {\n            a.valueOf = b.valueOf;\n        }\n\n        return a;\n    }\n\n    function createUTC(input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, true).utc();\n    }\n\n    function defaultParsingFlags() {\n        // We need to deep clone this object.\n        return {\n            empty: false,\n            unusedTokens: [],\n            unusedInput: [],\n            overflow: -2,\n            charsLeftOver: 0,\n            nullInput: false,\n            invalidEra: null,\n            invalidMonth: null,\n            invalidFormat: false,\n            userInvalidated: false,\n            iso: false,\n            parsedDateParts: [],\n            era: null,\n            meridiem: null,\n            rfc2822: false,\n            weekdayMismatch: false,\n        };\n    }\n\n    function getParsingFlags(m) {\n        if (m._pf == null) {\n            m._pf = defaultParsingFlags();\n        }\n        return m._pf;\n    }\n\n    var some;\n    if (Array.prototype.some) {\n        some = Array.prototype.some;\n    } else {\n        some = function (fun) {\n            var t = Object(this),\n                len = t.length >>> 0,\n                i;\n\n            for (i = 0; i < len; i++) {\n                if (i in t && fun.call(this, t[i], i, t)) {\n                    return true;\n                }\n            }\n\n            return false;\n        };\n    }\n\n    function isValid(m) {\n        var flags = null,\n            parsedParts = false,\n            isNowValid = m._d && !isNaN(m._d.getTime());\n        if (isNowValid) {\n            flags = getParsingFlags(m);\n            parsedParts = some.call(flags.parsedDateParts, function (i) {\n                return i != null;\n            });\n            isNowValid =\n                flags.overflow < 0 &&\n                !flags.empty &&\n                !flags.invalidEra &&\n                !flags.invalidMonth &&\n                !flags.invalidWeekday &&\n                !flags.weekdayMismatch &&\n                !flags.nullInput &&\n                !flags.invalidFormat &&\n                !flags.userInvalidated &&\n                (!flags.meridiem || (flags.meridiem && parsedParts));\n            if (m._strict) {\n                isNowValid =\n                    isNowValid &&\n                    flags.charsLeftOver === 0 &&\n                    flags.unusedTokens.length === 0 &&\n                    flags.bigHour === undefined;\n            }\n        }\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        } else {\n            return isNowValid;\n        }\n        return m._isValid;\n    }\n\n    function createInvalid(flags) {\n        var m = createUTC(NaN);\n        if (flags != null) {\n            extend(getParsingFlags(m), flags);\n        } else {\n            getParsingFlags(m).userInvalidated = true;\n        }\n\n        return m;\n    }\n\n    // Plugins that add properties should also add the key here (null value),\n    // so we can properly clone ourselves.\n    var momentProperties = (hooks.momentProperties = []),\n        updateInProgress = false;\n\n    function copyConfig(to, from) {\n        var i,\n            prop,\n            val,\n            momentPropertiesLen = momentProperties.length;\n\n        if (!isUndefined(from._isAMomentObject)) {\n            to._isAMomentObject = from._isAMomentObject;\n        }\n        if (!isUndefined(from._i)) {\n            to._i = from._i;\n        }\n        if (!isUndefined(from._f)) {\n            to._f = from._f;\n        }\n        if (!isUndefined(from._l)) {\n            to._l = from._l;\n        }\n        if (!isUndefined(from._strict)) {\n            to._strict = from._strict;\n        }\n        if (!isUndefined(from._tzm)) {\n            to._tzm = from._tzm;\n        }\n        if (!isUndefined(from._isUTC)) {\n            to._isUTC = from._isUTC;\n        }\n        if (!isUndefined(from._offset)) {\n            to._offset = from._offset;\n        }\n        if (!isUndefined(from._pf)) {\n            to._pf = getParsingFlags(from);\n        }\n        if (!isUndefined(from._locale)) {\n            to._locale = from._locale;\n        }\n\n        if (momentPropertiesLen > 0) {\n            for (i = 0; i < momentPropertiesLen; i++) {\n                prop = momentProperties[i];\n                val = from[prop];\n                if (!isUndefined(val)) {\n                    to[prop] = val;\n                }\n            }\n        }\n\n        return to;\n    }\n\n    // Moment prototype object\n    function Moment(config) {\n        copyConfig(this, config);\n        this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n        if (!this.isValid()) {\n            this._d = new Date(NaN);\n        }\n        // Prevent infinite loop in case updateOffset creates new moment\n        // objects.\n        if (updateInProgress === false) {\n            updateInProgress = true;\n            hooks.updateOffset(this);\n            updateInProgress = false;\n        }\n    }\n\n    function isMoment(obj) {\n        return (\n            obj instanceof Moment || (obj != null && obj._isAMomentObject != null)\n        );\n    }\n\n    function warn(msg) {\n        if (\n            hooks.suppressDeprecationWarnings === false &&\n            typeof console !== 'undefined' &&\n            console.warn\n        ) {\n            console.warn('Deprecation warning: ' + msg);\n        }\n    }\n\n    function deprecate(msg, fn) {\n        var firstTime = true;\n\n        return extend(function () {\n            if (hooks.deprecationHandler != null) {\n                hooks.deprecationHandler(null, msg);\n            }\n            if (firstTime) {\n                var args = [],\n                    arg,\n                    i,\n                    key,\n                    argLen = arguments.length;\n                for (i = 0; i < argLen; i++) {\n                    arg = '';\n                    if (typeof arguments[i] === 'object') {\n                        arg += '\\n[' + i + '] ';\n                        for (key in arguments[0]) {\n                            if (hasOwnProp(arguments[0], key)) {\n                                arg += key + ': ' + arguments[0][key] + ', ';\n                            }\n                        }\n                        arg = arg.slice(0, -2); // Remove trailing comma and space\n                    } else {\n                        arg = arguments[i];\n                    }\n                    args.push(arg);\n                }\n                warn(\n                    msg +\n                        '\\nArguments: ' +\n                        Array.prototype.slice.call(args).join('') +\n                        '\\n' +\n                        new Error().stack\n                );\n                firstTime = false;\n            }\n            return fn.apply(this, arguments);\n        }, fn);\n    }\n\n    var deprecations = {};\n\n    function deprecateSimple(name, msg) {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(name, msg);\n        }\n        if (!deprecations[name]) {\n            warn(msg);\n            deprecations[name] = true;\n        }\n    }\n\n    hooks.suppressDeprecationWarnings = false;\n    hooks.deprecationHandler = null;\n\n    function isFunction(input) {\n        return (\n            (typeof Function !== 'undefined' && input instanceof Function) ||\n            Object.prototype.toString.call(input) === '[object Function]'\n        );\n    }\n\n    function set(config) {\n        var prop, i;\n        for (i in config) {\n            if (hasOwnProp(config, i)) {\n                prop = config[i];\n                if (isFunction(prop)) {\n                    this[i] = prop;\n                } else {\n                    this['_' + i] = prop;\n                }\n            }\n        }\n        this._config = config;\n        // Lenient ordinal parsing accepts just a number in addition to\n        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        this._dayOfMonthOrdinalParseLenient = new RegExp(\n            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n                '|' +\n                /\\d{1,2}/.source\n        );\n    }\n\n    function mergeConfigs(parentConfig, childConfig) {\n        var res = extend({}, parentConfig),\n            prop;\n        for (prop in childConfig) {\n            if (hasOwnProp(childConfig, prop)) {\n                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                    res[prop] = {};\n                    extend(res[prop], parentConfig[prop]);\n                    extend(res[prop], childConfig[prop]);\n                } else if (childConfig[prop] != null) {\n                    res[prop] = childConfig[prop];\n                } else {\n                    delete res[prop];\n                }\n            }\n        }\n        for (prop in parentConfig) {\n            if (\n                hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])\n            ) {\n                // make sure changes to properties don't modify parent config\n                res[prop] = extend({}, res[prop]);\n            }\n        }\n        return res;\n    }\n\n    function Locale(config) {\n        if (config != null) {\n            this.set(config);\n        }\n    }\n\n    var keys;\n\n    if (Object.keys) {\n        keys = Object.keys;\n    } else {\n        keys = function (obj) {\n            var i,\n                res = [];\n            for (i in obj) {\n                if (hasOwnProp(obj, i)) {\n                    res.push(i);\n                }\n            }\n            return res;\n        };\n    }\n\n    var defaultCalendar = {\n        sameDay: '[Today at] LT',\n        nextDay: '[Tomorrow at] LT',\n        nextWeek: 'dddd [at] LT',\n        lastDay: '[Yesterday at] LT',\n        lastWeek: '[Last] dddd [at] LT',\n        sameElse: 'L',\n    };\n\n    function calendar(key, mom, now) {\n        var output = this._calendar[key] || this._calendar['sameElse'];\n        return isFunction(output) ? output.call(mom, now) : output;\n    }\n\n    function zeroFill(number, targetLength, forceSign) {\n        var absNumber = '' + Math.abs(number),\n            zerosToFill = targetLength - absNumber.length,\n            sign = number >= 0;\n        return (\n            (sign ? (forceSign ? '+' : '') : '-') +\n            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +\n            absNumber\n        );\n    }\n\n    var formattingTokens =\n            /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,\n        localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,\n        formatFunctions = {},\n        formatTokenFunctions = {};\n\n    // token:    'M'\n    // padded:   ['MM', 2]\n    // ordinal:  'Mo'\n    // callback: function () { this.month() + 1 }\n    function addFormatToken(token, padded, ordinal, callback) {\n        var func = callback;\n        if (typeof callback === 'string') {\n            func = function () {\n                return this[callback]();\n            };\n        }\n        if (token) {\n            formatTokenFunctions[token] = func;\n        }\n        if (padded) {\n            formatTokenFunctions[padded[0]] = function () {\n                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n            };\n        }\n        if (ordinal) {\n            formatTokenFunctions[ordinal] = function () {\n                return this.localeData().ordinal(\n                    func.apply(this, arguments),\n                    token\n                );\n            };\n        }\n    }\n\n    function removeFormattingTokens(input) {\n        if (input.match(/\\[[\\s\\S]/)) {\n            return input.replace(/^\\[|\\]$/g, '');\n        }\n        return input.replace(/\\\\/g, '');\n    }\n\n    function makeFormatFunction(format) {\n        var array = format.match(formattingTokens),\n            i,\n            length;\n\n        for (i = 0, length = array.length; i < length; i++) {\n            if (formatTokenFunctions[array[i]]) {\n                array[i] = formatTokenFunctions[array[i]];\n            } else {\n                array[i] = removeFormattingTokens(array[i]);\n            }\n        }\n\n        return function (mom) {\n            var output = '',\n                i;\n            for (i = 0; i < length; i++) {\n                output += isFunction(array[i])\n                    ? array[i].call(mom, format)\n                    : array[i];\n            }\n            return output;\n        };\n    }\n\n    // format date using native date object\n    function formatMoment(m, format) {\n        if (!m.isValid()) {\n            return m.localeData().invalidDate();\n        }\n\n        format = expandFormat(format, m.localeData());\n        formatFunctions[format] =\n            formatFunctions[format] || makeFormatFunction(format);\n\n        return formatFunctions[format](m);\n    }\n\n    function expandFormat(format, locale) {\n        var i = 5;\n\n        function replaceLongDateFormatTokens(input) {\n            return locale.longDateFormat(input) || input;\n        }\n\n        localFormattingTokens.lastIndex = 0;\n        while (i >= 0 && localFormattingTokens.test(format)) {\n            format = format.replace(\n                localFormattingTokens,\n                replaceLongDateFormatTokens\n            );\n            localFormattingTokens.lastIndex = 0;\n            i -= 1;\n        }\n\n        return format;\n    }\n\n    var defaultLongDateFormat = {\n        LTS: 'h:mm:ss A',\n        LT: 'h:mm A',\n        L: 'MM/DD/YYYY',\n        LL: 'MMMM D, YYYY',\n        LLL: 'MMMM D, YYYY h:mm A',\n        LLLL: 'dddd, MMMM D, YYYY h:mm A',\n    };\n\n    function longDateFormat(key) {\n        var format = this._longDateFormat[key],\n            formatUpper = this._longDateFormat[key.toUpperCase()];\n\n        if (format || !formatUpper) {\n            return format;\n        }\n\n        this._longDateFormat[key] = formatUpper\n            .match(formattingTokens)\n            .map(function (tok) {\n                if (\n                    tok === 'MMMM' ||\n                    tok === 'MM' ||\n                    tok === 'DD' ||\n                    tok === 'dddd'\n                ) {\n                    return tok.slice(1);\n                }\n                return tok;\n            })\n            .join('');\n\n        return this._longDateFormat[key];\n    }\n\n    var defaultInvalidDate = 'Invalid date';\n\n    function invalidDate() {\n        return this._invalidDate;\n    }\n\n    var defaultOrdinal = '%d',\n        defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n    function ordinal(number) {\n        return this._ordinal.replace('%d', number);\n    }\n\n    var defaultRelativeTime = {\n        future: 'in %s',\n        past: '%s ago',\n        s: 'a few seconds',\n        ss: '%d seconds',\n        m: 'a minute',\n        mm: '%d minutes',\n        h: 'an hour',\n        hh: '%d hours',\n        d: 'a day',\n        dd: '%d days',\n        w: 'a week',\n        ww: '%d weeks',\n        M: 'a month',\n        MM: '%d months',\n        y: 'a year',\n        yy: '%d years',\n    };\n\n    function relativeTime(number, withoutSuffix, string, isFuture) {\n        var output = this._relativeTime[string];\n        return isFunction(output)\n            ? output(number, withoutSuffix, string, isFuture)\n            : output.replace(/%d/i, number);\n    }\n\n    function pastFuture(diff, output) {\n        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n        return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n    }\n\n    var aliases = {\n        D: 'date',\n        dates: 'date',\n        date: 'date',\n        d: 'day',\n        days: 'day',\n        day: 'day',\n        e: 'weekday',\n        weekdays: 'weekday',\n        weekday: 'weekday',\n        E: 'isoWeekday',\n        isoweekdays: 'isoWeekday',\n        isoweekday: 'isoWeekday',\n        DDD: 'dayOfYear',\n        dayofyears: 'dayOfYear',\n        dayofyear: 'dayOfYear',\n        h: 'hour',\n        hours: 'hour',\n        hour: 'hour',\n        ms: 'millisecond',\n        milliseconds: 'millisecond',\n        millisecond: 'millisecond',\n        m: 'minute',\n        minutes: 'minute',\n        minute: 'minute',\n        M: 'month',\n        months: 'month',\n        month: 'month',\n        Q: 'quarter',\n        quarters: 'quarter',\n        quarter: 'quarter',\n        s: 'second',\n        seconds: 'second',\n        second: 'second',\n        gg: 'weekYear',\n        weekyears: 'weekYear',\n        weekyear: 'weekYear',\n        GG: 'isoWeekYear',\n        isoweekyears: 'isoWeekYear',\n        isoweekyear: 'isoWeekYear',\n        w: 'week',\n        weeks: 'week',\n        week: 'week',\n        W: 'isoWeek',\n        isoweeks: 'isoWeek',\n        isoweek: 'isoWeek',\n        y: 'year',\n        years: 'year',\n        year: 'year',\n    };\n\n    function normalizeUnits(units) {\n        return typeof units === 'string'\n            ? aliases[units] || aliases[units.toLowerCase()]\n            : undefined;\n    }\n\n    function normalizeObjectUnits(inputObject) {\n        var normalizedInput = {},\n            normalizedProp,\n            prop;\n\n        for (prop in inputObject) {\n            if (hasOwnProp(inputObject, prop)) {\n                normalizedProp = normalizeUnits(prop);\n                if (normalizedProp) {\n                    normalizedInput[normalizedProp] = inputObject[prop];\n                }\n            }\n        }\n\n        return normalizedInput;\n    }\n\n    var priorities = {\n        date: 9,\n        day: 11,\n        weekday: 11,\n        isoWeekday: 11,\n        dayOfYear: 4,\n        hour: 13,\n        millisecond: 16,\n        minute: 14,\n        month: 8,\n        quarter: 7,\n        second: 15,\n        weekYear: 1,\n        isoWeekYear: 1,\n        week: 5,\n        isoWeek: 5,\n        year: 1,\n    };\n\n    function getPrioritizedUnits(unitsObj) {\n        var units = [],\n            u;\n        for (u in unitsObj) {\n            if (hasOwnProp(unitsObj, u)) {\n                units.push({ unit: u, priority: priorities[u] });\n            }\n        }\n        units.sort(function (a, b) {\n            return a.priority - b.priority;\n        });\n        return units;\n    }\n\n    var match1 = /\\d/, //       0 - 9\n        match2 = /\\d\\d/, //      00 - 99\n        match3 = /\\d{3}/, //     000 - 999\n        match4 = /\\d{4}/, //    0000 - 9999\n        match6 = /[+-]?\\d{6}/, // -999999 - 999999\n        match1to2 = /\\d\\d?/, //       0 - 99\n        match3to4 = /\\d\\d\\d\\d?/, //     999 - 9999\n        match5to6 = /\\d\\d\\d\\d\\d\\d?/, //   99999 - 999999\n        match1to3 = /\\d{1,3}/, //       0 - 999\n        match1to4 = /\\d{1,4}/, //       0 - 9999\n        match1to6 = /[+-]?\\d{1,6}/, // -999999 - 999999\n        matchUnsigned = /\\d+/, //       0 - inf\n        matchSigned = /[+-]?\\d+/, //    -inf - inf\n        matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi, // +00:00 -00:00 +0000 -0000 or Z\n        matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n        matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/, // 123456789 123456789.123\n        // any word (or two) characters or numbers including two/three word month in arabic.\n        // includes scottish gaelic two word and hyphenated months\n        matchWord =\n            /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,\n        match1to2NoLeadingZero = /^[1-9]\\d?/, //         1-99\n        match1to2HasZero = /^([1-9]\\d|\\d)/, //           0-99\n        regexes;\n\n    regexes = {};\n\n    function addRegexToken(token, regex, strictRegex) {\n        regexes[token] = isFunction(regex)\n            ? regex\n            : function (isStrict, localeData) {\n                  return isStrict && strictRegex ? strictRegex : regex;\n              };\n    }\n\n    function getParseRegexForToken(token, config) {\n        if (!hasOwnProp(regexes, token)) {\n            return new RegExp(unescapeFormat(token));\n        }\n\n        return regexes[token](config._strict, config._locale);\n    }\n\n    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n    function unescapeFormat(s) {\n        return regexEscape(\n            s\n                .replace('\\\\', '')\n                .replace(\n                    /\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,\n                    function (matched, p1, p2, p3, p4) {\n                        return p1 || p2 || p3 || p4;\n                    }\n                )\n        );\n    }\n\n    function regexEscape(s) {\n        return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n\n    function absFloor(number) {\n        if (number < 0) {\n            // -0 -> 0\n            return Math.ceil(number) || 0;\n        } else {\n            return Math.floor(number);\n        }\n    }\n\n    function toInt(argumentForCoercion) {\n        var coercedNumber = +argumentForCoercion,\n            value = 0;\n\n        if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n            value = absFloor(coercedNumber);\n        }\n\n        return value;\n    }\n\n    var tokens = {};\n\n    function addParseToken(token, callback) {\n        var i,\n            func = callback,\n            tokenLen;\n        if (typeof token === 'string') {\n            token = [token];\n        }\n        if (isNumber(callback)) {\n            func = function (input, array) {\n                array[callback] = toInt(input);\n            };\n        }\n        tokenLen = token.length;\n        for (i = 0; i < tokenLen; i++) {\n            tokens[token[i]] = func;\n        }\n    }\n\n    function addWeekParseToken(token, callback) {\n        addParseToken(token, function (input, array, config, token) {\n            config._w = config._w || {};\n            callback(input, config._w, config, token);\n        });\n    }\n\n    function addTimeToArrayFromToken(token, input, config) {\n        if (input != null && hasOwnProp(tokens, token)) {\n            tokens[token](input, config._a, config, token);\n        }\n    }\n\n    function isLeapYear(year) {\n        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n    }\n\n    var YEAR = 0,\n        MONTH = 1,\n        DATE = 2,\n        HOUR = 3,\n        MINUTE = 4,\n        SECOND = 5,\n        MILLISECOND = 6,\n        WEEK = 7,\n        WEEKDAY = 8;\n\n    // FORMATTING\n\n    addFormatToken('Y', 0, 0, function () {\n        var y = this.year();\n        return y <= 9999 ? zeroFill(y, 4) : '+' + y;\n    });\n\n    addFormatToken(0, ['YY', 2], 0, function () {\n        return this.year() % 100;\n    });\n\n    addFormatToken(0, ['YYYY', 4], 0, 'year');\n    addFormatToken(0, ['YYYYY', 5], 0, 'year');\n    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n    // PARSING\n\n    addRegexToken('Y', matchSigned);\n    addRegexToken('YY', match1to2, match2);\n    addRegexToken('YYYY', match1to4, match4);\n    addRegexToken('YYYYY', match1to6, match6);\n    addRegexToken('YYYYYY', match1to6, match6);\n\n    addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n    addParseToken('YYYY', function (input, array) {\n        array[YEAR] =\n            input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n    });\n    addParseToken('YY', function (input, array) {\n        array[YEAR] = hooks.parseTwoDigitYear(input);\n    });\n    addParseToken('Y', function (input, array) {\n        array[YEAR] = parseInt(input, 10);\n    });\n\n    // HELPERS\n\n    function daysInYear(year) {\n        return isLeapYear(year) ? 366 : 365;\n    }\n\n    // HOOKS\n\n    hooks.parseTwoDigitYear = function (input) {\n        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n    };\n\n    // MOMENTS\n\n    var getSetYear = makeGetSet('FullYear', true);\n\n    function getIsLeapYear() {\n        return isLeapYear(this.year());\n    }\n\n    function makeGetSet(unit, keepTime) {\n        return function (value) {\n            if (value != null) {\n                set$1(this, unit, value);\n                hooks.updateOffset(this, keepTime);\n                return this;\n            } else {\n                return get(this, unit);\n            }\n        };\n    }\n\n    function get(mom, unit) {\n        if (!mom.isValid()) {\n            return NaN;\n        }\n\n        var d = mom._d,\n            isUTC = mom._isUTC;\n\n        switch (unit) {\n            case 'Milliseconds':\n                return isUTC ? d.getUTCMilliseconds() : d.getMilliseconds();\n            case 'Seconds':\n                return isUTC ? d.getUTCSeconds() : d.getSeconds();\n            case 'Minutes':\n                return isUTC ? d.getUTCMinutes() : d.getMinutes();\n            case 'Hours':\n                return isUTC ? d.getUTCHours() : d.getHours();\n            case 'Date':\n                return isUTC ? d.getUTCDate() : d.getDate();\n            case 'Day':\n                return isUTC ? d.getUTCDay() : d.getDay();\n            case 'Month':\n                return isUTC ? d.getUTCMonth() : d.getMonth();\n            case 'FullYear':\n                return isUTC ? d.getUTCFullYear() : d.getFullYear();\n            default:\n                return NaN; // Just in case\n        }\n    }\n\n    function set$1(mom, unit, value) {\n        var d, isUTC, year, month, date;\n\n        if (!mom.isValid() || isNaN(value)) {\n            return;\n        }\n\n        d = mom._d;\n        isUTC = mom._isUTC;\n\n        switch (unit) {\n            case 'Milliseconds':\n                return void (isUTC\n                    ? d.setUTCMilliseconds(value)\n                    : d.setMilliseconds(value));\n            case 'Seconds':\n                return void (isUTC ? d.setUTCSeconds(value) : d.setSeconds(value));\n            case 'Minutes':\n                return void (isUTC ? d.setUTCMinutes(value) : d.setMinutes(value));\n            case 'Hours':\n                return void (isUTC ? d.setUTCHours(value) : d.setHours(value));\n            case 'Date':\n                return void (isUTC ? d.setUTCDate(value) : d.setDate(value));\n            // case 'Day': // Not real\n            //    return void (isUTC ? d.setUTCDay(value) : d.setDay(value));\n            // case 'Month': // Not used because we need to pass two variables\n            //     return void (isUTC ? d.setUTCMonth(value) : d.setMonth(value));\n            case 'FullYear':\n                break; // See below ...\n            default:\n                return; // Just in case\n        }\n\n        year = value;\n        month = mom.month();\n        date = mom.date();\n        date = date === 29 && month === 1 && !isLeapYear(year) ? 28 : date;\n        void (isUTC\n            ? d.setUTCFullYear(year, month, date)\n            : d.setFullYear(year, month, date));\n    }\n\n    // MOMENTS\n\n    function stringGet(units) {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units]();\n        }\n        return this;\n    }\n\n    function stringSet(units, value) {\n        if (typeof units === 'object') {\n            units = normalizeObjectUnits(units);\n            var prioritized = getPrioritizedUnits(units),\n                i,\n                prioritizedLen = prioritized.length;\n            for (i = 0; i < prioritizedLen; i++) {\n                this[prioritized[i].unit](units[prioritized[i].unit]);\n            }\n        } else {\n            units = normalizeUnits(units);\n            if (isFunction(this[units])) {\n                return this[units](value);\n            }\n        }\n        return this;\n    }\n\n    function mod(n, x) {\n        return ((n % x) + x) % x;\n    }\n\n    var indexOf;\n\n    if (Array.prototype.indexOf) {\n        indexOf = Array.prototype.indexOf;\n    } else {\n        indexOf = function (o) {\n            // I know\n            var i;\n            for (i = 0; i < this.length; ++i) {\n                if (this[i] === o) {\n                    return i;\n                }\n            }\n            return -1;\n        };\n    }\n\n    function daysInMonth(year, month) {\n        if (isNaN(year) || isNaN(month)) {\n            return NaN;\n        }\n        var modMonth = mod(month, 12);\n        year += (month - modMonth) / 12;\n        return modMonth === 1\n            ? isLeapYear(year)\n                ? 29\n                : 28\n            : 31 - ((modMonth % 7) % 2);\n    }\n\n    // FORMATTING\n\n    addFormatToken('M', ['MM', 2], 'Mo', function () {\n        return this.month() + 1;\n    });\n\n    addFormatToken('MMM', 0, 0, function (format) {\n        return this.localeData().monthsShort(this, format);\n    });\n\n    addFormatToken('MMMM', 0, 0, function (format) {\n        return this.localeData().months(this, format);\n    });\n\n    // PARSING\n\n    addRegexToken('M', match1to2, match1to2NoLeadingZero);\n    addRegexToken('MM', match1to2, match2);\n    addRegexToken('MMM', function (isStrict, locale) {\n        return locale.monthsShortRegex(isStrict);\n    });\n    addRegexToken('MMMM', function (isStrict, locale) {\n        return locale.monthsRegex(isStrict);\n    });\n\n    addParseToken(['M', 'MM'], function (input, array) {\n        array[MONTH] = toInt(input) - 1;\n    });\n\n    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n        var month = config._locale.monthsParse(input, token, config._strict);\n        // if we didn't find a month name, mark the date as invalid.\n        if (month != null) {\n            array[MONTH] = month;\n        } else {\n            getParsingFlags(config).invalidMonth = input;\n        }\n    });\n\n    // LOCALES\n\n    var defaultLocaleMonths =\n            'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n                '_'\n            ),\n        defaultLocaleMonthsShort =\n            'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,\n        defaultMonthsShortRegex = matchWord,\n        defaultMonthsRegex = matchWord;\n\n    function localeMonths(m, format) {\n        if (!m) {\n            return isArray(this._months)\n                ? this._months\n                : this._months['standalone'];\n        }\n        return isArray(this._months)\n            ? this._months[m.month()]\n            : this._months[\n                  (this._months.isFormat || MONTHS_IN_FORMAT).test(format)\n                      ? 'format'\n                      : 'standalone'\n              ][m.month()];\n    }\n\n    function localeMonthsShort(m, format) {\n        if (!m) {\n            return isArray(this._monthsShort)\n                ? this._monthsShort\n                : this._monthsShort['standalone'];\n        }\n        return isArray(this._monthsShort)\n            ? this._monthsShort[m.month()]\n            : this._monthsShort[\n                  MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'\n              ][m.month()];\n    }\n\n    function handleStrictParse(monthName, format, strict) {\n        var i,\n            ii,\n            mom,\n            llc = monthName.toLocaleLowerCase();\n        if (!this._monthsParse) {\n            // this is not used\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n            for (i = 0; i < 12; ++i) {\n                mom = createUTC([2000, i]);\n                this._shortMonthsParse[i] = this.monthsShort(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeMonthsParse(monthName, format, strict) {\n        var i, mom, regex;\n\n        if (this._monthsParseExact) {\n            return handleStrictParse.call(this, monthName, format, strict);\n        }\n\n        if (!this._monthsParse) {\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n        }\n\n        // TODO: add sorting\n        // Sorting makes sure if one month (or abbr) is a prefix of another\n        // see sorting in computeMonthsParse\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            if (strict && !this._longMonthsParse[i]) {\n                this._longMonthsParse[i] = new RegExp(\n                    '^' + this.months(mom, '').replace('.', '') + '$',\n                    'i'\n                );\n                this._shortMonthsParse[i] = new RegExp(\n                    '^' + this.monthsShort(mom, '').replace('.', '') + '$',\n                    'i'\n                );\n            }\n            if (!strict && !this._monthsParse[i]) {\n                regex =\n                    '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (\n                strict &&\n                format === 'MMMM' &&\n                this._longMonthsParse[i].test(monthName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'MMM' &&\n                this._shortMonthsParse[i].test(monthName)\n            ) {\n                return i;\n            } else if (!strict && this._monthsParse[i].test(monthName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function setMonth(mom, value) {\n        if (!mom.isValid()) {\n            // No op\n            return mom;\n        }\n\n        if (typeof value === 'string') {\n            if (/^\\d+$/.test(value)) {\n                value = toInt(value);\n            } else {\n                value = mom.localeData().monthsParse(value);\n                // TODO: Another silent failure?\n                if (!isNumber(value)) {\n                    return mom;\n                }\n            }\n        }\n\n        var month = value,\n            date = mom.date();\n\n        date = date < 29 ? date : Math.min(date, daysInMonth(mom.year(), month));\n        void (mom._isUTC\n            ? mom._d.setUTCMonth(month, date)\n            : mom._d.setMonth(month, date));\n        return mom;\n    }\n\n    function getSetMonth(value) {\n        if (value != null) {\n            setMonth(this, value);\n            hooks.updateOffset(this, true);\n            return this;\n        } else {\n            return get(this, 'Month');\n        }\n    }\n\n    function getDaysInMonth() {\n        return daysInMonth(this.year(), this.month());\n    }\n\n    function monthsShortRegex(isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsShortStrictRegex;\n            } else {\n                return this._monthsShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsShortRegex')) {\n                this._monthsShortRegex = defaultMonthsShortRegex;\n            }\n            return this._monthsShortStrictRegex && isStrict\n                ? this._monthsShortStrictRegex\n                : this._monthsShortRegex;\n        }\n    }\n\n    function monthsRegex(isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsStrictRegex;\n            } else {\n                return this._monthsRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                this._monthsRegex = defaultMonthsRegex;\n            }\n            return this._monthsStrictRegex && isStrict\n                ? this._monthsStrictRegex\n                : this._monthsRegex;\n        }\n    }\n\n    function computeMonthsParse() {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var shortPieces = [],\n            longPieces = [],\n            mixedPieces = [],\n            i,\n            mom,\n            shortP,\n            longP;\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            shortP = regexEscape(this.monthsShort(mom, ''));\n            longP = regexEscape(this.months(mom, ''));\n            shortPieces.push(shortP);\n            longPieces.push(longP);\n            mixedPieces.push(longP);\n            mixedPieces.push(shortP);\n        }\n        // Sorting makes sure if one month (or abbr) is a prefix of another it\n        // will match the longer piece.\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n\n        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._monthsShortRegex = this._monthsRegex;\n        this._monthsStrictRegex = new RegExp(\n            '^(' + longPieces.join('|') + ')',\n            'i'\n        );\n        this._monthsShortStrictRegex = new RegExp(\n            '^(' + shortPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    function createDate(y, m, d, h, M, s, ms) {\n        // can't just apply() to create a date:\n        // https://stackoverflow.com/q/181348\n        var date;\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            date = new Date(y + 400, m, d, h, M, s, ms);\n            if (isFinite(date.getFullYear())) {\n                date.setFullYear(y);\n            }\n        } else {\n            date = new Date(y, m, d, h, M, s, ms);\n        }\n\n        return date;\n    }\n\n    function createUTCDate(y) {\n        var date, args;\n        // the Date.UTC function remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            args = Array.prototype.slice.call(arguments);\n            // preserve leap years using a full 400 year cycle, then reset\n            args[0] = y + 400;\n            date = new Date(Date.UTC.apply(null, args));\n            if (isFinite(date.getUTCFullYear())) {\n                date.setUTCFullYear(y);\n            }\n        } else {\n            date = new Date(Date.UTC.apply(null, arguments));\n        }\n\n        return date;\n    }\n\n    // start-of-first-week - start-of-year\n    function firstWeekOffset(year, dow, doy) {\n        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n            fwd = 7 + dow - doy,\n            // first-week day local weekday -- which local weekday is fwd\n            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n        return -fwdlw + fwd - 1;\n    }\n\n    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n        var localWeekday = (7 + weekday - dow) % 7,\n            weekOffset = firstWeekOffset(year, dow, doy),\n            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n            resYear,\n            resDayOfYear;\n\n        if (dayOfYear <= 0) {\n            resYear = year - 1;\n            resDayOfYear = daysInYear(resYear) + dayOfYear;\n        } else if (dayOfYear > daysInYear(year)) {\n            resYear = year + 1;\n            resDayOfYear = dayOfYear - daysInYear(year);\n        } else {\n            resYear = year;\n            resDayOfYear = dayOfYear;\n        }\n\n        return {\n            year: resYear,\n            dayOfYear: resDayOfYear,\n        };\n    }\n\n    function weekOfYear(mom, dow, doy) {\n        var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n            resWeek,\n            resYear;\n\n        if (week < 1) {\n            resYear = mom.year() - 1;\n            resWeek = week + weeksInYear(resYear, dow, doy);\n        } else if (week > weeksInYear(mom.year(), dow, doy)) {\n            resWeek = week - weeksInYear(mom.year(), dow, doy);\n            resYear = mom.year() + 1;\n        } else {\n            resYear = mom.year();\n            resWeek = week;\n        }\n\n        return {\n            week: resWeek,\n            year: resYear,\n        };\n    }\n\n    function weeksInYear(year, dow, doy) {\n        var weekOffset = firstWeekOffset(year, dow, doy),\n            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n    }\n\n    // FORMATTING\n\n    addFormatToken('w', ['ww', 2], 'wo', 'week');\n    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n    // PARSING\n\n    addRegexToken('w', match1to2, match1to2NoLeadingZero);\n    addRegexToken('ww', match1to2, match2);\n    addRegexToken('W', match1to2, match1to2NoLeadingZero);\n    addRegexToken('WW', match1to2, match2);\n\n    addWeekParseToken(\n        ['w', 'ww', 'W', 'WW'],\n        function (input, week, config, token) {\n            week[token.substr(0, 1)] = toInt(input);\n        }\n    );\n\n    // HELPERS\n\n    // LOCALES\n\n    function localeWeek(mom) {\n        return weekOfYear(mom, this._week.dow, this._week.doy).week;\n    }\n\n    var defaultLocaleWeek = {\n        dow: 0, // Sunday is the first day of the week.\n        doy: 6, // The week that contains Jan 6th is the first week of the year.\n    };\n\n    function localeFirstDayOfWeek() {\n        return this._week.dow;\n    }\n\n    function localeFirstDayOfYear() {\n        return this._week.doy;\n    }\n\n    // MOMENTS\n\n    function getSetWeek(input) {\n        var week = this.localeData().week(this);\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    function getSetISOWeek(input) {\n        var week = weekOfYear(this, 1, 4).week;\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('d', 0, 'do', 'day');\n\n    addFormatToken('dd', 0, 0, function (format) {\n        return this.localeData().weekdaysMin(this, format);\n    });\n\n    addFormatToken('ddd', 0, 0, function (format) {\n        return this.localeData().weekdaysShort(this, format);\n    });\n\n    addFormatToken('dddd', 0, 0, function (format) {\n        return this.localeData().weekdays(this, format);\n    });\n\n    addFormatToken('e', 0, 0, 'weekday');\n    addFormatToken('E', 0, 0, 'isoWeekday');\n\n    // PARSING\n\n    addRegexToken('d', match1to2);\n    addRegexToken('e', match1to2);\n    addRegexToken('E', match1to2);\n    addRegexToken('dd', function (isStrict, locale) {\n        return locale.weekdaysMinRegex(isStrict);\n    });\n    addRegexToken('ddd', function (isStrict, locale) {\n        return locale.weekdaysShortRegex(isStrict);\n    });\n    addRegexToken('dddd', function (isStrict, locale) {\n        return locale.weekdaysRegex(isStrict);\n    });\n\n    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n        var weekday = config._locale.weekdaysParse(input, token, config._strict);\n        // if we didn't get a weekday name, mark the date as invalid\n        if (weekday != null) {\n            week.d = weekday;\n        } else {\n            getParsingFlags(config).invalidWeekday = input;\n        }\n    });\n\n    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n        week[token] = toInt(input);\n    });\n\n    // HELPERS\n\n    function parseWeekday(input, locale) {\n        if (typeof input !== 'string') {\n            return input;\n        }\n\n        if (!isNaN(input)) {\n            return parseInt(input, 10);\n        }\n\n        input = locale.weekdaysParse(input);\n        if (typeof input === 'number') {\n            return input;\n        }\n\n        return null;\n    }\n\n    function parseIsoWeekday(input, locale) {\n        if (typeof input === 'string') {\n            return locale.weekdaysParse(input) % 7 || 7;\n        }\n        return isNaN(input) ? null : input;\n    }\n\n    // LOCALES\n    function shiftWeekdays(ws, n) {\n        return ws.slice(n, 7).concat(ws.slice(0, n));\n    }\n\n    var defaultLocaleWeekdays =\n            'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n        defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        defaultWeekdaysRegex = matchWord,\n        defaultWeekdaysShortRegex = matchWord,\n        defaultWeekdaysMinRegex = matchWord;\n\n    function localeWeekdays(m, format) {\n        var weekdays = isArray(this._weekdays)\n            ? this._weekdays\n            : this._weekdays[\n                  m && m !== true && this._weekdays.isFormat.test(format)\n                      ? 'format'\n                      : 'standalone'\n              ];\n        return m === true\n            ? shiftWeekdays(weekdays, this._week.dow)\n            : m\n              ? weekdays[m.day()]\n              : weekdays;\n    }\n\n    function localeWeekdaysShort(m) {\n        return m === true\n            ? shiftWeekdays(this._weekdaysShort, this._week.dow)\n            : m\n              ? this._weekdaysShort[m.day()]\n              : this._weekdaysShort;\n    }\n\n    function localeWeekdaysMin(m) {\n        return m === true\n            ? shiftWeekdays(this._weekdaysMin, this._week.dow)\n            : m\n              ? this._weekdaysMin[m.day()]\n              : this._weekdaysMin;\n    }\n\n    function handleStrictParse$1(weekdayName, format, strict) {\n        var i,\n            ii,\n            mom,\n            llc = weekdayName.toLocaleLowerCase();\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._minWeekdaysParse = [];\n\n            for (i = 0; i < 7; ++i) {\n                mom = createUTC([2000, 1]).day(i);\n                this._minWeekdaysParse[i] = this.weekdaysMin(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._shortWeekdaysParse[i] = this.weekdaysShort(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeWeekdaysParse(weekdayName, format, strict) {\n        var i, mom, regex;\n\n        if (this._weekdaysParseExact) {\n            return handleStrictParse$1.call(this, weekdayName, format, strict);\n        }\n\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._minWeekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._fullWeekdaysParse = [];\n        }\n\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n\n            mom = createUTC([2000, 1]).day(i);\n            if (strict && !this._fullWeekdaysParse[i]) {\n                this._fullWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n                this._shortWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n                this._minWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n            }\n            if (!this._weekdaysParse[i]) {\n                regex =\n                    '^' +\n                    this.weekdays(mom, '') +\n                    '|^' +\n                    this.weekdaysShort(mom, '') +\n                    '|^' +\n                    this.weekdaysMin(mom, '');\n                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (\n                strict &&\n                format === 'dddd' &&\n                this._fullWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'ddd' &&\n                this._shortWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'dd' &&\n                this._minWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function getSetDayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n\n        var day = get(this, 'Day');\n        if (input != null) {\n            input = parseWeekday(input, this.localeData());\n            return this.add(input - day, 'd');\n        } else {\n            return day;\n        }\n    }\n\n    function getSetLocaleDayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n        return input == null ? weekday : this.add(input - weekday, 'd');\n    }\n\n    function getSetISODayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n\n        // behaves the same as moment#day except\n        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n        // as a setter, sunday should belong to the previous week.\n\n        if (input != null) {\n            var weekday = parseIsoWeekday(input, this.localeData());\n            return this.day(this.day() % 7 ? weekday : weekday - 7);\n        } else {\n            return this.day() || 7;\n        }\n    }\n\n    function weekdaysRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysStrictRegex;\n            } else {\n                return this._weekdaysRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                this._weekdaysRegex = defaultWeekdaysRegex;\n            }\n            return this._weekdaysStrictRegex && isStrict\n                ? this._weekdaysStrictRegex\n                : this._weekdaysRegex;\n        }\n    }\n\n    function weekdaysShortRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysShortStrictRegex;\n            } else {\n                return this._weekdaysShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n                this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n            }\n            return this._weekdaysShortStrictRegex && isStrict\n                ? this._weekdaysShortStrictRegex\n                : this._weekdaysShortRegex;\n        }\n    }\n\n    function weekdaysMinRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysMinStrictRegex;\n            } else {\n                return this._weekdaysMinRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n                this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n            }\n            return this._weekdaysMinStrictRegex && isStrict\n                ? this._weekdaysMinStrictRegex\n                : this._weekdaysMinRegex;\n        }\n    }\n\n    function computeWeekdaysParse() {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var minPieces = [],\n            shortPieces = [],\n            longPieces = [],\n            mixedPieces = [],\n            i,\n            mom,\n            minp,\n            shortp,\n            longp;\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, 1]).day(i);\n            minp = regexEscape(this.weekdaysMin(mom, ''));\n            shortp = regexEscape(this.weekdaysShort(mom, ''));\n            longp = regexEscape(this.weekdays(mom, ''));\n            minPieces.push(minp);\n            shortPieces.push(shortp);\n            longPieces.push(longp);\n            mixedPieces.push(minp);\n            mixedPieces.push(shortp);\n            mixedPieces.push(longp);\n        }\n        // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n        // will match the longer piece.\n        minPieces.sort(cmpLenRev);\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n\n        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._weekdaysShortRegex = this._weekdaysRegex;\n        this._weekdaysMinRegex = this._weekdaysRegex;\n\n        this._weekdaysStrictRegex = new RegExp(\n            '^(' + longPieces.join('|') + ')',\n            'i'\n        );\n        this._weekdaysShortStrictRegex = new RegExp(\n            '^(' + shortPieces.join('|') + ')',\n            'i'\n        );\n        this._weekdaysMinStrictRegex = new RegExp(\n            '^(' + minPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    function hFormat() {\n        return this.hours() % 12 || 12;\n    }\n\n    function kFormat() {\n        return this.hours() || 24;\n    }\n\n    addFormatToken('H', ['HH', 2], 0, 'hour');\n    addFormatToken('h', ['hh', 2], 0, hFormat);\n    addFormatToken('k', ['kk', 2], 0, kFormat);\n\n    addFormatToken('hmm', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('hmmss', 0, 0, function () {\n        return (\n            '' +\n            hFormat.apply(this) +\n            zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2)\n        );\n    });\n\n    addFormatToken('Hmm', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('Hmmss', 0, 0, function () {\n        return (\n            '' +\n            this.hours() +\n            zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2)\n        );\n    });\n\n    function meridiem(token, lowercase) {\n        addFormatToken(token, 0, 0, function () {\n            return this.localeData().meridiem(\n                this.hours(),\n                this.minutes(),\n                lowercase\n            );\n        });\n    }\n\n    meridiem('a', true);\n    meridiem('A', false);\n\n    // PARSING\n\n    function matchMeridiem(isStrict, locale) {\n        return locale._meridiemParse;\n    }\n\n    addRegexToken('a', matchMeridiem);\n    addRegexToken('A', matchMeridiem);\n    addRegexToken('H', match1to2, match1to2HasZero);\n    addRegexToken('h', match1to2, match1to2NoLeadingZero);\n    addRegexToken('k', match1to2, match1to2NoLeadingZero);\n    addRegexToken('HH', match1to2, match2);\n    addRegexToken('hh', match1to2, match2);\n    addRegexToken('kk', match1to2, match2);\n\n    addRegexToken('hmm', match3to4);\n    addRegexToken('hmmss', match5to6);\n    addRegexToken('Hmm', match3to4);\n    addRegexToken('Hmmss', match5to6);\n\n    addParseToken(['H', 'HH'], HOUR);\n    addParseToken(['k', 'kk'], function (input, array, config) {\n        var kInput = toInt(input);\n        array[HOUR] = kInput === 24 ? 0 : kInput;\n    });\n    addParseToken(['a', 'A'], function (input, array, config) {\n        config._isPm = config._locale.isPM(input);\n        config._meridiem = input;\n    });\n    addParseToken(['h', 'hh'], function (input, array, config) {\n        array[HOUR] = toInt(input);\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmmss', function (input, array, config) {\n        var pos1 = input.length - 4,\n            pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('Hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n    });\n    addParseToken('Hmmss', function (input, array, config) {\n        var pos1 = input.length - 4,\n            pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n    });\n\n    // LOCALES\n\n    function localeIsPM(input) {\n        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n        // Using charAt should be more compatible.\n        return (input + '').toLowerCase().charAt(0) === 'p';\n    }\n\n    var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i,\n        // Setting the hour should keep the time, because the user explicitly\n        // specified which hour they want. So trying to maintain the same hour (in\n        // a new timezone) makes sense. Adding/subtracting hours does not follow\n        // this rule.\n        getSetHour = makeGetSet('Hours', true);\n\n    function localeMeridiem(hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'pm' : 'PM';\n        } else {\n            return isLower ? 'am' : 'AM';\n        }\n    }\n\n    var baseConfig = {\n        calendar: defaultCalendar,\n        longDateFormat: defaultLongDateFormat,\n        invalidDate: defaultInvalidDate,\n        ordinal: defaultOrdinal,\n        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n        relativeTime: defaultRelativeTime,\n\n        months: defaultLocaleMonths,\n        monthsShort: defaultLocaleMonthsShort,\n\n        week: defaultLocaleWeek,\n\n        weekdays: defaultLocaleWeekdays,\n        weekdaysMin: defaultLocaleWeekdaysMin,\n        weekdaysShort: defaultLocaleWeekdaysShort,\n\n        meridiemParse: defaultLocaleMeridiemParse,\n    };\n\n    // internal storage for locale config files\n    var locales = {},\n        localeFamilies = {},\n        globalLocale;\n\n    function commonPrefix(arr1, arr2) {\n        var i,\n            minl = Math.min(arr1.length, arr2.length);\n        for (i = 0; i < minl; i += 1) {\n            if (arr1[i] !== arr2[i]) {\n                return i;\n            }\n        }\n        return minl;\n    }\n\n    function normalizeLocale(key) {\n        return key ? key.toLowerCase().replace('_', '-') : key;\n    }\n\n    // pick the locale from the array\n    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n    function chooseLocale(names) {\n        var i = 0,\n            j,\n            next,\n            locale,\n            split;\n\n        while (i < names.length) {\n            split = normalizeLocale(names[i]).split('-');\n            j = split.length;\n            next = normalizeLocale(names[i + 1]);\n            next = next ? next.split('-') : null;\n            while (j > 0) {\n                locale = loadLocale(split.slice(0, j).join('-'));\n                if (locale) {\n                    return locale;\n                }\n                if (\n                    next &&\n                    next.length >= j &&\n                    commonPrefix(split, next) >= j - 1\n                ) {\n                    //the next array item is better than a shallower substring of this one\n                    break;\n                }\n                j--;\n            }\n            i++;\n        }\n        return globalLocale;\n    }\n\n    function isLocaleNameSane(name) {\n        // Prevent names that look like filesystem paths, i.e contain '/' or '\\'\n        // Ensure name is available and function returns boolean\n        return !!(name && name.match('^[^/\\\\\\\\]*$'));\n    }\n\n    function loadLocale(name) {\n        var oldLocale = null,\n            aliasedRequire;\n        // TODO: Find a better way to register and load all the locales in Node\n        if (\n            locales[name] === undefined &&\n            typeof module !== 'undefined' &&\n            module &&\n            module.exports &&\n            isLocaleNameSane(name)\n        ) {\n            try {\n                oldLocale = globalLocale._abbr;\n                aliasedRequire = require;\n                aliasedRequire('./locale/' + name);\n                getSetGlobalLocale(oldLocale);\n            } catch (e) {\n                // mark as not found to avoid repeating expensive file require call causing high CPU\n                // when trying to find en-US, en_US, en-us for every format call\n                locales[name] = null; // null means not found\n            }\n        }\n        return locales[name];\n    }\n\n    // This function will load locale and then set the global locale.  If\n    // no arguments are passed in, it will simply return the current global\n    // locale key.\n    function getSetGlobalLocale(key, values) {\n        var data;\n        if (key) {\n            if (isUndefined(values)) {\n                data = getLocale(key);\n            } else {\n                data = defineLocale(key, values);\n            }\n\n            if (data) {\n                // moment.duration._locale = moment._locale = data;\n                globalLocale = data;\n            } else {\n                if (typeof console !== 'undefined' && console.warn) {\n                    //warn user if arguments are passed but the locale could not be set\n                    console.warn(\n                        'Locale ' + key + ' not found. Did you forget to load it?'\n                    );\n                }\n            }\n        }\n\n        return globalLocale._abbr;\n    }\n\n    function defineLocale(name, config) {\n        if (config !== null) {\n            var locale,\n                parentConfig = baseConfig;\n            config.abbr = name;\n            if (locales[name] != null) {\n                deprecateSimple(\n                    'defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                        'an existing locale. moment.defineLocale(localeName, ' +\n                        'config) should only be used for creating a new locale ' +\n                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'\n                );\n                parentConfig = locales[name]._config;\n            } else if (config.parentLocale != null) {\n                if (locales[config.parentLocale] != null) {\n                    parentConfig = locales[config.parentLocale]._config;\n                } else {\n                    locale = loadLocale(config.parentLocale);\n                    if (locale != null) {\n                        parentConfig = locale._config;\n                    } else {\n                        if (!localeFamilies[config.parentLocale]) {\n                            localeFamilies[config.parentLocale] = [];\n                        }\n                        localeFamilies[config.parentLocale].push({\n                            name: name,\n                            config: config,\n                        });\n                        return null;\n                    }\n                }\n            }\n            locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n            if (localeFamilies[name]) {\n                localeFamilies[name].forEach(function (x) {\n                    defineLocale(x.name, x.config);\n                });\n            }\n\n            // backwards compat for now: also set the locale\n            // make sure we set the locale AFTER all child locales have been\n            // created, so we won't end up with the child locale set.\n            getSetGlobalLocale(name);\n\n            return locales[name];\n        } else {\n            // useful for testing\n            delete locales[name];\n            return null;\n        }\n    }\n\n    function updateLocale(name, config) {\n        if (config != null) {\n            var locale,\n                tmpLocale,\n                parentConfig = baseConfig;\n\n            if (locales[name] != null && locales[name].parentLocale != null) {\n                // Update existing child locale in-place to avoid memory-leaks\n                locales[name].set(mergeConfigs(locales[name]._config, config));\n            } else {\n                // MERGE\n                tmpLocale = loadLocale(name);\n                if (tmpLocale != null) {\n                    parentConfig = tmpLocale._config;\n                }\n                config = mergeConfigs(parentConfig, config);\n                if (tmpLocale == null) {\n                    // updateLocale is called for creating a new locale\n                    // Set abbr so it will have a name (getters return\n                    // undefined otherwise).\n                    config.abbr = name;\n                }\n                locale = new Locale(config);\n                locale.parentLocale = locales[name];\n                locales[name] = locale;\n            }\n\n            // backwards compat for now: also set the locale\n            getSetGlobalLocale(name);\n        } else {\n            // pass null for config to unupdate, useful for tests\n            if (locales[name] != null) {\n                if (locales[name].parentLocale != null) {\n                    locales[name] = locales[name].parentLocale;\n                    if (name === getSetGlobalLocale()) {\n                        getSetGlobalLocale(name);\n                    }\n                } else if (locales[name] != null) {\n                    delete locales[name];\n                }\n            }\n        }\n        return locales[name];\n    }\n\n    // returns locale data\n    function getLocale(key) {\n        var locale;\n\n        if (key && key._locale && key._locale._abbr) {\n            key = key._locale._abbr;\n        }\n\n        if (!key) {\n            return globalLocale;\n        }\n\n        if (!isArray(key)) {\n            //short-circuit everything else\n            locale = loadLocale(key);\n            if (locale) {\n                return locale;\n            }\n            key = [key];\n        }\n\n        return chooseLocale(key);\n    }\n\n    function listLocales() {\n        return keys(locales);\n    }\n\n    function checkOverflow(m) {\n        var overflow,\n            a = m._a;\n\n        if (a && getParsingFlags(m).overflow === -2) {\n            overflow =\n                a[MONTH] < 0 || a[MONTH] > 11\n                    ? MONTH\n                    : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])\n                      ? DATE\n                      : a[HOUR] < 0 ||\n                          a[HOUR] > 24 ||\n                          (a[HOUR] === 24 &&\n                              (a[MINUTE] !== 0 ||\n                                  a[SECOND] !== 0 ||\n                                  a[MILLISECOND] !== 0))\n                        ? HOUR\n                        : a[MINUTE] < 0 || a[MINUTE] > 59\n                          ? MINUTE\n                          : a[SECOND] < 0 || a[SECOND] > 59\n                            ? SECOND\n                            : a[MILLISECOND] < 0 || a[MILLISECOND] > 999\n                              ? MILLISECOND\n                              : -1;\n\n            if (\n                getParsingFlags(m)._overflowDayOfYear &&\n                (overflow < YEAR || overflow > DATE)\n            ) {\n                overflow = DATE;\n            }\n            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n                overflow = WEEK;\n            }\n            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n                overflow = WEEKDAY;\n            }\n\n            getParsingFlags(m).overflow = overflow;\n        }\n\n        return m;\n    }\n\n    // iso 8601 regex\n    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n    var extendedIsoRegex =\n            /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n        basicIsoRegex =\n            /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d|))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n        tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/,\n        isoDates = [\n            ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n            ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n            ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n            ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n            ['YYYY-DDD', /\\d{4}-\\d{3}/],\n            ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n            ['YYYYYYMMDD', /[+-]\\d{10}/],\n            ['YYYYMMDD', /\\d{8}/],\n            ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n            ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n            ['YYYYDDD', /\\d{7}/],\n            ['YYYYMM', /\\d{6}/, false],\n            ['YYYY', /\\d{4}/, false],\n        ],\n        // iso time formats and regexes\n        isoTimes = [\n            ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n            ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n            ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n            ['HH:mm', /\\d\\d:\\d\\d/],\n            ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n            ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n            ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n            ['HHmm', /\\d\\d\\d\\d/],\n            ['HH', /\\d\\d/],\n        ],\n        aspNetJsonRegex = /^\\/?Date\\((-?\\d+)/i,\n        // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n        rfc2822 =\n            /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,\n        obsOffsets = {\n            UT: 0,\n            GMT: 0,\n            EDT: -4 * 60,\n            EST: -5 * 60,\n            CDT: -5 * 60,\n            CST: -6 * 60,\n            MDT: -6 * 60,\n            MST: -7 * 60,\n            PDT: -7 * 60,\n            PST: -8 * 60,\n        };\n\n    // date from iso format\n    function configFromISO(config) {\n        var i,\n            l,\n            string = config._i,\n            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n            allowTime,\n            dateFormat,\n            timeFormat,\n            tzFormat,\n            isoDatesLen = isoDates.length,\n            isoTimesLen = isoTimes.length;\n\n        if (match) {\n            getParsingFlags(config).iso = true;\n            for (i = 0, l = isoDatesLen; i < l; i++) {\n                if (isoDates[i][1].exec(match[1])) {\n                    dateFormat = isoDates[i][0];\n                    allowTime = isoDates[i][2] !== false;\n                    break;\n                }\n            }\n            if (dateFormat == null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[3]) {\n                for (i = 0, l = isoTimesLen; i < l; i++) {\n                    if (isoTimes[i][1].exec(match[3])) {\n                        // match[2] should be 'T' or space\n                        timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                        break;\n                    }\n                }\n                if (timeFormat == null) {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            if (!allowTime && timeFormat != null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[4]) {\n                if (tzRegex.exec(match[4])) {\n                    tzFormat = 'Z';\n                } else {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n            configFromStringAndFormat(config);\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    function extractFromRFC2822Strings(\n        yearStr,\n        monthStr,\n        dayStr,\n        hourStr,\n        minuteStr,\n        secondStr\n    ) {\n        var result = [\n            untruncateYear(yearStr),\n            defaultLocaleMonthsShort.indexOf(monthStr),\n            parseInt(dayStr, 10),\n            parseInt(hourStr, 10),\n            parseInt(minuteStr, 10),\n        ];\n\n        if (secondStr) {\n            result.push(parseInt(secondStr, 10));\n        }\n\n        return result;\n    }\n\n    function untruncateYear(yearStr) {\n        var year = parseInt(yearStr, 10);\n        if (year <= 49) {\n            return 2000 + year;\n        } else if (year <= 999) {\n            return 1900 + year;\n        }\n        return year;\n    }\n\n    function preprocessRFC2822(s) {\n        // Remove comments and folding whitespace and replace multiple-spaces with a single space\n        return s\n            .replace(/\\([^()]*\\)|[\\n\\t]/g, ' ')\n            .replace(/(\\s\\s+)/g, ' ')\n            .replace(/^\\s\\s*/, '')\n            .replace(/\\s\\s*$/, '');\n    }\n\n    function checkWeekday(weekdayStr, parsedInput, config) {\n        if (weekdayStr) {\n            // TODO: Replace the vanilla JS Date object with an independent day-of-week check.\n            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n                weekdayActual = new Date(\n                    parsedInput[0],\n                    parsedInput[1],\n                    parsedInput[2]\n                ).getDay();\n            if (weekdayProvided !== weekdayActual) {\n                getParsingFlags(config).weekdayMismatch = true;\n                config._isValid = false;\n                return false;\n            }\n        }\n        return true;\n    }\n\n    function calculateOffset(obsOffset, militaryOffset, numOffset) {\n        if (obsOffset) {\n            return obsOffsets[obsOffset];\n        } else if (militaryOffset) {\n            // the only allowed military tz is Z\n            return 0;\n        } else {\n            var hm = parseInt(numOffset, 10),\n                m = hm % 100,\n                h = (hm - m) / 100;\n            return h * 60 + m;\n        }\n    }\n\n    // date and time from ref 2822 format\n    function configFromRFC2822(config) {\n        var match = rfc2822.exec(preprocessRFC2822(config._i)),\n            parsedArray;\n        if (match) {\n            parsedArray = extractFromRFC2822Strings(\n                match[4],\n                match[3],\n                match[2],\n                match[5],\n                match[6],\n                match[7]\n            );\n            if (!checkWeekday(match[1], parsedArray, config)) {\n                return;\n            }\n\n            config._a = parsedArray;\n            config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n            config._d = createUTCDate.apply(null, config._a);\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n            getParsingFlags(config).rfc2822 = true;\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict\n    function configFromString(config) {\n        var matched = aspNetJsonRegex.exec(config._i);\n        if (matched !== null) {\n            config._d = new Date(+matched[1]);\n            return;\n        }\n\n        configFromISO(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        configFromRFC2822(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        if (config._strict) {\n            config._isValid = false;\n        } else {\n            // Final attempt, use Input Fallback\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    hooks.createFromInputFallback = deprecate(\n        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n            'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n            'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n        function (config) {\n            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n        }\n    );\n\n    // Pick the first defined of two or three arguments.\n    function defaults(a, b, c) {\n        if (a != null) {\n            return a;\n        }\n        if (b != null) {\n            return b;\n        }\n        return c;\n    }\n\n    function currentDateArray(config) {\n        // hooks is actually the exported moment object\n        var nowValue = new Date(hooks.now());\n        if (config._useUTC) {\n            return [\n                nowValue.getUTCFullYear(),\n                nowValue.getUTCMonth(),\n                nowValue.getUTCDate(),\n            ];\n        }\n        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n    }\n\n    // convert an array to a date.\n    // the array should mirror the parameters below\n    // note: all values past the year are optional and will default to the lowest possible value.\n    // [year, month, day , hour, minute, second, millisecond]\n    function configFromArray(config) {\n        var i,\n            date,\n            input = [],\n            currentDate,\n            expectedWeekday,\n            yearToUse;\n\n        if (config._d) {\n            return;\n        }\n\n        currentDate = currentDateArray(config);\n\n        //compute day of the year from weeks and weekdays\n        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n            dayOfYearFromWeekInfo(config);\n        }\n\n        //if the day of the year is set, figure out what it is\n        if (config._dayOfYear != null) {\n            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n            if (\n                config._dayOfYear > daysInYear(yearToUse) ||\n                config._dayOfYear === 0\n            ) {\n                getParsingFlags(config)._overflowDayOfYear = true;\n            }\n\n            date = createUTCDate(yearToUse, 0, config._dayOfYear);\n            config._a[MONTH] = date.getUTCMonth();\n            config._a[DATE] = date.getUTCDate();\n        }\n\n        // Default to current date.\n        // * if no year, month, day of month are given, default to today\n        // * if day of month is given, default month and year\n        // * if month is given, default only year\n        // * if year is given, don't default anything\n        for (i = 0; i < 3 && config._a[i] == null; ++i) {\n            config._a[i] = input[i] = currentDate[i];\n        }\n\n        // Zero out whatever was not defaulted, including time\n        for (; i < 7; i++) {\n            config._a[i] = input[i] =\n                config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];\n        }\n\n        // Check for 24:00:00.000\n        if (\n            config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0\n        ) {\n            config._nextDay = true;\n            config._a[HOUR] = 0;\n        }\n\n        config._d = (config._useUTC ? createUTCDate : createDate).apply(\n            null,\n            input\n        );\n        expectedWeekday = config._useUTC\n            ? config._d.getUTCDay()\n            : config._d.getDay();\n\n        // Apply timezone offset from input. The actual utcOffset can be changed\n        // with parseZone.\n        if (config._tzm != null) {\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n        }\n\n        if (config._nextDay) {\n            config._a[HOUR] = 24;\n        }\n\n        // check for mismatching day of week\n        if (\n            config._w &&\n            typeof config._w.d !== 'undefined' &&\n            config._w.d !== expectedWeekday\n        ) {\n            getParsingFlags(config).weekdayMismatch = true;\n        }\n    }\n\n    function dayOfYearFromWeekInfo(config) {\n        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;\n\n        w = config._w;\n        if (w.GG != null || w.W != null || w.E != null) {\n            dow = 1;\n            doy = 4;\n\n            // TODO: We need to take the current isoWeekYear, but that depends on\n            // how we interpret now (local, utc, fixed offset). So create\n            // a now version of current config (take local/utc/offset flags, and\n            // create now).\n            weekYear = defaults(\n                w.GG,\n                config._a[YEAR],\n                weekOfYear(createLocal(), 1, 4).year\n            );\n            week = defaults(w.W, 1);\n            weekday = defaults(w.E, 1);\n            if (weekday < 1 || weekday > 7) {\n                weekdayOverflow = true;\n            }\n        } else {\n            dow = config._locale._week.dow;\n            doy = config._locale._week.doy;\n\n            curWeek = weekOfYear(createLocal(), dow, doy);\n\n            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n            // Default to current week.\n            week = defaults(w.w, curWeek.week);\n\n            if (w.d != null) {\n                // weekday -- low day numbers are considered next week\n                weekday = w.d;\n                if (weekday < 0 || weekday > 6) {\n                    weekdayOverflow = true;\n                }\n            } else if (w.e != null) {\n                // local weekday -- counting starts from beginning of week\n                weekday = w.e + dow;\n                if (w.e < 0 || w.e > 6) {\n                    weekdayOverflow = true;\n                }\n            } else {\n                // default to beginning of week\n                weekday = dow;\n            }\n        }\n        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n            getParsingFlags(config)._overflowWeeks = true;\n        } else if (weekdayOverflow != null) {\n            getParsingFlags(config)._overflowWeekday = true;\n        } else {\n            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n            config._a[YEAR] = temp.year;\n            config._dayOfYear = temp.dayOfYear;\n        }\n    }\n\n    // constant that refers to the ISO standard\n    hooks.ISO_8601 = function () {};\n\n    // constant that refers to the RFC 2822 form\n    hooks.RFC_2822 = function () {};\n\n    // date from string and format string\n    function configFromStringAndFormat(config) {\n        // TODO: Move this to another part of the creation flow to prevent circular deps\n        if (config._f === hooks.ISO_8601) {\n            configFromISO(config);\n            return;\n        }\n        if (config._f === hooks.RFC_2822) {\n            configFromRFC2822(config);\n            return;\n        }\n        config._a = [];\n        getParsingFlags(config).empty = true;\n\n        // This array is used to make a Date, either with `new Date` or `Date.UTC`\n        var string = '' + config._i,\n            i,\n            parsedInput,\n            tokens,\n            token,\n            skipped,\n            stringLength = string.length,\n            totalParsedInputLength = 0,\n            era,\n            tokenLen;\n\n        tokens =\n            expandFormat(config._f, config._locale).match(formattingTokens) || [];\n        tokenLen = tokens.length;\n        for (i = 0; i < tokenLen; i++) {\n            token = tokens[i];\n            parsedInput = (string.match(getParseRegexForToken(token, config)) ||\n                [])[0];\n            if (parsedInput) {\n                skipped = string.substr(0, string.indexOf(parsedInput));\n                if (skipped.length > 0) {\n                    getParsingFlags(config).unusedInput.push(skipped);\n                }\n                string = string.slice(\n                    string.indexOf(parsedInput) + parsedInput.length\n                );\n                totalParsedInputLength += parsedInput.length;\n            }\n            // don't parse if it's not a known token\n            if (formatTokenFunctions[token]) {\n                if (parsedInput) {\n                    getParsingFlags(config).empty = false;\n                } else {\n                    getParsingFlags(config).unusedTokens.push(token);\n                }\n                addTimeToArrayFromToken(token, parsedInput, config);\n            } else if (config._strict && !parsedInput) {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n        }\n\n        // add remaining unparsed input length to the string\n        getParsingFlags(config).charsLeftOver =\n            stringLength - totalParsedInputLength;\n        if (string.length > 0) {\n            getParsingFlags(config).unusedInput.push(string);\n        }\n\n        // clear _12h flag if hour is <= 12\n        if (\n            config._a[HOUR] <= 12 &&\n            getParsingFlags(config).bigHour === true &&\n            config._a[HOUR] > 0\n        ) {\n            getParsingFlags(config).bigHour = undefined;\n        }\n\n        getParsingFlags(config).parsedDateParts = config._a.slice(0);\n        getParsingFlags(config).meridiem = config._meridiem;\n        // handle meridiem\n        config._a[HOUR] = meridiemFixWrap(\n            config._locale,\n            config._a[HOUR],\n            config._meridiem\n        );\n\n        // handle era\n        era = getParsingFlags(config).era;\n        if (era !== null) {\n            config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);\n        }\n\n        configFromArray(config);\n        checkOverflow(config);\n    }\n\n    function meridiemFixWrap(locale, hour, meridiem) {\n        var isPm;\n\n        if (meridiem == null) {\n            // nothing to do\n            return hour;\n        }\n        if (locale.meridiemHour != null) {\n            return locale.meridiemHour(hour, meridiem);\n        } else if (locale.isPM != null) {\n            // Fallback\n            isPm = locale.isPM(meridiem);\n            if (isPm && hour < 12) {\n                hour += 12;\n            }\n            if (!isPm && hour === 12) {\n                hour = 0;\n            }\n            return hour;\n        } else {\n            // this is not supposed to happen\n            return hour;\n        }\n    }\n\n    // date from string and array of format strings\n    function configFromStringAndArray(config) {\n        var tempConfig,\n            bestMoment,\n            scoreToBeat,\n            i,\n            currentScore,\n            validFormatFound,\n            bestFormatIsValid = false,\n            configfLen = config._f.length;\n\n        if (configfLen === 0) {\n            getParsingFlags(config).invalidFormat = true;\n            config._d = new Date(NaN);\n            return;\n        }\n\n        for (i = 0; i < configfLen; i++) {\n            currentScore = 0;\n            validFormatFound = false;\n            tempConfig = copyConfig({}, config);\n            if (config._useUTC != null) {\n                tempConfig._useUTC = config._useUTC;\n            }\n            tempConfig._f = config._f[i];\n            configFromStringAndFormat(tempConfig);\n\n            if (isValid(tempConfig)) {\n                validFormatFound = true;\n            }\n\n            // if there is any input that was not parsed add a penalty for that format\n            currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n            //or tokens\n            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n            getParsingFlags(tempConfig).score = currentScore;\n\n            if (!bestFormatIsValid) {\n                if (\n                    scoreToBeat == null ||\n                    currentScore < scoreToBeat ||\n                    validFormatFound\n                ) {\n                    scoreToBeat = currentScore;\n                    bestMoment = tempConfig;\n                    if (validFormatFound) {\n                        bestFormatIsValid = true;\n                    }\n                }\n            } else {\n                if (currentScore < scoreToBeat) {\n                    scoreToBeat = currentScore;\n                    bestMoment = tempConfig;\n                }\n            }\n        }\n\n        extend(config, bestMoment || tempConfig);\n    }\n\n    function configFromObject(config) {\n        if (config._d) {\n            return;\n        }\n\n        var i = normalizeObjectUnits(config._i),\n            dayOrDate = i.day === undefined ? i.date : i.day;\n        config._a = map(\n            [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],\n            function (obj) {\n                return obj && parseInt(obj, 10);\n            }\n        );\n\n        configFromArray(config);\n    }\n\n    function createFromConfig(config) {\n        var res = new Moment(checkOverflow(prepareConfig(config)));\n        if (res._nextDay) {\n            // Adding is smart enough around DST\n            res.add(1, 'd');\n            res._nextDay = undefined;\n        }\n\n        return res;\n    }\n\n    function prepareConfig(config) {\n        var input = config._i,\n            format = config._f;\n\n        config._locale = config._locale || getLocale(config._l);\n\n        if (input === null || (format === undefined && input === '')) {\n            return createInvalid({ nullInput: true });\n        }\n\n        if (typeof input === 'string') {\n            config._i = input = config._locale.preparse(input);\n        }\n\n        if (isMoment(input)) {\n            return new Moment(checkOverflow(input));\n        } else if (isDate(input)) {\n            config._d = input;\n        } else if (isArray(format)) {\n            configFromStringAndArray(config);\n        } else if (format) {\n            configFromStringAndFormat(config);\n        } else {\n            configFromInput(config);\n        }\n\n        if (!isValid(config)) {\n            config._d = null;\n        }\n\n        return config;\n    }\n\n    function configFromInput(config) {\n        var input = config._i;\n        if (isUndefined(input)) {\n            config._d = new Date(hooks.now());\n        } else if (isDate(input)) {\n            config._d = new Date(input.valueOf());\n        } else if (typeof input === 'string') {\n            configFromString(config);\n        } else if (isArray(input)) {\n            config._a = map(input.slice(0), function (obj) {\n                return parseInt(obj, 10);\n            });\n            configFromArray(config);\n        } else if (isObject(input)) {\n            configFromObject(config);\n        } else if (isNumber(input)) {\n            // from milliseconds\n            config._d = new Date(input);\n        } else {\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    function createLocalOrUTC(input, format, locale, strict, isUTC) {\n        var c = {};\n\n        if (format === true || format === false) {\n            strict = format;\n            format = undefined;\n        }\n\n        if (locale === true || locale === false) {\n            strict = locale;\n            locale = undefined;\n        }\n\n        if (\n            (isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)\n        ) {\n            input = undefined;\n        }\n        // object construction must be done this way.\n        // https://github.com/moment/moment/issues/1423\n        c._isAMomentObject = true;\n        c._useUTC = c._isUTC = isUTC;\n        c._l = locale;\n        c._i = input;\n        c._f = format;\n        c._strict = strict;\n\n        return createFromConfig(c);\n    }\n\n    function createLocal(input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, false);\n    }\n\n    var prototypeMin = deprecate(\n            'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n            function () {\n                var other = createLocal.apply(null, arguments);\n                if (this.isValid() && other.isValid()) {\n                    return other < this ? this : other;\n                } else {\n                    return createInvalid();\n                }\n            }\n        ),\n        prototypeMax = deprecate(\n            'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n            function () {\n                var other = createLocal.apply(null, arguments);\n                if (this.isValid() && other.isValid()) {\n                    return other > this ? this : other;\n                } else {\n                    return createInvalid();\n                }\n            }\n        );\n\n    // Pick a moment m from moments so that m[fn](other) is true for all\n    // other. This relies on the function fn to be transitive.\n    //\n    // moments should either be an array of moment objects or an array, whose\n    // first element is an array of moment objects.\n    function pickBy(fn, moments) {\n        var res, i;\n        if (moments.length === 1 && isArray(moments[0])) {\n            moments = moments[0];\n        }\n        if (!moments.length) {\n            return createLocal();\n        }\n        res = moments[0];\n        for (i = 1; i < moments.length; ++i) {\n            if (!moments[i].isValid() || moments[i][fn](res)) {\n                res = moments[i];\n            }\n        }\n        return res;\n    }\n\n    // TODO: Use [].sort instead?\n    function min() {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isBefore', args);\n    }\n\n    function max() {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isAfter', args);\n    }\n\n    var now = function () {\n        return Date.now ? Date.now() : +new Date();\n    };\n\n    var ordering = [\n        'year',\n        'quarter',\n        'month',\n        'week',\n        'day',\n        'hour',\n        'minute',\n        'second',\n        'millisecond',\n    ];\n\n    function isDurationValid(m) {\n        var key,\n            unitHasDecimal = false,\n            i,\n            orderLen = ordering.length;\n        for (key in m) {\n            if (\n                hasOwnProp(m, key) &&\n                !(\n                    indexOf.call(ordering, key) !== -1 &&\n                    (m[key] == null || !isNaN(m[key]))\n                )\n            ) {\n                return false;\n            }\n        }\n\n        for (i = 0; i < orderLen; ++i) {\n            if (m[ordering[i]]) {\n                if (unitHasDecimal) {\n                    return false; // only allow non-integers for smallest unit\n                }\n                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                    unitHasDecimal = true;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    function isValid$1() {\n        return this._isValid;\n    }\n\n    function createInvalid$1() {\n        return createDuration(NaN);\n    }\n\n    function Duration(duration) {\n        var normalizedInput = normalizeObjectUnits(duration),\n            years = normalizedInput.year || 0,\n            quarters = normalizedInput.quarter || 0,\n            months = normalizedInput.month || 0,\n            weeks = normalizedInput.week || normalizedInput.isoWeek || 0,\n            days = normalizedInput.day || 0,\n            hours = normalizedInput.hour || 0,\n            minutes = normalizedInput.minute || 0,\n            seconds = normalizedInput.second || 0,\n            milliseconds = normalizedInput.millisecond || 0;\n\n        this._isValid = isDurationValid(normalizedInput);\n\n        // representation for dateAddRemove\n        this._milliseconds =\n            +milliseconds +\n            seconds * 1e3 + // 1000\n            minutes * 6e4 + // 1000 * 60\n            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n        // Because of dateAddRemove treats 24 hours as different from a\n        // day when working around DST, we need to store them separately\n        this._days = +days + weeks * 7;\n        // It is impossible to translate months into days without knowing\n        // which months you are are talking about, so we have to store\n        // it separately.\n        this._months = +months + quarters * 3 + years * 12;\n\n        this._data = {};\n\n        this._locale = getLocale();\n\n        this._bubble();\n    }\n\n    function isDuration(obj) {\n        return obj instanceof Duration;\n    }\n\n    function absRound(number) {\n        if (number < 0) {\n            return Math.round(-1 * number) * -1;\n        } else {\n            return Math.round(number);\n        }\n    }\n\n    // compare two arrays, return the number of differences\n    function compareArrays(array1, array2, dontConvert) {\n        var len = Math.min(array1.length, array2.length),\n            lengthDiff = Math.abs(array1.length - array2.length),\n            diffs = 0,\n            i;\n        for (i = 0; i < len; i++) {\n            if (\n                (dontConvert && array1[i] !== array2[i]) ||\n                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))\n            ) {\n                diffs++;\n            }\n        }\n        return diffs + lengthDiff;\n    }\n\n    // FORMATTING\n\n    function offset(token, separator) {\n        addFormatToken(token, 0, 0, function () {\n            var offset = this.utcOffset(),\n                sign = '+';\n            if (offset < 0) {\n                offset = -offset;\n                sign = '-';\n            }\n            return (\n                sign +\n                zeroFill(~~(offset / 60), 2) +\n                separator +\n                zeroFill(~~offset % 60, 2)\n            );\n        });\n    }\n\n    offset('Z', ':');\n    offset('ZZ', '');\n\n    // PARSING\n\n    addRegexToken('Z', matchShortOffset);\n    addRegexToken('ZZ', matchShortOffset);\n    addParseToken(['Z', 'ZZ'], function (input, array, config) {\n        config._useUTC = true;\n        config._tzm = offsetFromString(matchShortOffset, input);\n    });\n\n    // HELPERS\n\n    // timezone chunker\n    // '+10:00' > ['10',  '00']\n    // '-1530'  > ['-15', '30']\n    var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n    function offsetFromString(matcher, string) {\n        var matches = (string || '').match(matcher),\n            chunk,\n            parts,\n            minutes;\n\n        if (matches === null) {\n            return null;\n        }\n\n        chunk = matches[matches.length - 1] || [];\n        parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n        minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n        return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;\n    }\n\n    // Return a moment from input, that is local/utc/zone equivalent to model.\n    function cloneWithOffset(input, model) {\n        var res, diff;\n        if (model._isUTC) {\n            res = model.clone();\n            diff =\n                (isMoment(input) || isDate(input)\n                    ? input.valueOf()\n                    : createLocal(input).valueOf()) - res.valueOf();\n            // Use low-level api, because this fn is low-level api.\n            res._d.setTime(res._d.valueOf() + diff);\n            hooks.updateOffset(res, false);\n            return res;\n        } else {\n            return createLocal(input).local();\n        }\n    }\n\n    function getDateOffset(m) {\n        // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n        // https://github.com/moment/moment/pull/1871\n        return -Math.round(m._d.getTimezoneOffset());\n    }\n\n    // HOOKS\n\n    // This function will be called whenever a moment is mutated.\n    // It is intended to keep the offset in sync with the timezone.\n    hooks.updateOffset = function () {};\n\n    // MOMENTS\n\n    // keepLocalTime = true means only change the timezone, without\n    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n    // +0200, so we adjust the time as needed, to be valid.\n    //\n    // Keeping the time actually adds/subtracts (one hour)\n    // from the actual represented time. That is why we call updateOffset\n    // a second time. In case it wants us to change the offset again\n    // _changeInProgress == true case, then we have to adjust, because\n    // there is no such time in the given timezone.\n    function getSetOffset(input, keepLocalTime, keepMinutes) {\n        var offset = this._offset || 0,\n            localAdjust;\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        if (input != null) {\n            if (typeof input === 'string') {\n                input = offsetFromString(matchShortOffset, input);\n                if (input === null) {\n                    return this;\n                }\n            } else if (Math.abs(input) < 16 && !keepMinutes) {\n                input = input * 60;\n            }\n            if (!this._isUTC && keepLocalTime) {\n                localAdjust = getDateOffset(this);\n            }\n            this._offset = input;\n            this._isUTC = true;\n            if (localAdjust != null) {\n                this.add(localAdjust, 'm');\n            }\n            if (offset !== input) {\n                if (!keepLocalTime || this._changeInProgress) {\n                    addSubtract(\n                        this,\n                        createDuration(input - offset, 'm'),\n                        1,\n                        false\n                    );\n                } else if (!this._changeInProgress) {\n                    this._changeInProgress = true;\n                    hooks.updateOffset(this, true);\n                    this._changeInProgress = null;\n                }\n            }\n            return this;\n        } else {\n            return this._isUTC ? offset : getDateOffset(this);\n        }\n    }\n\n    function getSetZone(input, keepLocalTime) {\n        if (input != null) {\n            if (typeof input !== 'string') {\n                input = -input;\n            }\n\n            this.utcOffset(input, keepLocalTime);\n\n            return this;\n        } else {\n            return -this.utcOffset();\n        }\n    }\n\n    function setOffsetToUTC(keepLocalTime) {\n        return this.utcOffset(0, keepLocalTime);\n    }\n\n    function setOffsetToLocal(keepLocalTime) {\n        if (this._isUTC) {\n            this.utcOffset(0, keepLocalTime);\n            this._isUTC = false;\n\n            if (keepLocalTime) {\n                this.subtract(getDateOffset(this), 'm');\n            }\n        }\n        return this;\n    }\n\n    function setOffsetToParsedOffset() {\n        if (this._tzm != null) {\n            this.utcOffset(this._tzm, false, true);\n        } else if (typeof this._i === 'string') {\n            var tZone = offsetFromString(matchOffset, this._i);\n            if (tZone != null) {\n                this.utcOffset(tZone);\n            } else {\n                this.utcOffset(0, true);\n            }\n        }\n        return this;\n    }\n\n    function hasAlignedHourOffset(input) {\n        if (!this.isValid()) {\n            return false;\n        }\n        input = input ? createLocal(input).utcOffset() : 0;\n\n        return (this.utcOffset() - input) % 60 === 0;\n    }\n\n    function isDaylightSavingTime() {\n        return (\n            this.utcOffset() > this.clone().month(0).utcOffset() ||\n            this.utcOffset() > this.clone().month(5).utcOffset()\n        );\n    }\n\n    function isDaylightSavingTimeShifted() {\n        if (!isUndefined(this._isDSTShifted)) {\n            return this._isDSTShifted;\n        }\n\n        var c = {},\n            other;\n\n        copyConfig(c, this);\n        c = prepareConfig(c);\n\n        if (c._a) {\n            other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n            this._isDSTShifted =\n                this.isValid() && compareArrays(c._a, other.toArray()) > 0;\n        } else {\n            this._isDSTShifted = false;\n        }\n\n        return this._isDSTShifted;\n    }\n\n    function isLocal() {\n        return this.isValid() ? !this._isUTC : false;\n    }\n\n    function isUtcOffset() {\n        return this.isValid() ? this._isUTC : false;\n    }\n\n    function isUtc() {\n        return this.isValid() ? this._isUTC && this._offset === 0 : false;\n    }\n\n    // ASP.NET json date format regex\n    var aspNetRegex = /^(-|\\+)?(?:(\\d*)[. ])?(\\d+):(\\d+)(?::(\\d+)(\\.\\d*)?)?$/,\n        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n        // and further modified to allow for strings containing both week and day\n        isoRegex =\n            /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n    function createDuration(input, key) {\n        var duration = input,\n            // matching against regexp is expensive, do it on demand\n            match = null,\n            sign,\n            ret,\n            diffRes;\n\n        if (isDuration(input)) {\n            duration = {\n                ms: input._milliseconds,\n                d: input._days,\n                M: input._months,\n            };\n        } else if (isNumber(input) || !isNaN(+input)) {\n            duration = {};\n            if (key) {\n                duration[key] = +input;\n            } else {\n                duration.milliseconds = +input;\n            }\n        } else if ((match = aspNetRegex.exec(input))) {\n            sign = match[1] === '-' ? -1 : 1;\n            duration = {\n                y: 0,\n                d: toInt(match[DATE]) * sign,\n                h: toInt(match[HOUR]) * sign,\n                m: toInt(match[MINUTE]) * sign,\n                s: toInt(match[SECOND]) * sign,\n                ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match\n            };\n        } else if ((match = isoRegex.exec(input))) {\n            sign = match[1] === '-' ? -1 : 1;\n            duration = {\n                y: parseIso(match[2], sign),\n                M: parseIso(match[3], sign),\n                w: parseIso(match[4], sign),\n                d: parseIso(match[5], sign),\n                h: parseIso(match[6], sign),\n                m: parseIso(match[7], sign),\n                s: parseIso(match[8], sign),\n            };\n        } else if (duration == null) {\n            // checks for null or undefined\n            duration = {};\n        } else if (\n            typeof duration === 'object' &&\n            ('from' in duration || 'to' in duration)\n        ) {\n            diffRes = momentsDifference(\n                createLocal(duration.from),\n                createLocal(duration.to)\n            );\n\n            duration = {};\n            duration.ms = diffRes.milliseconds;\n            duration.M = diffRes.months;\n        }\n\n        ret = new Duration(duration);\n\n        if (isDuration(input) && hasOwnProp(input, '_locale')) {\n            ret._locale = input._locale;\n        }\n\n        if (isDuration(input) && hasOwnProp(input, '_isValid')) {\n            ret._isValid = input._isValid;\n        }\n\n        return ret;\n    }\n\n    createDuration.fn = Duration.prototype;\n    createDuration.invalid = createInvalid$1;\n\n    function parseIso(inp, sign) {\n        // We'd normally use ~~inp for this, but unfortunately it also\n        // converts floats to ints.\n        // inp may be undefined, so careful calling replace on it.\n        var res = inp && parseFloat(inp.replace(',', '.'));\n        // apply sign while we're at it\n        return (isNaN(res) ? 0 : res) * sign;\n    }\n\n    function positiveMomentsDifference(base, other) {\n        var res = {};\n\n        res.months =\n            other.month() - base.month() + (other.year() - base.year()) * 12;\n        if (base.clone().add(res.months, 'M').isAfter(other)) {\n            --res.months;\n        }\n\n        res.milliseconds = +other - +base.clone().add(res.months, 'M');\n\n        return res;\n    }\n\n    function momentsDifference(base, other) {\n        var res;\n        if (!(base.isValid() && other.isValid())) {\n            return { milliseconds: 0, months: 0 };\n        }\n\n        other = cloneWithOffset(other, base);\n        if (base.isBefore(other)) {\n            res = positiveMomentsDifference(base, other);\n        } else {\n            res = positiveMomentsDifference(other, base);\n            res.milliseconds = -res.milliseconds;\n            res.months = -res.months;\n        }\n\n        return res;\n    }\n\n    // TODO: remove 'name' arg after deprecation is removed\n    function createAdder(direction, name) {\n        return function (val, period) {\n            var dur, tmp;\n            //invert the arguments, but complain about it\n            if (period !== null && !isNaN(+period)) {\n                deprecateSimple(\n                    name,\n                    'moment().' +\n                        name +\n                        '(period, number) is deprecated. Please use moment().' +\n                        name +\n                        '(number, period). ' +\n                        'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'\n                );\n                tmp = val;\n                val = period;\n                period = tmp;\n            }\n\n            dur = createDuration(val, period);\n            addSubtract(this, dur, direction);\n            return this;\n        };\n    }\n\n    function addSubtract(mom, duration, isAdding, updateOffset) {\n        var milliseconds = duration._milliseconds,\n            days = absRound(duration._days),\n            months = absRound(duration._months);\n\n        if (!mom.isValid()) {\n            // No op\n            return;\n        }\n\n        updateOffset = updateOffset == null ? true : updateOffset;\n\n        if (months) {\n            setMonth(mom, get(mom, 'Month') + months * isAdding);\n        }\n        if (days) {\n            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n        }\n        if (milliseconds) {\n            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n        }\n        if (updateOffset) {\n            hooks.updateOffset(mom, days || months);\n        }\n    }\n\n    var add = createAdder(1, 'add'),\n        subtract = createAdder(-1, 'subtract');\n\n    function isString(input) {\n        return typeof input === 'string' || input instanceof String;\n    }\n\n    // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined\n    function isMomentInput(input) {\n        return (\n            isMoment(input) ||\n            isDate(input) ||\n            isString(input) ||\n            isNumber(input) ||\n            isNumberOrStringArray(input) ||\n            isMomentInputObject(input) ||\n            input === null ||\n            input === undefined\n        );\n    }\n\n    function isMomentInputObject(input) {\n        var objectTest = isObject(input) && !isObjectEmpty(input),\n            propertyTest = false,\n            properties = [\n                'years',\n                'year',\n                'y',\n                'months',\n                'month',\n                'M',\n                'days',\n                'day',\n                'd',\n                'dates',\n                'date',\n                'D',\n                'hours',\n                'hour',\n                'h',\n                'minutes',\n                'minute',\n                'm',\n                'seconds',\n                'second',\n                's',\n                'milliseconds',\n                'millisecond',\n                'ms',\n            ],\n            i,\n            property,\n            propertyLen = properties.length;\n\n        for (i = 0; i < propertyLen; i += 1) {\n            property = properties[i];\n            propertyTest = propertyTest || hasOwnProp(input, property);\n        }\n\n        return objectTest && propertyTest;\n    }\n\n    function isNumberOrStringArray(input) {\n        var arrayTest = isArray(input),\n            dataTypeTest = false;\n        if (arrayTest) {\n            dataTypeTest =\n                input.filter(function (item) {\n                    return !isNumber(item) && isString(input);\n                }).length === 0;\n        }\n        return arrayTest && dataTypeTest;\n    }\n\n    function isCalendarSpec(input) {\n        var objectTest = isObject(input) && !isObjectEmpty(input),\n            propertyTest = false,\n            properties = [\n                'sameDay',\n                'nextDay',\n                'lastDay',\n                'nextWeek',\n                'lastWeek',\n                'sameElse',\n            ],\n            i,\n            property;\n\n        for (i = 0; i < properties.length; i += 1) {\n            property = properties[i];\n            propertyTest = propertyTest || hasOwnProp(input, property);\n        }\n\n        return objectTest && propertyTest;\n    }\n\n    function getCalendarFormat(myMoment, now) {\n        var diff = myMoment.diff(now, 'days', true);\n        return diff < -6\n            ? 'sameElse'\n            : diff < -1\n              ? 'lastWeek'\n              : diff < 0\n                ? 'lastDay'\n                : diff < 1\n                  ? 'sameDay'\n                  : diff < 2\n                    ? 'nextDay'\n                    : diff < 7\n                      ? 'nextWeek'\n                      : 'sameElse';\n    }\n\n    function calendar$1(time, formats) {\n        // Support for single parameter, formats only overload to the calendar function\n        if (arguments.length === 1) {\n            if (!arguments[0]) {\n                time = undefined;\n                formats = undefined;\n            } else if (isMomentInput(arguments[0])) {\n                time = arguments[0];\n                formats = undefined;\n            } else if (isCalendarSpec(arguments[0])) {\n                formats = arguments[0];\n                time = undefined;\n            }\n        }\n        // We want to compare the start of today, vs this.\n        // Getting start-of-today depends on whether we're local/utc/offset or not.\n        var now = time || createLocal(),\n            sod = cloneWithOffset(now, this).startOf('day'),\n            format = hooks.calendarFormat(this, sod) || 'sameElse',\n            output =\n                formats &&\n                (isFunction(formats[format])\n                    ? formats[format].call(this, now)\n                    : formats[format]);\n\n        return this.format(\n            output || this.localeData().calendar(format, this, createLocal(now))\n        );\n    }\n\n    function clone() {\n        return new Moment(this);\n    }\n\n    function isAfter(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() > localInput.valueOf();\n        } else {\n            return localInput.valueOf() < this.clone().startOf(units).valueOf();\n        }\n    }\n\n    function isBefore(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() < localInput.valueOf();\n        } else {\n            return this.clone().endOf(units).valueOf() < localInput.valueOf();\n        }\n    }\n\n    function isBetween(from, to, units, inclusivity) {\n        var localFrom = isMoment(from) ? from : createLocal(from),\n            localTo = isMoment(to) ? to : createLocal(to);\n        if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {\n            return false;\n        }\n        inclusivity = inclusivity || '()';\n        return (\n            (inclusivity[0] === '('\n                ? this.isAfter(localFrom, units)\n                : !this.isBefore(localFrom, units)) &&\n            (inclusivity[1] === ')'\n                ? this.isBefore(localTo, units)\n                : !this.isAfter(localTo, units))\n        );\n    }\n\n    function isSame(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input),\n            inputMs;\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() === localInput.valueOf();\n        } else {\n            inputMs = localInput.valueOf();\n            return (\n                this.clone().startOf(units).valueOf() <= inputMs &&\n                inputMs <= this.clone().endOf(units).valueOf()\n            );\n        }\n    }\n\n    function isSameOrAfter(input, units) {\n        return this.isSame(input, units) || this.isAfter(input, units);\n    }\n\n    function isSameOrBefore(input, units) {\n        return this.isSame(input, units) || this.isBefore(input, units);\n    }\n\n    function diff(input, units, asFloat) {\n        var that, zoneDelta, output;\n\n        if (!this.isValid()) {\n            return NaN;\n        }\n\n        that = cloneWithOffset(input, this);\n\n        if (!that.isValid()) {\n            return NaN;\n        }\n\n        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n        units = normalizeUnits(units);\n\n        switch (units) {\n            case 'year':\n                output = monthDiff(this, that) / 12;\n                break;\n            case 'month':\n                output = monthDiff(this, that);\n                break;\n            case 'quarter':\n                output = monthDiff(this, that) / 3;\n                break;\n            case 'second':\n                output = (this - that) / 1e3;\n                break; // 1000\n            case 'minute':\n                output = (this - that) / 6e4;\n                break; // 1000 * 60\n            case 'hour':\n                output = (this - that) / 36e5;\n                break; // 1000 * 60 * 60\n            case 'day':\n                output = (this - that - zoneDelta) / 864e5;\n                break; // 1000 * 60 * 60 * 24, negate dst\n            case 'week':\n                output = (this - that - zoneDelta) / 6048e5;\n                break; // 1000 * 60 * 60 * 24 * 7, negate dst\n            default:\n                output = this - that;\n        }\n\n        return asFloat ? output : absFloor(output);\n    }\n\n    function monthDiff(a, b) {\n        if (a.date() < b.date()) {\n            // end-of-month calculations work correct when the start month has more\n            // days than the end month.\n            return -monthDiff(b, a);\n        }\n        // difference in months\n        var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),\n            // b is in (anchor - 1 month, anchor + 1 month)\n            anchor = a.clone().add(wholeMonthDiff, 'months'),\n            anchor2,\n            adjust;\n\n        if (b - anchor < 0) {\n            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor - anchor2);\n        } else {\n            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor2 - anchor);\n        }\n\n        //check for negative zero, return zero if negative zero\n        return -(wholeMonthDiff + adjust) || 0;\n    }\n\n    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n    function toString() {\n        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n    }\n\n    function toISOString(keepOffset) {\n        if (!this.isValid()) {\n            return null;\n        }\n        var utc = keepOffset !== true,\n            m = utc ? this.clone().utc() : this;\n        if (m.year() < 0 || m.year() > 9999) {\n            return formatMoment(\n                m,\n                utc\n                    ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'\n                    : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'\n            );\n        }\n        if (isFunction(Date.prototype.toISOString)) {\n            // native implementation is ~50x faster, use it when we can\n            if (utc) {\n                return this.toDate().toISOString();\n            } else {\n                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)\n                    .toISOString()\n                    .replace('Z', formatMoment(m, 'Z'));\n            }\n        }\n        return formatMoment(\n            m,\n            utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'\n        );\n    }\n\n    /**\n     * Return a human readable representation of a moment that can\n     * also be evaluated to get a new moment which is the same\n     *\n     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n     */\n    function inspect() {\n        if (!this.isValid()) {\n            return 'moment.invalid(/* ' + this._i + ' */)';\n        }\n        var func = 'moment',\n            zone = '',\n            prefix,\n            year,\n            datetime,\n            suffix;\n        if (!this.isLocal()) {\n            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n            zone = 'Z';\n        }\n        prefix = '[' + func + '(\"]';\n        year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';\n        datetime = '-MM-DD[T]HH:mm:ss.SSS';\n        suffix = zone + '[\")]';\n\n        return this.format(prefix + year + datetime + suffix);\n    }\n\n    function format(inputString) {\n        if (!inputString) {\n            inputString = this.isUtc()\n                ? hooks.defaultFormatUtc\n                : hooks.defaultFormat;\n        }\n        var output = formatMoment(this, inputString);\n        return this.localeData().postformat(output);\n    }\n\n    function from(time, withoutSuffix) {\n        if (\n            this.isValid() &&\n            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n        ) {\n            return createDuration({ to: this, from: time })\n                .locale(this.locale())\n                .humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function fromNow(withoutSuffix) {\n        return this.from(createLocal(), withoutSuffix);\n    }\n\n    function to(time, withoutSuffix) {\n        if (\n            this.isValid() &&\n            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n        ) {\n            return createDuration({ from: this, to: time })\n                .locale(this.locale())\n                .humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function toNow(withoutSuffix) {\n        return this.to(createLocal(), withoutSuffix);\n    }\n\n    // If passed a locale key, it will set the locale for this\n    // instance.  Otherwise, it will return the locale configuration\n    // variables for this instance.\n    function locale(key) {\n        var newLocaleData;\n\n        if (key === undefined) {\n            return this._locale._abbr;\n        } else {\n            newLocaleData = getLocale(key);\n            if (newLocaleData != null) {\n                this._locale = newLocaleData;\n            }\n            return this;\n        }\n    }\n\n    var lang = deprecate(\n        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n        function (key) {\n            if (key === undefined) {\n                return this.localeData();\n            } else {\n                return this.locale(key);\n            }\n        }\n    );\n\n    function localeData() {\n        return this._locale;\n    }\n\n    var MS_PER_SECOND = 1000,\n        MS_PER_MINUTE = 60 * MS_PER_SECOND,\n        MS_PER_HOUR = 60 * MS_PER_MINUTE,\n        MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;\n\n    // actual modulo - handles negative numbers (for dates before 1970):\n    function mod$1(dividend, divisor) {\n        return ((dividend % divisor) + divisor) % divisor;\n    }\n\n    function localStartOfDate(y, m, d) {\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            return new Date(y + 400, m, d) - MS_PER_400_YEARS;\n        } else {\n            return new Date(y, m, d).valueOf();\n        }\n    }\n\n    function utcStartOfDate(y, m, d) {\n        // Date.UTC remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;\n        } else {\n            return Date.UTC(y, m, d);\n        }\n    }\n\n    function startOf(units) {\n        var time, startOfDate;\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond' || !this.isValid()) {\n            return this;\n        }\n\n        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n        switch (units) {\n            case 'year':\n                time = startOfDate(this.year(), 0, 1);\n                break;\n            case 'quarter':\n                time = startOfDate(\n                    this.year(),\n                    this.month() - (this.month() % 3),\n                    1\n                );\n                break;\n            case 'month':\n                time = startOfDate(this.year(), this.month(), 1);\n                break;\n            case 'week':\n                time = startOfDate(\n                    this.year(),\n                    this.month(),\n                    this.date() - this.weekday()\n                );\n                break;\n            case 'isoWeek':\n                time = startOfDate(\n                    this.year(),\n                    this.month(),\n                    this.date() - (this.isoWeekday() - 1)\n                );\n                break;\n            case 'day':\n            case 'date':\n                time = startOfDate(this.year(), this.month(), this.date());\n                break;\n            case 'hour':\n                time = this._d.valueOf();\n                time -= mod$1(\n                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n                    MS_PER_HOUR\n                );\n                break;\n            case 'minute':\n                time = this._d.valueOf();\n                time -= mod$1(time, MS_PER_MINUTE);\n                break;\n            case 'second':\n                time = this._d.valueOf();\n                time -= mod$1(time, MS_PER_SECOND);\n                break;\n        }\n\n        this._d.setTime(time);\n        hooks.updateOffset(this, true);\n        return this;\n    }\n\n    function endOf(units) {\n        var time, startOfDate;\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond' || !this.isValid()) {\n            return this;\n        }\n\n        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n        switch (units) {\n            case 'year':\n                time = startOfDate(this.year() + 1, 0, 1) - 1;\n                break;\n            case 'quarter':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month() - (this.month() % 3) + 3,\n                        1\n                    ) - 1;\n                break;\n            case 'month':\n                time = startOfDate(this.year(), this.month() + 1, 1) - 1;\n                break;\n            case 'week':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month(),\n                        this.date() - this.weekday() + 7\n                    ) - 1;\n                break;\n            case 'isoWeek':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month(),\n                        this.date() - (this.isoWeekday() - 1) + 7\n                    ) - 1;\n                break;\n            case 'day':\n            case 'date':\n                time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;\n                break;\n            case 'hour':\n                time = this._d.valueOf();\n                time +=\n                    MS_PER_HOUR -\n                    mod$1(\n                        time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n                        MS_PER_HOUR\n                    ) -\n                    1;\n                break;\n            case 'minute':\n                time = this._d.valueOf();\n                time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;\n                break;\n            case 'second':\n                time = this._d.valueOf();\n                time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;\n                break;\n        }\n\n        this._d.setTime(time);\n        hooks.updateOffset(this, true);\n        return this;\n    }\n\n    function valueOf() {\n        return this._d.valueOf() - (this._offset || 0) * 60000;\n    }\n\n    function unix() {\n        return Math.floor(this.valueOf() / 1000);\n    }\n\n    function toDate() {\n        return new Date(this.valueOf());\n    }\n\n    function toArray() {\n        var m = this;\n        return [\n            m.year(),\n            m.month(),\n            m.date(),\n            m.hour(),\n            m.minute(),\n            m.second(),\n            m.millisecond(),\n        ];\n    }\n\n    function toObject() {\n        var m = this;\n        return {\n            years: m.year(),\n            months: m.month(),\n            date: m.date(),\n            hours: m.hours(),\n            minutes: m.minutes(),\n            seconds: m.seconds(),\n            milliseconds: m.milliseconds(),\n        };\n    }\n\n    function toJSON() {\n        // new Date(NaN).toJSON() === null\n        return this.isValid() ? this.toISOString() : null;\n    }\n\n    function isValid$2() {\n        return isValid(this);\n    }\n\n    function parsingFlags() {\n        return extend({}, getParsingFlags(this));\n    }\n\n    function invalidAt() {\n        return getParsingFlags(this).overflow;\n    }\n\n    function creationData() {\n        return {\n            input: this._i,\n            format: this._f,\n            locale: this._locale,\n            isUTC: this._isUTC,\n            strict: this._strict,\n        };\n    }\n\n    addFormatToken('N', 0, 0, 'eraAbbr');\n    addFormatToken('NN', 0, 0, 'eraAbbr');\n    addFormatToken('NNN', 0, 0, 'eraAbbr');\n    addFormatToken('NNNN', 0, 0, 'eraName');\n    addFormatToken('NNNNN', 0, 0, 'eraNarrow');\n\n    addFormatToken('y', ['y', 1], 'yo', 'eraYear');\n    addFormatToken('y', ['yy', 2], 0, 'eraYear');\n    addFormatToken('y', ['yyy', 3], 0, 'eraYear');\n    addFormatToken('y', ['yyyy', 4], 0, 'eraYear');\n\n    addRegexToken('N', matchEraAbbr);\n    addRegexToken('NN', matchEraAbbr);\n    addRegexToken('NNN', matchEraAbbr);\n    addRegexToken('NNNN', matchEraName);\n    addRegexToken('NNNNN', matchEraNarrow);\n\n    addParseToken(\n        ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],\n        function (input, array, config, token) {\n            var era = config._locale.erasParse(input, token, config._strict);\n            if (era) {\n                getParsingFlags(config).era = era;\n            } else {\n                getParsingFlags(config).invalidEra = input;\n            }\n        }\n    );\n\n    addRegexToken('y', matchUnsigned);\n    addRegexToken('yy', matchUnsigned);\n    addRegexToken('yyy', matchUnsigned);\n    addRegexToken('yyyy', matchUnsigned);\n    addRegexToken('yo', matchEraYearOrdinal);\n\n    addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);\n    addParseToken(['yo'], function (input, array, config, token) {\n        var match;\n        if (config._locale._eraYearOrdinalRegex) {\n            match = input.match(config._locale._eraYearOrdinalRegex);\n        }\n\n        if (config._locale.eraYearOrdinalParse) {\n            array[YEAR] = config._locale.eraYearOrdinalParse(input, match);\n        } else {\n            array[YEAR] = parseInt(input, 10);\n        }\n    });\n\n    function localeEras(m, format) {\n        var i,\n            l,\n            date,\n            eras = this._eras || getLocale('en')._eras;\n        for (i = 0, l = eras.length; i < l; ++i) {\n            switch (typeof eras[i].since) {\n                case 'string':\n                    // truncate time\n                    date = hooks(eras[i].since).startOf('day');\n                    eras[i].since = date.valueOf();\n                    break;\n            }\n\n            switch (typeof eras[i].until) {\n                case 'undefined':\n                    eras[i].until = +Infinity;\n                    break;\n                case 'string':\n                    // truncate time\n                    date = hooks(eras[i].until).startOf('day').valueOf();\n                    eras[i].until = date.valueOf();\n                    break;\n            }\n        }\n        return eras;\n    }\n\n    function localeErasParse(eraName, format, strict) {\n        var i,\n            l,\n            eras = this.eras(),\n            name,\n            abbr,\n            narrow;\n        eraName = eraName.toUpperCase();\n\n        for (i = 0, l = eras.length; i < l; ++i) {\n            name = eras[i].name.toUpperCase();\n            abbr = eras[i].abbr.toUpperCase();\n            narrow = eras[i].narrow.toUpperCase();\n\n            if (strict) {\n                switch (format) {\n                    case 'N':\n                    case 'NN':\n                    case 'NNN':\n                        if (abbr === eraName) {\n                            return eras[i];\n                        }\n                        break;\n\n                    case 'NNNN':\n                        if (name === eraName) {\n                            return eras[i];\n                        }\n                        break;\n\n                    case 'NNNNN':\n                        if (narrow === eraName) {\n                            return eras[i];\n                        }\n                        break;\n                }\n            } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {\n                return eras[i];\n            }\n        }\n    }\n\n    function localeErasConvertYear(era, year) {\n        var dir = era.since <= era.until ? +1 : -1;\n        if (year === undefined) {\n            return hooks(era.since).year();\n        } else {\n            return hooks(era.since).year() + (year - era.offset) * dir;\n        }\n    }\n\n    function getEraName() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].name;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].name;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraNarrow() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].narrow;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].narrow;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraAbbr() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].abbr;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].abbr;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraYear() {\n        var i,\n            l,\n            dir,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            dir = eras[i].since <= eras[i].until ? +1 : -1;\n\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (\n                (eras[i].since <= val && val <= eras[i].until) ||\n                (eras[i].until <= val && val <= eras[i].since)\n            ) {\n                return (\n                    (this.year() - hooks(eras[i].since).year()) * dir +\n                    eras[i].offset\n                );\n            }\n        }\n\n        return this.year();\n    }\n\n    function erasNameRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasNameRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasNameRegex : this._erasRegex;\n    }\n\n    function erasAbbrRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasAbbrRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasAbbrRegex : this._erasRegex;\n    }\n\n    function erasNarrowRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasNarrowRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasNarrowRegex : this._erasRegex;\n    }\n\n    function matchEraAbbr(isStrict, locale) {\n        return locale.erasAbbrRegex(isStrict);\n    }\n\n    function matchEraName(isStrict, locale) {\n        return locale.erasNameRegex(isStrict);\n    }\n\n    function matchEraNarrow(isStrict, locale) {\n        return locale.erasNarrowRegex(isStrict);\n    }\n\n    function matchEraYearOrdinal(isStrict, locale) {\n        return locale._eraYearOrdinalRegex || matchUnsigned;\n    }\n\n    function computeErasParse() {\n        var abbrPieces = [],\n            namePieces = [],\n            narrowPieces = [],\n            mixedPieces = [],\n            i,\n            l,\n            erasName,\n            erasAbbr,\n            erasNarrow,\n            eras = this.eras();\n\n        for (i = 0, l = eras.length; i < l; ++i) {\n            erasName = regexEscape(eras[i].name);\n            erasAbbr = regexEscape(eras[i].abbr);\n            erasNarrow = regexEscape(eras[i].narrow);\n\n            namePieces.push(erasName);\n            abbrPieces.push(erasAbbr);\n            narrowPieces.push(erasNarrow);\n            mixedPieces.push(erasName);\n            mixedPieces.push(erasAbbr);\n            mixedPieces.push(erasNarrow);\n        }\n\n        this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');\n        this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');\n        this._erasNarrowRegex = new RegExp(\n            '^(' + narrowPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    addFormatToken(0, ['gg', 2], 0, function () {\n        return this.weekYear() % 100;\n    });\n\n    addFormatToken(0, ['GG', 2], 0, function () {\n        return this.isoWeekYear() % 100;\n    });\n\n    function addWeekYearFormatToken(token, getter) {\n        addFormatToken(0, [token, token.length], 0, getter);\n    }\n\n    addWeekYearFormatToken('gggg', 'weekYear');\n    addWeekYearFormatToken('ggggg', 'weekYear');\n    addWeekYearFormatToken('GGGG', 'isoWeekYear');\n    addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n    // ALIASES\n\n    // PARSING\n\n    addRegexToken('G', matchSigned);\n    addRegexToken('g', matchSigned);\n    addRegexToken('GG', match1to2, match2);\n    addRegexToken('gg', match1to2, match2);\n    addRegexToken('GGGG', match1to4, match4);\n    addRegexToken('gggg', match1to4, match4);\n    addRegexToken('GGGGG', match1to6, match6);\n    addRegexToken('ggggg', match1to6, match6);\n\n    addWeekParseToken(\n        ['gggg', 'ggggg', 'GGGG', 'GGGGG'],\n        function (input, week, config, token) {\n            week[token.substr(0, 2)] = toInt(input);\n        }\n    );\n\n    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n        week[token] = hooks.parseTwoDigitYear(input);\n    });\n\n    // MOMENTS\n\n    function getSetWeekYear(input) {\n        return getSetWeekYearHelper.call(\n            this,\n            input,\n            this.week(),\n            this.weekday() + this.localeData()._week.dow,\n            this.localeData()._week.dow,\n            this.localeData()._week.doy\n        );\n    }\n\n    function getSetISOWeekYear(input) {\n        return getSetWeekYearHelper.call(\n            this,\n            input,\n            this.isoWeek(),\n            this.isoWeekday(),\n            1,\n            4\n        );\n    }\n\n    function getISOWeeksInYear() {\n        return weeksInYear(this.year(), 1, 4);\n    }\n\n    function getISOWeeksInISOWeekYear() {\n        return weeksInYear(this.isoWeekYear(), 1, 4);\n    }\n\n    function getWeeksInYear() {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getWeeksInWeekYear() {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n        var weeksTarget;\n        if (input == null) {\n            return weekOfYear(this, dow, doy).year;\n        } else {\n            weeksTarget = weeksInYear(input, dow, doy);\n            if (week > weeksTarget) {\n                week = weeksTarget;\n            }\n            return setWeekAll.call(this, input, week, weekday, dow, doy);\n        }\n    }\n\n    function setWeekAll(weekYear, week, weekday, dow, doy) {\n        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n        this.year(date.getUTCFullYear());\n        this.month(date.getUTCMonth());\n        this.date(date.getUTCDate());\n        return this;\n    }\n\n    // FORMATTING\n\n    addFormatToken('Q', 0, 'Qo', 'quarter');\n\n    // PARSING\n\n    addRegexToken('Q', match1);\n    addParseToken('Q', function (input, array) {\n        array[MONTH] = (toInt(input) - 1) * 3;\n    });\n\n    // MOMENTS\n\n    function getSetQuarter(input) {\n        return input == null\n            ? Math.ceil((this.month() + 1) / 3)\n            : this.month((input - 1) * 3 + (this.month() % 3));\n    }\n\n    // FORMATTING\n\n    addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n    // PARSING\n\n    addRegexToken('D', match1to2, match1to2NoLeadingZero);\n    addRegexToken('DD', match1to2, match2);\n    addRegexToken('Do', function (isStrict, locale) {\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        return isStrict\n            ? locale._dayOfMonthOrdinalParse || locale._ordinalParse\n            : locale._dayOfMonthOrdinalParseLenient;\n    });\n\n    addParseToken(['D', 'DD'], DATE);\n    addParseToken('Do', function (input, array) {\n        array[DATE] = toInt(input.match(match1to2)[0]);\n    });\n\n    // MOMENTS\n\n    var getSetDayOfMonth = makeGetSet('Date', true);\n\n    // FORMATTING\n\n    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n    // PARSING\n\n    addRegexToken('DDD', match1to3);\n    addRegexToken('DDDD', match3);\n    addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n        config._dayOfYear = toInt(input);\n    });\n\n    // HELPERS\n\n    // MOMENTS\n\n    function getSetDayOfYear(input) {\n        var dayOfYear =\n            Math.round(\n                (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5\n            ) + 1;\n        return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('m', ['mm', 2], 0, 'minute');\n\n    // PARSING\n\n    addRegexToken('m', match1to2, match1to2HasZero);\n    addRegexToken('mm', match1to2, match2);\n    addParseToken(['m', 'mm'], MINUTE);\n\n    // MOMENTS\n\n    var getSetMinute = makeGetSet('Minutes', false);\n\n    // FORMATTING\n\n    addFormatToken('s', ['ss', 2], 0, 'second');\n\n    // PARSING\n\n    addRegexToken('s', match1to2, match1to2HasZero);\n    addRegexToken('ss', match1to2, match2);\n    addParseToken(['s', 'ss'], SECOND);\n\n    // MOMENTS\n\n    var getSetSecond = makeGetSet('Seconds', false);\n\n    // FORMATTING\n\n    addFormatToken('S', 0, 0, function () {\n        return ~~(this.millisecond() / 100);\n    });\n\n    addFormatToken(0, ['SS', 2], 0, function () {\n        return ~~(this.millisecond() / 10);\n    });\n\n    addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n    addFormatToken(0, ['SSSS', 4], 0, function () {\n        return this.millisecond() * 10;\n    });\n    addFormatToken(0, ['SSSSS', 5], 0, function () {\n        return this.millisecond() * 100;\n    });\n    addFormatToken(0, ['SSSSSS', 6], 0, function () {\n        return this.millisecond() * 1000;\n    });\n    addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n        return this.millisecond() * 10000;\n    });\n    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n        return this.millisecond() * 100000;\n    });\n    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n        return this.millisecond() * 1000000;\n    });\n\n    // PARSING\n\n    addRegexToken('S', match1to3, match1);\n    addRegexToken('SS', match1to3, match2);\n    addRegexToken('SSS', match1to3, match3);\n\n    var token, getSetMillisecond;\n    for (token = 'SSSS'; token.length <= 9; token += 'S') {\n        addRegexToken(token, matchUnsigned);\n    }\n\n    function parseMs(input, array) {\n        array[MILLISECOND] = toInt(('0.' + input) * 1000);\n    }\n\n    for (token = 'S'; token.length <= 9; token += 'S') {\n        addParseToken(token, parseMs);\n    }\n\n    getSetMillisecond = makeGetSet('Milliseconds', false);\n\n    // FORMATTING\n\n    addFormatToken('z', 0, 0, 'zoneAbbr');\n    addFormatToken('zz', 0, 0, 'zoneName');\n\n    // MOMENTS\n\n    function getZoneAbbr() {\n        return this._isUTC ? 'UTC' : '';\n    }\n\n    function getZoneName() {\n        return this._isUTC ? 'Coordinated Universal Time' : '';\n    }\n\n    var proto = Moment.prototype;\n\n    proto.add = add;\n    proto.calendar = calendar$1;\n    proto.clone = clone;\n    proto.diff = diff;\n    proto.endOf = endOf;\n    proto.format = format;\n    proto.from = from;\n    proto.fromNow = fromNow;\n    proto.to = to;\n    proto.toNow = toNow;\n    proto.get = stringGet;\n    proto.invalidAt = invalidAt;\n    proto.isAfter = isAfter;\n    proto.isBefore = isBefore;\n    proto.isBetween = isBetween;\n    proto.isSame = isSame;\n    proto.isSameOrAfter = isSameOrAfter;\n    proto.isSameOrBefore = isSameOrBefore;\n    proto.isValid = isValid$2;\n    proto.lang = lang;\n    proto.locale = locale;\n    proto.localeData = localeData;\n    proto.max = prototypeMax;\n    proto.min = prototypeMin;\n    proto.parsingFlags = parsingFlags;\n    proto.set = stringSet;\n    proto.startOf = startOf;\n    proto.subtract = subtract;\n    proto.toArray = toArray;\n    proto.toObject = toObject;\n    proto.toDate = toDate;\n    proto.toISOString = toISOString;\n    proto.inspect = inspect;\n    if (typeof Symbol !== 'undefined' && Symbol.for != null) {\n        proto[Symbol.for('nodejs.util.inspect.custom')] = function () {\n            return 'Moment<' + this.format() + '>';\n        };\n    }\n    proto.toJSON = toJSON;\n    proto.toString = toString;\n    proto.unix = unix;\n    proto.valueOf = valueOf;\n    proto.creationData = creationData;\n    proto.eraName = getEraName;\n    proto.eraNarrow = getEraNarrow;\n    proto.eraAbbr = getEraAbbr;\n    proto.eraYear = getEraYear;\n    proto.year = getSetYear;\n    proto.isLeapYear = getIsLeapYear;\n    proto.weekYear = getSetWeekYear;\n    proto.isoWeekYear = getSetISOWeekYear;\n    proto.quarter = proto.quarters = getSetQuarter;\n    proto.month = getSetMonth;\n    proto.daysInMonth = getDaysInMonth;\n    proto.week = proto.weeks = getSetWeek;\n    proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n    proto.weeksInYear = getWeeksInYear;\n    proto.weeksInWeekYear = getWeeksInWeekYear;\n    proto.isoWeeksInYear = getISOWeeksInYear;\n    proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;\n    proto.date = getSetDayOfMonth;\n    proto.day = proto.days = getSetDayOfWeek;\n    proto.weekday = getSetLocaleDayOfWeek;\n    proto.isoWeekday = getSetISODayOfWeek;\n    proto.dayOfYear = getSetDayOfYear;\n    proto.hour = proto.hours = getSetHour;\n    proto.minute = proto.minutes = getSetMinute;\n    proto.second = proto.seconds = getSetSecond;\n    proto.millisecond = proto.milliseconds = getSetMillisecond;\n    proto.utcOffset = getSetOffset;\n    proto.utc = setOffsetToUTC;\n    proto.local = setOffsetToLocal;\n    proto.parseZone = setOffsetToParsedOffset;\n    proto.hasAlignedHourOffset = hasAlignedHourOffset;\n    proto.isDST = isDaylightSavingTime;\n    proto.isLocal = isLocal;\n    proto.isUtcOffset = isUtcOffset;\n    proto.isUtc = isUtc;\n    proto.isUTC = isUtc;\n    proto.zoneAbbr = getZoneAbbr;\n    proto.zoneName = getZoneName;\n    proto.dates = deprecate(\n        'dates accessor is deprecated. Use date instead.',\n        getSetDayOfMonth\n    );\n    proto.months = deprecate(\n        'months accessor is deprecated. Use month instead',\n        getSetMonth\n    );\n    proto.years = deprecate(\n        'years accessor is deprecated. Use year instead',\n        getSetYear\n    );\n    proto.zone = deprecate(\n        'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',\n        getSetZone\n    );\n    proto.isDSTShifted = deprecate(\n        'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',\n        isDaylightSavingTimeShifted\n    );\n\n    function createUnix(input) {\n        return createLocal(input * 1000);\n    }\n\n    function createInZone() {\n        return createLocal.apply(null, arguments).parseZone();\n    }\n\n    function preParsePostFormat(string) {\n        return string;\n    }\n\n    var proto$1 = Locale.prototype;\n\n    proto$1.calendar = calendar;\n    proto$1.longDateFormat = longDateFormat;\n    proto$1.invalidDate = invalidDate;\n    proto$1.ordinal = ordinal;\n    proto$1.preparse = preParsePostFormat;\n    proto$1.postformat = preParsePostFormat;\n    proto$1.relativeTime = relativeTime;\n    proto$1.pastFuture = pastFuture;\n    proto$1.set = set;\n    proto$1.eras = localeEras;\n    proto$1.erasParse = localeErasParse;\n    proto$1.erasConvertYear = localeErasConvertYear;\n    proto$1.erasAbbrRegex = erasAbbrRegex;\n    proto$1.erasNameRegex = erasNameRegex;\n    proto$1.erasNarrowRegex = erasNarrowRegex;\n\n    proto$1.months = localeMonths;\n    proto$1.monthsShort = localeMonthsShort;\n    proto$1.monthsParse = localeMonthsParse;\n    proto$1.monthsRegex = monthsRegex;\n    proto$1.monthsShortRegex = monthsShortRegex;\n    proto$1.week = localeWeek;\n    proto$1.firstDayOfYear = localeFirstDayOfYear;\n    proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n    proto$1.weekdays = localeWeekdays;\n    proto$1.weekdaysMin = localeWeekdaysMin;\n    proto$1.weekdaysShort = localeWeekdaysShort;\n    proto$1.weekdaysParse = localeWeekdaysParse;\n\n    proto$1.weekdaysRegex = weekdaysRegex;\n    proto$1.weekdaysShortRegex = weekdaysShortRegex;\n    proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n    proto$1.isPM = localeIsPM;\n    proto$1.meridiem = localeMeridiem;\n\n    function get$1(format, index, field, setter) {\n        var locale = getLocale(),\n            utc = createUTC().set(setter, index);\n        return locale[field](utc, format);\n    }\n\n    function listMonthsImpl(format, index, field) {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n\n        if (index != null) {\n            return get$1(format, index, field, 'month');\n        }\n\n        var i,\n            out = [];\n        for (i = 0; i < 12; i++) {\n            out[i] = get$1(format, i, field, 'month');\n        }\n        return out;\n    }\n\n    // ()\n    // (5)\n    // (fmt, 5)\n    // (fmt)\n    // (true)\n    // (true, 5)\n    // (true, fmt, 5)\n    // (true, fmt)\n    function listWeekdaysImpl(localeSorted, format, index, field) {\n        if (typeof localeSorted === 'boolean') {\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        } else {\n            format = localeSorted;\n            index = format;\n            localeSorted = false;\n\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        }\n\n        var locale = getLocale(),\n            shift = localeSorted ? locale._week.dow : 0,\n            i,\n            out = [];\n\n        if (index != null) {\n            return get$1(format, (index + shift) % 7, field, 'day');\n        }\n\n        for (i = 0; i < 7; i++) {\n            out[i] = get$1(format, (i + shift) % 7, field, 'day');\n        }\n        return out;\n    }\n\n    function listMonths(format, index) {\n        return listMonthsImpl(format, index, 'months');\n    }\n\n    function listMonthsShort(format, index) {\n        return listMonthsImpl(format, index, 'monthsShort');\n    }\n\n    function listWeekdays(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n    }\n\n    function listWeekdaysShort(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n    }\n\n    function listWeekdaysMin(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n    }\n\n    getSetGlobalLocale('en', {\n        eras: [\n            {\n                since: '0001-01-01',\n                until: +Infinity,\n                offset: 1,\n                name: 'Anno Domini',\n                narrow: 'AD',\n                abbr: 'AD',\n            },\n            {\n                since: '0000-12-31',\n                until: -Infinity,\n                offset: 1,\n                name: 'Before Christ',\n                narrow: 'BC',\n                abbr: 'BC',\n            },\n        ],\n        dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    toInt((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n    });\n\n    // Side effect imports\n\n    hooks.lang = deprecate(\n        'moment.lang is deprecated. Use moment.locale instead.',\n        getSetGlobalLocale\n    );\n    hooks.langData = deprecate(\n        'moment.langData is deprecated. Use moment.localeData instead.',\n        getLocale\n    );\n\n    var mathAbs = Math.abs;\n\n    function abs() {\n        var data = this._data;\n\n        this._milliseconds = mathAbs(this._milliseconds);\n        this._days = mathAbs(this._days);\n        this._months = mathAbs(this._months);\n\n        data.milliseconds = mathAbs(data.milliseconds);\n        data.seconds = mathAbs(data.seconds);\n        data.minutes = mathAbs(data.minutes);\n        data.hours = mathAbs(data.hours);\n        data.months = mathAbs(data.months);\n        data.years = mathAbs(data.years);\n\n        return this;\n    }\n\n    function addSubtract$1(duration, input, value, direction) {\n        var other = createDuration(input, value);\n\n        duration._milliseconds += direction * other._milliseconds;\n        duration._days += direction * other._days;\n        duration._months += direction * other._months;\n\n        return duration._bubble();\n    }\n\n    // supports only 2.0-style add(1, 's') or add(duration)\n    function add$1(input, value) {\n        return addSubtract$1(this, input, value, 1);\n    }\n\n    // supports only 2.0-style subtract(1, 's') or subtract(duration)\n    function subtract$1(input, value) {\n        return addSubtract$1(this, input, value, -1);\n    }\n\n    function absCeil(number) {\n        if (number < 0) {\n            return Math.floor(number);\n        } else {\n            return Math.ceil(number);\n        }\n    }\n\n    function bubble() {\n        var milliseconds = this._milliseconds,\n            days = this._days,\n            months = this._months,\n            data = this._data,\n            seconds,\n            minutes,\n            hours,\n            years,\n            monthsFromDays;\n\n        // if we have a mix of positive and negative values, bubble down first\n        // check: https://github.com/moment/moment/issues/2166\n        if (\n            !(\n                (milliseconds >= 0 && days >= 0 && months >= 0) ||\n                (milliseconds <= 0 && days <= 0 && months <= 0)\n            )\n        ) {\n            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n            days = 0;\n            months = 0;\n        }\n\n        // The following code bubbles up values, see the tests for\n        // examples of what that means.\n        data.milliseconds = milliseconds % 1000;\n\n        seconds = absFloor(milliseconds / 1000);\n        data.seconds = seconds % 60;\n\n        minutes = absFloor(seconds / 60);\n        data.minutes = minutes % 60;\n\n        hours = absFloor(minutes / 60);\n        data.hours = hours % 24;\n\n        days += absFloor(hours / 24);\n\n        // convert days to months\n        monthsFromDays = absFloor(daysToMonths(days));\n        months += monthsFromDays;\n        days -= absCeil(monthsToDays(monthsFromDays));\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        data.days = days;\n        data.months = months;\n        data.years = years;\n\n        return this;\n    }\n\n    function daysToMonths(days) {\n        // 400 years have 146097 days (taking into account leap year rules)\n        // 400 years have 12 months === 4800\n        return (days * 4800) / 146097;\n    }\n\n    function monthsToDays(months) {\n        // the reverse of daysToMonths\n        return (months * 146097) / 4800;\n    }\n\n    function as(units) {\n        if (!this.isValid()) {\n            return NaN;\n        }\n        var days,\n            months,\n            milliseconds = this._milliseconds;\n\n        units = normalizeUnits(units);\n\n        if (units === 'month' || units === 'quarter' || units === 'year') {\n            days = this._days + milliseconds / 864e5;\n            months = this._months + daysToMonths(days);\n            switch (units) {\n                case 'month':\n                    return months;\n                case 'quarter':\n                    return months / 3;\n                case 'year':\n                    return months / 12;\n            }\n        } else {\n            // handle milliseconds separately because of floating point math errors (issue #1867)\n            days = this._days + Math.round(monthsToDays(this._months));\n            switch (units) {\n                case 'week':\n                    return days / 7 + milliseconds / 6048e5;\n                case 'day':\n                    return days + milliseconds / 864e5;\n                case 'hour':\n                    return days * 24 + milliseconds / 36e5;\n                case 'minute':\n                    return days * 1440 + milliseconds / 6e4;\n                case 'second':\n                    return days * 86400 + milliseconds / 1000;\n                // Math.floor prevents floating point math errors here\n                case 'millisecond':\n                    return Math.floor(days * 864e5) + milliseconds;\n                default:\n                    throw new Error('Unknown unit ' + units);\n            }\n        }\n    }\n\n    function makeAs(alias) {\n        return function () {\n            return this.as(alias);\n        };\n    }\n\n    var asMilliseconds = makeAs('ms'),\n        asSeconds = makeAs('s'),\n        asMinutes = makeAs('m'),\n        asHours = makeAs('h'),\n        asDays = makeAs('d'),\n        asWeeks = makeAs('w'),\n        asMonths = makeAs('M'),\n        asQuarters = makeAs('Q'),\n        asYears = makeAs('y'),\n        valueOf$1 = asMilliseconds;\n\n    function clone$1() {\n        return createDuration(this);\n    }\n\n    function get$2(units) {\n        units = normalizeUnits(units);\n        return this.isValid() ? this[units + 's']() : NaN;\n    }\n\n    function makeGetter(name) {\n        return function () {\n            return this.isValid() ? this._data[name] : NaN;\n        };\n    }\n\n    var milliseconds = makeGetter('milliseconds'),\n        seconds = makeGetter('seconds'),\n        minutes = makeGetter('minutes'),\n        hours = makeGetter('hours'),\n        days = makeGetter('days'),\n        months = makeGetter('months'),\n        years = makeGetter('years');\n\n    function weeks() {\n        return absFloor(this.days() / 7);\n    }\n\n    var round = Math.round,\n        thresholds = {\n            ss: 44, // a few seconds to seconds\n            s: 45, // seconds to minute\n            m: 45, // minutes to hour\n            h: 22, // hours to day\n            d: 26, // days to month/week\n            w: null, // weeks to month\n            M: 11, // months to year\n        };\n\n    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n    }\n\n    function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {\n        var duration = createDuration(posNegDuration).abs(),\n            seconds = round(duration.as('s')),\n            minutes = round(duration.as('m')),\n            hours = round(duration.as('h')),\n            days = round(duration.as('d')),\n            months = round(duration.as('M')),\n            weeks = round(duration.as('w')),\n            years = round(duration.as('y')),\n            a =\n                (seconds <= thresholds.ss && ['s', seconds]) ||\n                (seconds < thresholds.s && ['ss', seconds]) ||\n                (minutes <= 1 && ['m']) ||\n                (minutes < thresholds.m && ['mm', minutes]) ||\n                (hours <= 1 && ['h']) ||\n                (hours < thresholds.h && ['hh', hours]) ||\n                (days <= 1 && ['d']) ||\n                (days < thresholds.d && ['dd', days]);\n\n        if (thresholds.w != null) {\n            a =\n                a ||\n                (weeks <= 1 && ['w']) ||\n                (weeks < thresholds.w && ['ww', weeks]);\n        }\n        a = a ||\n            (months <= 1 && ['M']) ||\n            (months < thresholds.M && ['MM', months]) ||\n            (years <= 1 && ['y']) || ['yy', years];\n\n        a[2] = withoutSuffix;\n        a[3] = +posNegDuration > 0;\n        a[4] = locale;\n        return substituteTimeAgo.apply(null, a);\n    }\n\n    // This function allows you to set the rounding function for relative time strings\n    function getSetRelativeTimeRounding(roundingFunction) {\n        if (roundingFunction === undefined) {\n            return round;\n        }\n        if (typeof roundingFunction === 'function') {\n            round = roundingFunction;\n            return true;\n        }\n        return false;\n    }\n\n    // This function allows you to set a threshold for relative time strings\n    function getSetRelativeTimeThreshold(threshold, limit) {\n        if (thresholds[threshold] === undefined) {\n            return false;\n        }\n        if (limit === undefined) {\n            return thresholds[threshold];\n        }\n        thresholds[threshold] = limit;\n        if (threshold === 's') {\n            thresholds.ss = limit - 1;\n        }\n        return true;\n    }\n\n    function humanize(argWithSuffix, argThresholds) {\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var withSuffix = false,\n            th = thresholds,\n            locale,\n            output;\n\n        if (typeof argWithSuffix === 'object') {\n            argThresholds = argWithSuffix;\n            argWithSuffix = false;\n        }\n        if (typeof argWithSuffix === 'boolean') {\n            withSuffix = argWithSuffix;\n        }\n        if (typeof argThresholds === 'object') {\n            th = Object.assign({}, thresholds, argThresholds);\n            if (argThresholds.s != null && argThresholds.ss == null) {\n                th.ss = argThresholds.s - 1;\n            }\n        }\n\n        locale = this.localeData();\n        output = relativeTime$1(this, !withSuffix, th, locale);\n\n        if (withSuffix) {\n            output = locale.pastFuture(+this, output);\n        }\n\n        return locale.postformat(output);\n    }\n\n    var abs$1 = Math.abs;\n\n    function sign(x) {\n        return (x > 0) - (x < 0) || +x;\n    }\n\n    function toISOString$1() {\n        // for ISO strings we do not use the normal bubbling rules:\n        //  * milliseconds bubble up until they become hours\n        //  * days do not bubble at all\n        //  * months bubble up until they become years\n        // This is because there is no context-free conversion between hours and days\n        // (think of clock changes)\n        // and also not between days and months (28-31 days per month)\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var seconds = abs$1(this._milliseconds) / 1000,\n            days = abs$1(this._days),\n            months = abs$1(this._months),\n            minutes,\n            hours,\n            years,\n            s,\n            total = this.asSeconds(),\n            totalSign,\n            ymSign,\n            daysSign,\n            hmsSign;\n\n        if (!total) {\n            // this is the same as C#'s (Noda) and python (isodate)...\n            // but not other JS (goog.date)\n            return 'P0D';\n        }\n\n        // 3600 seconds -> 60 minutes -> 1 hour\n        minutes = absFloor(seconds / 60);\n        hours = absFloor(minutes / 60);\n        seconds %= 60;\n        minutes %= 60;\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n        s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n\n        totalSign = total < 0 ? '-' : '';\n        ymSign = sign(this._months) !== sign(total) ? '-' : '';\n        daysSign = sign(this._days) !== sign(total) ? '-' : '';\n        hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n        return (\n            totalSign +\n            'P' +\n            (years ? ymSign + years + 'Y' : '') +\n            (months ? ymSign + months + 'M' : '') +\n            (days ? daysSign + days + 'D' : '') +\n            (hours || minutes || seconds ? 'T' : '') +\n            (hours ? hmsSign + hours + 'H' : '') +\n            (minutes ? hmsSign + minutes + 'M' : '') +\n            (seconds ? hmsSign + s + 'S' : '')\n        );\n    }\n\n    var proto$2 = Duration.prototype;\n\n    proto$2.isValid = isValid$1;\n    proto$2.abs = abs;\n    proto$2.add = add$1;\n    proto$2.subtract = subtract$1;\n    proto$2.as = as;\n    proto$2.asMilliseconds = asMilliseconds;\n    proto$2.asSeconds = asSeconds;\n    proto$2.asMinutes = asMinutes;\n    proto$2.asHours = asHours;\n    proto$2.asDays = asDays;\n    proto$2.asWeeks = asWeeks;\n    proto$2.asMonths = asMonths;\n    proto$2.asQuarters = asQuarters;\n    proto$2.asYears = asYears;\n    proto$2.valueOf = valueOf$1;\n    proto$2._bubble = bubble;\n    proto$2.clone = clone$1;\n    proto$2.get = get$2;\n    proto$2.milliseconds = milliseconds;\n    proto$2.seconds = seconds;\n    proto$2.minutes = minutes;\n    proto$2.hours = hours;\n    proto$2.days = days;\n    proto$2.weeks = weeks;\n    proto$2.months = months;\n    proto$2.years = years;\n    proto$2.humanize = humanize;\n    proto$2.toISOString = toISOString$1;\n    proto$2.toString = toISOString$1;\n    proto$2.toJSON = toISOString$1;\n    proto$2.locale = locale;\n    proto$2.localeData = localeData;\n\n    proto$2.toIsoString = deprecate(\n        'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',\n        toISOString$1\n    );\n    proto$2.lang = lang;\n\n    // FORMATTING\n\n    addFormatToken('X', 0, 0, 'unix');\n    addFormatToken('x', 0, 0, 'valueOf');\n\n    // PARSING\n\n    addRegexToken('x', matchSigned);\n    addRegexToken('X', matchTimestamp);\n    addParseToken('X', function (input, array, config) {\n        config._d = new Date(parseFloat(input) * 1000);\n    });\n    addParseToken('x', function (input, array, config) {\n        config._d = new Date(toInt(input));\n    });\n\n    //! moment.js\n\n    hooks.version = '2.30.1';\n\n    setHookCallback(createLocal);\n\n    hooks.fn = proto;\n    hooks.min = min;\n    hooks.max = max;\n    hooks.now = now;\n    hooks.utc = createUTC;\n    hooks.unix = createUnix;\n    hooks.months = listMonths;\n    hooks.isDate = isDate;\n    hooks.locale = getSetGlobalLocale;\n    hooks.invalid = createInvalid;\n    hooks.duration = createDuration;\n    hooks.isMoment = isMoment;\n    hooks.weekdays = listWeekdays;\n    hooks.parseZone = createInZone;\n    hooks.localeData = getLocale;\n    hooks.isDuration = isDuration;\n    hooks.monthsShort = listMonthsShort;\n    hooks.weekdaysMin = listWeekdaysMin;\n    hooks.defineLocale = defineLocale;\n    hooks.updateLocale = updateLocale;\n    hooks.locales = listLocales;\n    hooks.weekdaysShort = listWeekdaysShort;\n    hooks.normalizeUnits = normalizeUnits;\n    hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n    hooks.calendarFormat = getCalendarFormat;\n    hooks.prototype = proto;\n\n    // currently HTML5 input type only supports 24-hour formats\n    hooks.HTML5_FMT = {\n        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type=\"datetime-local\" />\n        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type=\"datetime-local\" step=\"1\" />\n        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type=\"datetime-local\" step=\"0.001\" />\n        DATE: 'YYYY-MM-DD', // <input type=\"date\" />\n        TIME: 'HH:mm', // <input type=\"time\" />\n        TIME_SECONDS: 'HH:mm:ss', // <input type=\"time\" step=\"1\" />\n        TIME_MS: 'HH:mm:ss.SSS', // <input type=\"time\" step=\"0.001\" />\n        WEEK: 'GGGG-[W]WW', // <input type=\"week\" />\n        MONTH: 'YYYY-MM', // <input type=\"month\" />\n    };\n\n    return hooks;\n\n})));\n","export default typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n","import isBrowser from './isBrowser';\n\nconst timeoutDuration = (function(){\n  const longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  for (let i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      return 1;\n    }\n  }\n  return 0;\n}());\n\nexport function microtaskDebounce(fn) {\n  let called = false\n  return () => {\n    if (called) {\n      return\n    }\n    called = true\n    window.Promise.resolve().then(() => {\n      called = false\n      fn()\n    })\n  }\n}\n\nexport function taskDebounce(fn) {\n  let scheduled = false;\n  return () => {\n    if (!scheduled) {\n      scheduled = true;\n      setTimeout(() => {\n        scheduled = false;\n        fn();\n      }, timeoutDuration);\n    }\n  };\n}\n\nconst supportsMicroTasks = isBrowser && window.Promise\n\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nexport default (supportsMicroTasks\n  ? microtaskDebounce\n  : taskDebounce);\n","/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nexport default function isFunction(functionToCheck) {\n  const getType = {};\n  return (\n    functionToCheck &&\n    getType.toString.call(functionToCheck) === '[object Function]'\n  );\n}\n","/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nexport default function getStyleComputedProperty(element, property) {\n  if (element.nodeType !== 1) {\n    return [];\n  }\n  // NOTE: 1 DOM access here\n  const window = element.ownerDocument.defaultView;\n  const css = window.getComputedStyle(element, null);\n  return property ? css[property] : css;\n}\n","/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nexport default function getParentNode(element) {\n  if (element.nodeName === 'HTML') {\n    return element;\n  }\n  return element.parentNode || element.host;\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getParentNode from './getParentNode';\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nexport default function getScrollParent(element) {\n  // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n  if (!element) {\n    return document.body\n  }\n\n  switch (element.nodeName) {\n    case 'HTML':\n    case 'BODY':\n      return element.ownerDocument.body\n    case '#document':\n      return element.body\n  }\n\n  // Firefox want us to check `-x` and `-y` variations as well\n  const { overflow, overflowX, overflowY } = getStyleComputedProperty(element);\n  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n    return element;\n  }\n\n  return getScrollParent(getParentNode(element));\n}\n","/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nexport default function getReferenceNode(reference) {\n  return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n","import isBrowser from './isBrowser';\n\nconst isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nconst isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nexport default function isIE(version) {\n  if (version === 11) {\n    return isIE11;\n  }\n  if (version === 10) {\n    return isIE10;\n  }\n  return isIE11 || isIE10;\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport isIE from './isIE';\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nexport default function getOffsetParent(element) {\n  if (!element) {\n    return document.documentElement;\n  }\n\n  const noOffsetParent = isIE(10) ? document.body : null;\n\n  // NOTE: 1 DOM access here\n  let offsetParent = element.offsetParent || null;\n  // Skip hidden elements which don't have an offsetParent\n  while (offsetParent === noOffsetParent && element.nextElementSibling) {\n    offsetParent = (element = element.nextElementSibling).offsetParent;\n  }\n\n  const nodeName = offsetParent && offsetParent.nodeName;\n\n  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n    return element ? element.ownerDocument.documentElement : document.documentElement;\n  }\n\n  // .offsetParent will return the closest TH, TD or TABLE in case\n  // no offsetParent is present, I hate this job...\n  if (\n    ['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 &&\n    getStyleComputedProperty(offsetParent, 'position') === 'static'\n  ) {\n    return getOffsetParent(offsetParent);\n  }\n\n  return offsetParent;\n}\n","/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nexport default function getRoot(node) {\n  if (node.parentNode !== null) {\n    return getRoot(node.parentNode);\n  }\n\n  return node;\n}\n","import isOffsetContainer from './isOffsetContainer';\nimport getRoot from './getRoot';\nimport getOffsetParent from './getOffsetParent';\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nexport default function findCommonOffsetParent(element1, element2) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n    return document.documentElement;\n  }\n\n  // Here we make sure to give as \"start\" the element that comes first in the DOM\n  const order =\n    element1.compareDocumentPosition(element2) &\n    Node.DOCUMENT_POSITION_FOLLOWING;\n  const start = order ? element1 : element2;\n  const end = order ? element2 : element1;\n\n  // Get common ancestor container\n  const range = document.createRange();\n  range.setStart(start, 0);\n  range.setEnd(end, 0);\n  const { commonAncestorContainer } = range;\n\n  // Both nodes are inside #document\n  if (\n    (element1 !== commonAncestorContainer &&\n      element2 !== commonAncestorContainer) ||\n    start.contains(end)\n  ) {\n    if (isOffsetContainer(commonAncestorContainer)) {\n      return commonAncestorContainer;\n    }\n\n    return getOffsetParent(commonAncestorContainer);\n  }\n\n  // one of the nodes is inside shadowDOM, find which one\n  const element1root = getRoot(element1);\n  if (element1root.host) {\n    return findCommonOffsetParent(element1root.host, element2);\n  } else {\n    return findCommonOffsetParent(element1, getRoot(element2).host);\n  }\n}\n","import getOffsetParent from './getOffsetParent';\n\nexport default function isOffsetContainer(element) {\n  const { nodeName } = element;\n  if (nodeName === 'BODY') {\n    return false;\n  }\n  return (\n    nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element\n  );\n}\n","/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nexport default function getScroll(element, side = 'top') {\n  const upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n  const nodeName = element.nodeName;\n\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    const html = element.ownerDocument.documentElement;\n    const scrollingElement = element.ownerDocument.scrollingElement || html;\n    return scrollingElement[upperSide];\n  }\n\n  return element[upperSide];\n}\n","/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nexport default function getBordersSize(styles, axis) {\n  const sideA = axis === 'x' ? 'Left' : 'Top';\n  const sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n  return (\n    parseFloat(styles[`border${sideA}Width`]) +\n    parseFloat(styles[`border${sideB}Width`])\n  );\n}\n","import isIE from './isIE';\n\nfunction getSize(axis, body, html, computedStyle) {\n  return Math.max(\n    body[`offset${axis}`],\n    body[`scroll${axis}`],\n    html[`client${axis}`],\n    html[`offset${axis}`],\n    html[`scroll${axis}`],\n    isIE(10)\n      ? (parseInt(html[`offset${axis}`]) + \n      parseInt(computedStyle[`margin${axis === 'Height' ? 'Top' : 'Left'}`]) + \n      parseInt(computedStyle[`margin${axis === 'Height' ? 'Bottom' : 'Right'}`]))\n    : 0 \n  );\n}\n\nexport default function getWindowSizes(document) {\n  const body = document.body;\n  const html = document.documentElement;\n  const computedStyle = isIE(10) && getComputedStyle(html);\n\n  return {\n    height: getSize('Height', body, html, computedStyle),\n    width: getSize('Width', body, html, computedStyle),\n  };\n}\n","/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nexport default function getClientRect(offsets) {\n  return {\n    ...offsets,\n    right: offsets.left + offsets.width,\n    bottom: offsets.top + offsets.height,\n  };\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getBordersSize from './getBordersSize';\nimport getWindowSizes from './getWindowSizes';\nimport getScroll from './getScroll';\nimport getClientRect from './getClientRect';\nimport isIE from './isIE';\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nexport default function getBoundingClientRect(element) {\n  let rect = {};\n\n  // IE10 10 FIX: Please, don't ask, the element isn't\n  // considered in DOM in some circumstances...\n  // This isn't reproducible in IE10 compatibility mode of IE11\n  try {\n    if (isIE(10)) {\n      rect = element.getBoundingClientRect();\n      const scrollTop = getScroll(element, 'top');\n      const scrollLeft = getScroll(element, 'left');\n      rect.top += scrollTop;\n      rect.left += scrollLeft;\n      rect.bottom += scrollTop;\n      rect.right += scrollLeft;\n    }\n    else {\n      rect = element.getBoundingClientRect();\n    }\n  }\n  catch(e){}\n\n  const result = {\n    left: rect.left,\n    top: rect.top,\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n\n  // subtract scrollbar size from sizes\n  const sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n  const width =\n    sizes.width || element.clientWidth || result.width;\n  const height =\n    sizes.height || element.clientHeight || result.height;\n\n  let horizScrollbar = element.offsetWidth - width;\n  let vertScrollbar = element.offsetHeight - height;\n\n  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n  // we make this check conditional for performance reasons\n  if (horizScrollbar || vertScrollbar) {\n    const styles = getStyleComputedProperty(element);\n    horizScrollbar -= getBordersSize(styles, 'x');\n    vertScrollbar -= getBordersSize(styles, 'y');\n\n    result.width -= horizScrollbar;\n    result.height -= vertScrollbar;\n  }\n\n  return getClientRect(result);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport includeScroll from './includeScroll';\nimport getScrollParent from './getScrollParent';\nimport getBoundingClientRect from './getBoundingClientRect';\nimport runIsIE from './isIE';\nimport getClientRect from './getClientRect';\n\nexport default function getOffsetRectRelativeToArbitraryNode(children, parent, fixedPosition = false) {\n  const isIE10 = runIsIE(10);\n  const isHTML = parent.nodeName === 'HTML';\n  const childrenRect = getBoundingClientRect(children);\n  const parentRect = getBoundingClientRect(parent);\n  const scrollParent = getScrollParent(children);\n\n  const styles = getStyleComputedProperty(parent);\n  const borderTopWidth = parseFloat(styles.borderTopWidth);\n  const borderLeftWidth = parseFloat(styles.borderLeftWidth);\n\n  // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n  if(fixedPosition && isHTML) {\n    parentRect.top = Math.max(parentRect.top, 0);\n    parentRect.left = Math.max(parentRect.left, 0);\n  }\n  let offsets = getClientRect({\n    top: childrenRect.top - parentRect.top - borderTopWidth,\n    left: childrenRect.left - parentRect.left - borderLeftWidth,\n    width: childrenRect.width,\n    height: childrenRect.height,\n  });\n  offsets.marginTop = 0;\n  offsets.marginLeft = 0;\n\n  // Subtract margins of documentElement in case it's being used as parent\n  // we do this only on HTML because it's the only element that behaves\n  // differently when margins are applied to it. The margins are included in\n  // the box of the documentElement, in the other cases not.\n  if (!isIE10 && isHTML) {\n    const marginTop = parseFloat(styles.marginTop);\n    const marginLeft = parseFloat(styles.marginLeft);\n\n    offsets.top -= borderTopWidth - marginTop;\n    offsets.bottom -= borderTopWidth - marginTop;\n    offsets.left -= borderLeftWidth - marginLeft;\n    offsets.right -= borderLeftWidth - marginLeft;\n\n    // Attach marginTop and marginLeft because in some circumstances we may need them\n    offsets.marginTop = marginTop;\n    offsets.marginLeft = marginLeft;\n  }\n\n  if (\n    isIE10 && !fixedPosition\n      ? parent.contains(scrollParent)\n      : parent === scrollParent && scrollParent.nodeName !== 'BODY'\n  ) {\n    offsets = includeScroll(offsets, parent);\n  }\n\n  return offsets;\n}\n","import getScroll from './getScroll';\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nexport default function includeScroll(rect, element, subtract = false) {\n  const scrollTop = getScroll(element, 'top');\n  const scrollLeft = getScroll(element, 'left');\n  const modifier = subtract ? -1 : 1;\n  rect.top += scrollTop * modifier;\n  rect.bottom += scrollTop * modifier;\n  rect.left += scrollLeft * modifier;\n  rect.right += scrollLeft * modifier;\n  return rect;\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getParentNode from './getParentNode';\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nexport default function isFixed(element) {\n  const nodeName = element.nodeName;\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    return false;\n  }\n  if (getStyleComputedProperty(element, 'position') === 'fixed') {\n    return true;\n  }\n  const parentNode = getParentNode(element);\n  if (!parentNode) {\n    return false;\n  }\n  return isFixed(parentNode);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport isIE from './isIE';\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nexport default function getFixedPositionOffsetParent(element) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n   if (!element || !element.parentElement || isIE()) {\n    return document.documentElement;\n  }\n  let el = element.parentElement;\n  while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n    el = el.parentElement;\n  }\n  return el || document.documentElement;\n\n}\n","import getScrollParent from './getScrollParent';\nimport getParentNode from './getParentNode';\nimport getReferenceNode from './getReferenceNode';\nimport findCommonOffsetParent from './findCommonOffsetParent';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getViewportOffsetRectRelativeToArtbitraryNode from './getViewportOffsetRectRelativeToArtbitraryNode';\nimport getWindowSizes from './getWindowSizes';\nimport isFixed from './isFixed';\nimport getFixedPositionOffsetParent from './getFixedPositionOffsetParent';\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nexport default function getBoundaries(\n  popper,\n  reference,\n  padding,\n  boundariesElement,\n  fixedPosition = false\n) {\n  // NOTE: 1 DOM access here\n\n  let boundaries = { top: 0, left: 0 };\n  const offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n  // Handle viewport case\n  if (boundariesElement === 'viewport' ) {\n    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n  }\n\n  else {\n    // Handle other cases based on DOM element used as boundaries\n    let boundariesNode;\n    if (boundariesElement === 'scrollParent') {\n      boundariesNode = getScrollParent(getParentNode(reference));\n      if (boundariesNode.nodeName === 'BODY') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      }\n    } else if (boundariesElement === 'window') {\n      boundariesNode = popper.ownerDocument.documentElement;\n    } else {\n      boundariesNode = boundariesElement;\n    }\n\n    const offsets = getOffsetRectRelativeToArbitraryNode(\n      boundariesNode,\n      offsetParent,\n      fixedPosition\n    );\n\n    // In case of HTML, we need a different computation\n    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n      const { height, width } = getWindowSizes(popper.ownerDocument);\n      boundaries.top += offsets.top - offsets.marginTop;\n      boundaries.bottom = height + offsets.top;\n      boundaries.left += offsets.left - offsets.marginLeft;\n      boundaries.right = width + offsets.left;\n    } else {\n      // for all the other DOM elements, this one is good\n      boundaries = offsets;\n    }\n  }\n\n  // Add paddings\n  padding = padding || 0;\n  const isPaddingNumber = typeof padding === 'number';\n  boundaries.left += isPaddingNumber ? padding : padding.left || 0; \n  boundaries.top += isPaddingNumber ? padding : padding.top || 0; \n  boundaries.right -= isPaddingNumber ? padding : padding.right || 0; \n  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; \n\n  return boundaries;\n}\n","import getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getScroll from './getScroll';\nimport getClientRect from './getClientRect';\n\nexport default function getViewportOffsetRectRelativeToArtbitraryNode(element, excludeScroll = false) {\n  const html = element.ownerDocument.documentElement;\n  const relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n  const width = Math.max(html.clientWidth, window.innerWidth || 0);\n  const height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n  const scrollTop = !excludeScroll ? getScroll(html) : 0;\n  const scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n  const offset = {\n    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n    width,\n    height,\n  };\n\n  return getClientRect(offset);\n}\n","import getBoundaries from '../utils/getBoundaries';\n\nfunction getArea({ width, height }) {\n  return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function computeAutoPlacement(\n  placement,\n  refRect,\n  popper,\n  reference,\n  boundariesElement,\n  padding = 0\n) {\n  if (placement.indexOf('auto') === -1) {\n    return placement;\n  }\n\n  const boundaries = getBoundaries(\n    popper,\n    reference,\n    padding,\n    boundariesElement\n  );\n\n  const rects = {\n    top: {\n      width: boundaries.width,\n      height: refRect.top - boundaries.top,\n    },\n    right: {\n      width: boundaries.right - refRect.right,\n      height: boundaries.height,\n    },\n    bottom: {\n      width: boundaries.width,\n      height: boundaries.bottom - refRect.bottom,\n    },\n    left: {\n      width: refRect.left - boundaries.left,\n      height: boundaries.height,\n    },\n  };\n\n  const sortedAreas = Object.keys(rects)\n    .map(key => ({\n      key,\n      ...rects[key],\n      area: getArea(rects[key]),\n    }))\n    .sort((a, b) => b.area - a.area);\n\n  const filteredAreas = sortedAreas.filter(\n    ({ width, height }) =>\n      width >= popper.clientWidth && height >= popper.clientHeight\n  );\n\n  const computedPlacement = filteredAreas.length > 0\n    ? filteredAreas[0].key\n    : sortedAreas[0].key;\n\n  const variation = placement.split('-')[1];\n\n  return computedPlacement + (variation ? `-${variation}` : '');\n}\n","import findCommonOffsetParent from './findCommonOffsetParent';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getFixedPositionOffsetParent from './getFixedPositionOffsetParent';\nimport getReferenceNode from './getReferenceNode';\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nexport default function getReferenceOffsets(state, popper, reference, fixedPosition = null) {\n  const commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n","/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nexport default function getOuterSizes(element) {\n  const window = element.ownerDocument.defaultView;\n  const styles = window.getComputedStyle(element);\n  const x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n  const y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n  const result = {\n    width: element.offsetWidth + y,\n    height: element.offsetHeight + x,\n  };\n  return result;\n}\n","/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nexport default function getOppositePlacement(placement) {\n  const hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n  return placement.replace(/left|right|bottom|top/g, matched => hash[matched]);\n}\n","import getOuterSizes from './getOuterSizes';\nimport getOppositePlacement from './getOppositePlacement';\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nexport default function getPopperOffsets(popper, referenceOffsets, placement) {\n  placement = placement.split('-')[0];\n\n  // Get popper node sizes\n  const popperRect = getOuterSizes(popper);\n\n  // Add position, width and height to our offsets object\n  const popperOffsets = {\n    width: popperRect.width,\n    height: popperRect.height,\n  };\n\n  // depending by the popper placement we have to compute its offsets slightly differently\n  const isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n  const mainSide = isHoriz ? 'top' : 'left';\n  const secondarySide = isHoriz ? 'left' : 'top';\n  const measurement = isHoriz ? 'height' : 'width';\n  const secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n  popperOffsets[mainSide] =\n    referenceOffsets[mainSide] +\n    referenceOffsets[measurement] / 2 -\n    popperRect[measurement] / 2;\n  if (placement === secondarySide) {\n    popperOffsets[secondarySide] =\n      referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n  } else {\n    popperOffsets[secondarySide] =\n      referenceOffsets[getOppositePlacement(secondarySide)];\n  }\n\n  return popperOffsets;\n}\n","/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nexport default function find(arr, check) {\n  // use native find if supported\n  if (Array.prototype.find) {\n    return arr.find(check);\n  }\n\n  // use `filter` to obtain the same behavior of `find`\n  return arr.filter(check)[0];\n}\n","import isFunction from './isFunction';\nimport findIndex from './findIndex';\nimport getClientRect from '../utils/getClientRect';\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nexport default function runModifiers(modifiers, data, ends) {\n  const modifiersToRun = ends === undefined\n    ? modifiers\n    : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n  modifiersToRun.forEach(modifier => {\n    if (modifier['function']) { // eslint-disable-line dot-notation\n      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n    }\n    const fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n    if (modifier.enabled && isFunction(fn)) {\n      // Add properties to offsets to make them a complete clientRect object\n      // we do this before each modifier to make sure the previous one doesn't\n      // mess with these values\n      data.offsets.popper = getClientRect(data.offsets.popper);\n      data.offsets.reference = getClientRect(data.offsets.reference);\n\n      data = fn(data, modifier);\n    }\n  });\n\n  return data;\n}\n","import find from './find';\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nexport default function findIndex(arr, prop, value) {\n  // use native findIndex if supported\n  if (Array.prototype.findIndex) {\n    return arr.findIndex(cur => cur[prop] === value);\n  }\n\n  // use `find` + `indexOf` if `findIndex` isn't supported\n  const match = find(arr, obj => obj[prop] === value);\n  return arr.indexOf(match);\n}\n","import computeAutoPlacement from '../utils/computeAutoPlacement';\nimport getReferenceOffsets from '../utils/getReferenceOffsets';\nimport getPopperOffsets from '../utils/getPopperOffsets';\nimport runModifiers from '../utils/runModifiers';\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nexport default function update() {\n  // if popper is destroyed, don't perform any further update\n  if (this.state.isDestroyed) {\n    return;\n  }\n\n  let data = {\n    instance: this,\n    styles: {},\n    arrowStyles: {},\n    attributes: {},\n    flipped: false,\n    offsets: {},\n  };\n\n  // compute reference element offsets\n  data.offsets.reference = getReferenceOffsets(\n    this.state,\n    this.popper,\n    this.reference,\n    this.options.positionFixed\n  );\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  data.placement = computeAutoPlacement(\n    this.options.placement,\n    data.offsets.reference,\n    this.popper,\n    this.reference,\n    this.options.modifiers.flip.boundariesElement,\n    this.options.modifiers.flip.padding\n  );\n\n  // store the computed placement inside `originalPlacement`\n  data.originalPlacement = data.placement;\n\n  data.positionFixed = this.options.positionFixed;\n\n  // compute the popper offsets\n  data.offsets.popper = getPopperOffsets(\n    this.popper,\n    data.offsets.reference,\n    data.placement\n  );\n\n  data.offsets.popper.position = this.options.positionFixed\n    ? 'fixed'\n    : 'absolute';\n\n  // run the modifiers\n  data = runModifiers(this.modifiers, data);\n\n  // the first `update` will call `onCreate` callback\n  // the other ones will call `onUpdate` callback\n  if (!this.state.isCreated) {\n    this.state.isCreated = true;\n    this.options.onCreate(data);\n  } else {\n    this.options.onUpdate(data);\n  }\n}\n","/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nexport default function isModifierEnabled(modifiers, modifierName) {\n  return modifiers.some(\n    ({ name, enabled }) => enabled && name === modifierName\n  );\n}\n","/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nexport default function getSupportedPropertyName(property) {\n  const prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n  const upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n  for (let i = 0; i < prefixes.length; i++) {\n    const prefix = prefixes[i];\n    const toCheck = prefix ? `${prefix}${upperProp}` : property;\n    if (typeof document.body.style[toCheck] !== 'undefined') {\n      return toCheck;\n    }\n  }\n  return null;\n}\n","import isModifierEnabled from '../utils/isModifierEnabled';\nimport getSupportedPropertyName from '../utils/getSupportedPropertyName';\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nexport default function destroy() {\n  this.state.isDestroyed = true;\n\n  // touch DOM only if `applyStyle` modifier is enabled\n  if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n    this.popper.removeAttribute('x-placement');\n    this.popper.style.position = '';\n    this.popper.style.top = '';\n    this.popper.style.left = '';\n    this.popper.style.right = '';\n    this.popper.style.bottom = '';\n    this.popper.style.willChange = '';\n    this.popper.style[getSupportedPropertyName('transform')] = '';\n  }\n\n  this.disableEventListeners();\n\n  // remove the popper if user explicitly asked for the deletion on destroy\n  // do not use `remove` because IE11 doesn't support it\n  if (this.options.removeOnDestroy) {\n    this.popper.parentNode.removeChild(this.popper);\n  }\n  return this;\n}\n","/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nexport default function getWindow(element) {\n  const ownerDocument = element.ownerDocument;\n  return ownerDocument ? ownerDocument.defaultView : window;\n}\n","import getScrollParent from './getScrollParent';\nimport getWindow from './getWindow';\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n  const isBody = scrollParent.nodeName === 'BODY';\n  const target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n  target.addEventListener(event, callback, { passive: true });\n\n  if (!isBody) {\n    attachToScrollParents(\n      getScrollParent(target.parentNode),\n      event,\n      callback,\n      scrollParents\n    );\n  }\n  scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nexport default function setupEventListeners(\n  reference,\n  options,\n  state,\n  updateBound\n) {\n  // Resize event listener on window\n  state.updateBound = updateBound;\n  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n  // Scroll event listener on scroll parents\n  const scrollElement = getScrollParent(reference);\n  attachToScrollParents(\n    scrollElement,\n    'scroll',\n    state.updateBound,\n    state.scrollParents\n  );\n  state.scrollElement = scrollElement;\n  state.eventsEnabled = true;\n\n  return state;\n}\n","import setupEventListeners from '../utils/setupEventListeners';\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nexport default function enableEventListeners() {\n  if (!this.state.eventsEnabled) {\n    this.state = setupEventListeners(\n      this.reference,\n      this.options,\n      this.state,\n      this.scheduleUpdate\n    );\n  }\n}\n","import removeEventListeners from '../utils/removeEventListeners';\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nexport default function disableEventListeners() {\n  if (this.state.eventsEnabled) {\n    cancelAnimationFrame(this.scheduleUpdate);\n    this.state = removeEventListeners(this.reference, this.state);\n  }\n}\n","import getWindow from './getWindow';\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nexport default function removeEventListeners(reference, state) {\n  // Remove resize event listener on window\n  getWindow(reference).removeEventListener('resize', state.updateBound);\n\n  // Remove scroll event listener on scroll parents\n  state.scrollParents.forEach(target => {\n    target.removeEventListener('scroll', state.updateBound);\n  });\n\n  // Reset state\n  state.updateBound = null;\n  state.scrollParents = [];\n  state.scrollElement = null;\n  state.eventsEnabled = false;\n  return state;\n}\n","/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nexport default function isNumeric(n) {\n  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n","import isNumeric from './isNumeric';\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nexport default function setStyles(element, styles) {\n  Object.keys(styles).forEach(prop => {\n    let unit = '';\n    // add unit if the value is numeric and is one of the following\n    if (\n      ['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !==\n        -1 &&\n      isNumeric(styles[prop])\n    ) {\n      unit = 'px';\n    }\n    element.style[prop] = styles[prop] + unit;\n  });\n}\n","import getSupportedPropertyName from '../utils/getSupportedPropertyName';\nimport find from '../utils/find';\nimport getOffsetParent from '../utils/getOffsetParent';\nimport getBoundingClientRect from '../utils/getBoundingClientRect';\nimport getRoundedOffsets from '../utils/getRoundedOffsets';\nimport isBrowser from '../utils/isBrowser';\n\nconst isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function computeStyle(data, options) {\n  const { x, y } = options;\n  const { popper } = data.offsets;\n\n  // Remove this legacy support in Popper.js v2\n  const legacyGpuAccelerationOption = find(\n    data.instance.modifiers,\n    modifier => modifier.name === 'applyStyle'\n  ).gpuAcceleration;\n  if (legacyGpuAccelerationOption !== undefined) {\n    console.warn(\n      'WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'\n    );\n  }\n  const gpuAcceleration =\n    legacyGpuAccelerationOption !== undefined\n      ? legacyGpuAccelerationOption\n      : options.gpuAcceleration;\n\n  const offsetParent = getOffsetParent(data.instance.popper);\n  const offsetParentRect = getBoundingClientRect(offsetParent);\n\n  // Styles\n  const styles = {\n    position: popper.position,\n  };\n\n  const offsets = getRoundedOffsets(\n    data,\n    window.devicePixelRatio < 2 || !isFirefox\n  );\n\n  const sideA = x === 'bottom' ? 'top' : 'bottom';\n  const sideB = y === 'right' ? 'left' : 'right';\n\n  // if gpuAcceleration is set to `true` and transform is supported,\n  //  we use `translate3d` to apply the position to the popper we\n  // automatically use the supported prefixed version if needed\n  const prefixedProperty = getSupportedPropertyName('transform');\n\n  // now, let's make a step back and look at this code closely (wtf?)\n  // If the content of the popper grows once it's been positioned, it\n  // may happen that the popper gets misplaced because of the new content\n  // overflowing its reference element\n  // To avoid this problem, we provide two options (x and y), which allow\n  // the consumer to define the offset origin.\n  // If we position a popper on top of a reference element, we can set\n  // `x` to `top` to make the popper grow towards its top instead of\n  // its bottom.\n  let left, top;\n  if (sideA === 'bottom') {\n    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n    // and not the bottom of the html element\n    if (offsetParent.nodeName === 'HTML') {\n      top = -offsetParent.clientHeight + offsets.bottom;\n    } else {\n      top = -offsetParentRect.height + offsets.bottom;\n    }\n  } else {\n    top = offsets.top;\n  }\n  if (sideB === 'right') {\n    if (offsetParent.nodeName === 'HTML') {\n      left = -offsetParent.clientWidth + offsets.right;\n    } else {\n      left = -offsetParentRect.width + offsets.right;\n    }\n  } else {\n    left = offsets.left;\n  }\n  if (gpuAcceleration && prefixedProperty) {\n    styles[prefixedProperty] = `translate3d(${left}px, ${top}px, 0)`;\n    styles[sideA] = 0;\n    styles[sideB] = 0;\n    styles.willChange = 'transform';\n  } else {\n    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n    const invertTop = sideA === 'bottom' ? -1 : 1;\n    const invertLeft = sideB === 'right' ? -1 : 1;\n    styles[sideA] = top * invertTop;\n    styles[sideB] = left * invertLeft;\n    styles.willChange = `${sideA}, ${sideB}`;\n  }\n\n  // Attributes\n  const attributes = {\n    'x-placement': data.placement,\n  };\n\n  // Update `data` attributes, styles and arrowStyles\n  data.attributes = { ...attributes, ...data.attributes };\n  data.styles = { ...styles, ...data.styles };\n  data.arrowStyles = { ...data.offsets.arrow, ...data.arrowStyles };\n\n  return data;\n}\n","import find from './find';\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nexport default function isModifierRequired(\n  modifiers,\n  requestingName,\n  requestedName\n) {\n  const requesting = find(modifiers, ({ name }) => name === requestingName);\n\n  const isRequired =\n    !!requesting &&\n    modifiers.some(modifier => {\n      return (\n        modifier.name === requestedName &&\n        modifier.enabled &&\n        modifier.order < requesting.order\n      );\n    });\n\n  if (!isRequired) {\n    const requesting = `\\`${requestingName}\\``;\n    const requested = `\\`${requestedName}\\``;\n    console.warn(\n      `${requested} modifier is required by ${requesting} modifier in order to work, be sure to include it before ${requesting}!`\n    );\n  }\n  return isRequired;\n}\n","/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nexport default [\n  'auto-start',\n  'auto',\n  'auto-end',\n  'top-start',\n  'top',\n  'top-end',\n  'right-start',\n  'right',\n  'right-end',\n  'bottom-end',\n  'bottom',\n  'bottom-start',\n  'left-end',\n  'left',\n  'left-start',\n];\n","import placements from '../methods/placements';\n\n// Get rid of `auto` `auto-start` and `auto-end`\nconst validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nexport default function clockwise(placement, counter = false) {\n  const index = validPlacements.indexOf(placement);\n  const arr = validPlacements\n    .slice(index + 1)\n    .concat(validPlacements.slice(0, index));\n  return counter ? arr.reverse() : arr;\n}\n","import applyStyle, { applyStyleOnLoad } from './applyStyle';\nimport computeStyle from './computeStyle';\nimport arrow from './arrow';\nimport flip from './flip';\nimport keepTogether from './keepTogether';\nimport offset from './offset';\nimport preventOverflow from './preventOverflow';\nimport shift from './shift';\nimport hide from './hide';\nimport inner from './inner';\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nexport default {\n  /**\n   * Modifier used to shift the popper on the start or end of its reference\n   * element.<br />\n   * It will read the variation of the `placement` property.<br />\n   * It can be one either `-end` or `-start`.\n   * @memberof modifiers\n   * @inner\n   */\n  shift: {\n    /** @prop {number} order=100 - Index used to define the order of execution */\n    order: 100,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: shift,\n  },\n\n  /**\n   * The `offset` modifier can shift your popper on both its axis.\n   *\n   * It accepts the following units:\n   * - `px` or unit-less, interpreted as pixels\n   * - `%` or `%r`, percentage relative to the length of the reference element\n   * - `%p`, percentage relative to the length of the popper element\n   * - `vw`, CSS viewport width unit\n   * - `vh`, CSS viewport height unit\n   *\n   * For length is intended the main axis relative to the placement of the popper.<br />\n   * This means that if the placement is `top` or `bottom`, the length will be the\n   * `width`. In case of `left` or `right`, it will be the `height`.\n   *\n   * You can provide a single value (as `Number` or `String`), or a pair of values\n   * as `String` divided by a comma or one (or more) white spaces.<br />\n   * The latter is a deprecated method because it leads to confusion and will be\n   * removed in v2.<br />\n   * Additionally, it accepts additions and subtractions between different units.\n   * Note that multiplications and divisions aren't supported.\n   *\n   * Valid examples are:\n   * ```\n   * 10\n   * '10%'\n   * '10, 10'\n   * '10%, 10'\n   * '10 + 10%'\n   * '10 - 5vh + 3%'\n   * '-10px + 5vh, 5px - 6%'\n   * ```\n   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  offset: {\n    /** @prop {number} order=200 - Index used to define the order of execution */\n    order: 200,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: offset,\n    /** @prop {Number|String} offset=0\n     * The offset value as described in the modifier description\n     */\n    offset: 0,\n  },\n\n  /**\n   * Modifier used to prevent the popper from being positioned outside the boundary.\n   *\n   * A scenario exists where the reference itself is not within the boundaries.<br />\n   * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n   * In this case we need to decide whether the popper should either:\n   *\n   * - detach from the reference and remain \"trapped\" in the boundaries, or\n   * - if it should ignore the boundary and \"escape with its reference\"\n   *\n   * When `escapeWithReference` is set to`true` and reference is completely\n   * outside its boundaries, the popper will overflow (or completely leave)\n   * the boundaries in order to remain attached to the edge of the reference.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  preventOverflow: {\n    /** @prop {number} order=300 - Index used to define the order of execution */\n    order: 300,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: preventOverflow,\n    /**\n     * @prop {Array} [priority=['left','right','top','bottom']]\n     * Popper will try to prevent overflow following these priorities by default,\n     * then, it could overflow on the left and on top of the `boundariesElement`\n     */\n    priority: ['left', 'right', 'top', 'bottom'],\n    /**\n     * @prop {number} padding=5\n     * Amount of pixel used to define a minimum distance between the boundaries\n     * and the popper. This makes sure the popper always has a little padding\n     * between the edges of its container\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='scrollParent'\n     * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n     * `viewport` or any DOM element.\n     */\n    boundariesElement: 'scrollParent',\n  },\n\n  /**\n   * Modifier used to make sure the reference and its popper stay near each other\n   * without leaving any gap between the two. Especially useful when the arrow is\n   * enabled and you want to ensure that it points to its reference element.\n   * It cares only about the first axis. You can still have poppers with margin\n   * between the popper and its reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  keepTogether: {\n    /** @prop {number} order=400 - Index used to define the order of execution */\n    order: 400,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: keepTogether,\n  },\n\n  /**\n   * This modifier is used to move the `arrowElement` of the popper to make\n   * sure it is positioned between the reference element and its popper element.\n   * It will read the outer size of the `arrowElement` node to detect how many\n   * pixels of conjunction are needed.\n   *\n   * It has no effect if no `arrowElement` is provided.\n   * @memberof modifiers\n   * @inner\n   */\n  arrow: {\n    /** @prop {number} order=500 - Index used to define the order of execution */\n    order: 500,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: arrow,\n    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n    element: '[x-arrow]',\n  },\n\n  /**\n   * Modifier used to flip the popper's placement when it starts to overlap its\n   * reference element.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   *\n   * **NOTE:** this modifier will interrupt the current update cycle and will\n   * restart it if it detects the need to flip the placement.\n   * @memberof modifiers\n   * @inner\n   */\n  flip: {\n    /** @prop {number} order=600 - Index used to define the order of execution */\n    order: 600,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: flip,\n    /**\n     * @prop {String|Array} behavior='flip'\n     * The behavior used to change the popper's placement. It can be one of\n     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n     * placements (with optional variations)\n     */\n    behavior: 'flip',\n    /**\n     * @prop {number} padding=5\n     * The popper will flip if it hits the edges of the `boundariesElement`\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='viewport'\n     * The element which will define the boundaries of the popper position.\n     * The popper will never be placed outside of the defined boundaries\n     * (except if `keepTogether` is enabled)\n     */\n    boundariesElement: 'viewport',\n    /**\n     * @prop {Boolean} flipVariations=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the reference element overlaps its boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariations: false,\n    /**\n     * @prop {Boolean} flipVariationsByContent=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the popper element overlaps its reference boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariationsByContent: false,\n  },\n\n  /**\n   * Modifier used to make the popper flow toward the inner of the reference element.\n   * By default, when this modifier is disabled, the popper will be placed outside\n   * the reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  inner: {\n    /** @prop {number} order=700 - Index used to define the order of execution */\n    order: 700,\n    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n    enabled: false,\n    /** @prop {ModifierFn} */\n    fn: inner,\n  },\n\n  /**\n   * Modifier used to hide the popper when its reference element is outside of the\n   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n   * be used to hide with a CSS selector the popper when its reference is\n   * out of boundaries.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   * @memberof modifiers\n   * @inner\n   */\n  hide: {\n    /** @prop {number} order=800 - Index used to define the order of execution */\n    order: 800,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: hide,\n  },\n\n  /**\n   * Computes the style that will be applied to the popper element to gets\n   * properly positioned.\n   *\n   * Note that this modifier will not touch the DOM, it just prepares the styles\n   * so that `applyStyle` modifier can apply it. This separation is useful\n   * in case you need to replace `applyStyle` with a custom implementation.\n   *\n   * This modifier has `850` as `order` value to maintain backward compatibility\n   * with previous versions of Popper.js. Expect the modifiers ordering method\n   * to change in future major versions of the library.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  computeStyle: {\n    /** @prop {number} order=850 - Index used to define the order of execution */\n    order: 850,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: computeStyle,\n    /**\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: true,\n    /**\n     * @prop {string} [x='bottom']\n     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n     * Change this if your popper should grow in a direction different from `bottom`\n     */\n    x: 'bottom',\n    /**\n     * @prop {string} [x='left']\n     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n     * Change this if your popper should grow in a direction different from `right`\n     */\n    y: 'right',\n  },\n\n  /**\n   * Applies the computed styles to the popper element.\n   *\n   * All the DOM manipulations are limited to this modifier. This is useful in case\n   * you want to integrate Popper.js inside a framework or view library and you\n   * want to delegate all the DOM manipulations to it.\n   *\n   * Note that if you disable this modifier, you must make sure the popper element\n   * has its position set to `absolute` before Popper.js can do its work!\n   *\n   * Just disable this modifier and define your own to achieve the desired effect.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  applyStyle: {\n    /** @prop {number} order=900 - Index used to define the order of execution */\n    order: 900,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: applyStyle,\n    /** @prop {Function} */\n    onLoad: applyStyleOnLoad,\n    /**\n     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: undefined,\n  },\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n","/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function shift(data) {\n  const placement = data.placement;\n  const basePlacement = placement.split('-')[0];\n  const shiftvariation = placement.split('-')[1];\n\n  // if shift shiftvariation is specified, run the modifier\n  if (shiftvariation) {\n    const { reference, popper } = data.offsets;\n    const isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n    const side = isVertical ? 'left' : 'top';\n    const measurement = isVertical ? 'width' : 'height';\n\n    const shiftOffsets = {\n      start: { [side]: reference[side] },\n      end: {\n        [side]: reference[side] + reference[measurement] - popper[measurement],\n      },\n    };\n\n    data.offsets.popper = { ...popper, ...shiftOffsets[shiftvariation] };\n  }\n\n  return data;\n}\n","import isNumeric from '../utils/isNumeric';\nimport getClientRect from '../utils/getClientRect';\nimport find from '../utils/find';\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nexport function toValue(str, measurement, popperOffsets, referenceOffsets) {\n  // separate value from unit\n  const split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n  const value = +split[1];\n  const unit = split[2];\n\n  // If it's not a number it's an operator, I guess\n  if (!value) {\n    return str;\n  }\n\n  if (unit.indexOf('%') === 0) {\n    let element;\n    switch (unit) {\n      case '%p':\n        element = popperOffsets;\n        break;\n      case '%':\n      case '%r':\n      default:\n        element = referenceOffsets;\n    }\n\n    const rect = getClientRect(element);\n    return rect[measurement] / 100 * value;\n  } else if (unit === 'vh' || unit === 'vw') {\n    // if is a vh or vw, we calculate the size based on the viewport\n    let size;\n    if (unit === 'vh') {\n      size = Math.max(\n        document.documentElement.clientHeight,\n        window.innerHeight || 0\n      );\n    } else {\n      size = Math.max(\n        document.documentElement.clientWidth,\n        window.innerWidth || 0\n      );\n    }\n    return size / 100 * value;\n  } else {\n    // if is an explicit pixel unit, we get rid of the unit and keep the value\n    // if is an implicit unit, it's px, and we return just the value\n    return value;\n  }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nexport function parseOffset(\n  offset,\n  popperOffsets,\n  referenceOffsets,\n  basePlacement\n) {\n  const offsets = [0, 0];\n\n  // Use height if placement is left or right and index is 0 otherwise use width\n  // in this way the first offset will use an axis and the second one\n  // will use the other one\n  const useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n  // Split the offset string to obtain a list of values and operands\n  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n  const fragments = offset.split(/(\\+|\\-)/).map(frag => frag.trim());\n\n  // Detect if the offset string contains a pair of values or a single one\n  // they could be separated by comma or space\n  const divider = fragments.indexOf(\n    find(fragments, frag => frag.search(/,|\\s/) !== -1)\n  );\n\n  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n    console.warn(\n      'Offsets separated by white space(s) are deprecated, use a comma (,) instead.'\n    );\n  }\n\n  // If divider is found, we divide the list of values and operands to divide\n  // them by ofset X and Y.\n  const splitRegex = /\\s*,\\s*|\\s+/;\n  let ops = divider !== -1\n    ? [\n        fragments\n          .slice(0, divider)\n          .concat([fragments[divider].split(splitRegex)[0]]),\n        [fragments[divider].split(splitRegex)[1]].concat(\n          fragments.slice(divider + 1)\n        ),\n      ]\n    : [fragments];\n\n  // Convert the values with units to absolute pixels to allow our computations\n  ops = ops.map((op, index) => {\n    // Most of the units rely on the orientation of the popper\n    const measurement = (index === 1 ? !useHeight : useHeight)\n      ? 'height'\n      : 'width';\n    let mergeWithPrevious = false;\n    return (\n      op\n        // This aggregates any `+` or `-` sign that aren't considered operators\n        // e.g.: 10 + +5 => [10, +, +5]\n        .reduce((a, b) => {\n          if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n            a[a.length - 1] = b;\n            mergeWithPrevious = true;\n            return a;\n          } else if (mergeWithPrevious) {\n            a[a.length - 1] += b;\n            mergeWithPrevious = false;\n            return a;\n          } else {\n            return a.concat(b);\n          }\n        }, [])\n        // Here we convert the string values into number values (in px)\n        .map(str => toValue(str, measurement, popperOffsets, referenceOffsets))\n    );\n  });\n\n  // Loop trough the offsets arrays and execute the operations\n  ops.forEach((op, index) => {\n    op.forEach((frag, index2) => {\n      if (isNumeric(frag)) {\n        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n      }\n    });\n  });\n  return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nexport default function offset(data, { offset }) {\n  const { placement, offsets: { popper, reference } } = data;\n  const basePlacement = placement.split('-')[0];\n\n  let offsets;\n  if (isNumeric(+offset)) {\n    offsets = [+offset, 0];\n  } else {\n    offsets = parseOffset(offset, popper, reference, basePlacement);\n  }\n\n  if (basePlacement === 'left') {\n    popper.top += offsets[0];\n    popper.left -= offsets[1];\n  } else if (basePlacement === 'right') {\n    popper.top += offsets[0];\n    popper.left += offsets[1];\n  } else if (basePlacement === 'top') {\n    popper.left += offsets[0];\n    popper.top -= offsets[1];\n  } else if (basePlacement === 'bottom') {\n    popper.left += offsets[0];\n    popper.top += offsets[1];\n  }\n\n  data.popper = popper;\n  return data;\n}\n","import getOffsetParent from '../utils/getOffsetParent';\nimport getBoundaries from '../utils/getBoundaries';\nimport getSupportedPropertyName from '../utils/getSupportedPropertyName';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function preventOverflow(data, options) {\n  let boundariesElement =\n    options.boundariesElement || getOffsetParent(data.instance.popper);\n\n  // If offsetParent is the reference element, we really want to\n  // go one step up and use the next offsetParent as reference to\n  // avoid to make this modifier completely useless and look like broken\n  if (data.instance.reference === boundariesElement) {\n    boundariesElement = getOffsetParent(boundariesElement);\n  }\n\n  // NOTE: DOM access here\n  // resets the popper's position so that the document size can be calculated excluding\n  // the size of the popper element itself\n  const transformProp = getSupportedPropertyName('transform');\n  const popperStyles = data.instance.popper.style; // assignment to help minification\n  const { top, left, [transformProp]: transform } = popperStyles;\n  popperStyles.top = '';\n  popperStyles.left = '';\n  popperStyles[transformProp] = '';\n\n  const boundaries = getBoundaries(\n    data.instance.popper,\n    data.instance.reference,\n    options.padding,\n    boundariesElement,\n    data.positionFixed\n  );\n\n  // NOTE: DOM access here\n  // restores the original style properties after the offsets have been computed\n  popperStyles.top = top;\n  popperStyles.left = left;\n  popperStyles[transformProp] = transform;\n\n  options.boundaries = boundaries;\n\n  const order = options.priority;\n  let popper = data.offsets.popper;\n\n  const check = {\n    primary(placement) {\n      let value = popper[placement];\n      if (\n        popper[placement] < boundaries[placement] &&\n        !options.escapeWithReference\n      ) {\n        value = Math.max(popper[placement], boundaries[placement]);\n      }\n      return { [placement]: value };\n    },\n    secondary(placement) {\n      const mainSide = placement === 'right' ? 'left' : 'top';\n      let value = popper[mainSide];\n      if (\n        popper[placement] > boundaries[placement] &&\n        !options.escapeWithReference\n      ) {\n        value = Math.min(\n          popper[mainSide],\n          boundaries[placement] -\n            (placement === 'right' ? popper.width : popper.height)\n        );\n      }\n      return { [mainSide]: value };\n    },\n  };\n\n  order.forEach(placement => {\n    const side =\n      ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n    popper = { ...popper, ...check[side](placement) };\n  });\n\n  data.offsets.popper = popper;\n\n  return data;\n}\n","/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function keepTogether(data) {\n  const { popper, reference } = data.offsets;\n  const placement = data.placement.split('-')[0];\n  const floor = Math.floor;\n  const isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n  const side = isVertical ? 'right' : 'bottom';\n  const opSide = isVertical ? 'left' : 'top';\n  const measurement = isVertical ? 'width' : 'height';\n\n  if (popper[side] < floor(reference[opSide])) {\n    data.offsets.popper[opSide] =\n      floor(reference[opSide]) - popper[measurement];\n  }\n  if (popper[opSide] > floor(reference[side])) {\n    data.offsets.popper[opSide] = floor(reference[side]);\n  }\n\n  return data;\n}\n","import getClientRect from '../utils/getClientRect';\nimport getOuterSizes from '../utils/getOuterSizes';\nimport isModifierRequired from '../utils/isModifierRequired';\nimport getStyleComputedProperty from '../utils/getStyleComputedProperty';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function arrow(data, options) {\n  // arrow depends on keepTogether in order to work\n  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n    return data;\n  }\n\n  let arrowElement = options.element;\n\n  // if arrowElement is a string, suppose it's a CSS selector\n  if (typeof arrowElement === 'string') {\n    arrowElement = data.instance.popper.querySelector(arrowElement);\n\n    // if arrowElement is not found, don't run the modifier\n    if (!arrowElement) {\n      return data;\n    }\n  } else {\n    // if the arrowElement isn't a query selector we must check that the\n    // provided DOM node is child of its popper node\n    if (!data.instance.popper.contains(arrowElement)) {\n      console.warn(\n        'WARNING: `arrow.element` must be child of its popper element!'\n      );\n      return data;\n    }\n  }\n\n  const placement = data.placement.split('-')[0];\n  const { popper, reference } = data.offsets;\n  const isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n  const len = isVertical ? 'height' : 'width';\n  const sideCapitalized = isVertical ? 'Top' : 'Left';\n  const side = sideCapitalized.toLowerCase();\n  const altSide = isVertical ? 'left' : 'top';\n  const opSide = isVertical ? 'bottom' : 'right';\n  const arrowElementSize = getOuterSizes(arrowElement)[len];\n\n  //\n  // extends keepTogether behavior making sure the popper and its\n  // reference have enough pixels in conjunction\n  //\n\n  // top/left side\n  if (reference[opSide] - arrowElementSize < popper[side]) {\n    data.offsets.popper[side] -=\n      popper[side] - (reference[opSide] - arrowElementSize);\n  }\n  // bottom/right side\n  if (reference[side] + arrowElementSize > popper[opSide]) {\n    data.offsets.popper[side] +=\n      reference[side] + arrowElementSize - popper[opSide];\n  }\n  data.offsets.popper = getClientRect(data.offsets.popper);\n\n  // compute center of the popper\n  const center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n  // Compute the sideValue using the updated popper offsets\n  // take popper margin in account because we don't have this info available\n  const css = getStyleComputedProperty(data.instance.popper);\n  const popperMarginSide = parseFloat(css[`margin${sideCapitalized}`]);\n  const popperBorderSide = parseFloat(css[`border${sideCapitalized}Width`]);\n  let sideValue =\n    center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n  // prevent arrowElement from being placed not contiguously to its popper\n  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n  data.arrowElement = arrowElement;\n  data.offsets.arrow = {\n    [side]: Math.round(sideValue),\n    [altSide]: '', // make sure to unset any eventual altSide value from the DOM node\n  };\n\n  return data;\n}\n","import getOppositePlacement from '../utils/getOppositePlacement';\nimport getOppositeVariation from '../utils/getOppositeVariation';\nimport getPopperOffsets from '../utils/getPopperOffsets';\nimport runModifiers from '../utils/runModifiers';\nimport getBoundaries from '../utils/getBoundaries';\nimport isModifierEnabled from '../utils/isModifierEnabled';\nimport clockwise from '../utils/clockwise';\n\nconst BEHAVIORS = {\n  FLIP: 'flip',\n  CLOCKWISE: 'clockwise',\n  COUNTERCLOCKWISE: 'counterclockwise',\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function flip(data, options) {\n  // if `inner` modifier is enabled, we can't use the `flip` modifier\n  if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n    return data;\n  }\n\n  if (data.flipped && data.placement === data.originalPlacement) {\n    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n    return data;\n  }\n\n  const boundaries = getBoundaries(\n    data.instance.popper,\n    data.instance.reference,\n    options.padding,\n    options.boundariesElement,\n    data.positionFixed\n  );\n\n  let placement = data.placement.split('-')[0];\n  let placementOpposite = getOppositePlacement(placement);\n  let variation = data.placement.split('-')[1] || '';\n\n  let flipOrder = [];\n\n  switch (options.behavior) {\n    case BEHAVIORS.FLIP:\n      flipOrder = [placement, placementOpposite];\n      break;\n    case BEHAVIORS.CLOCKWISE:\n      flipOrder = clockwise(placement);\n      break;\n    case BEHAVIORS.COUNTERCLOCKWISE:\n      flipOrder = clockwise(placement, true);\n      break;\n    default:\n      flipOrder = options.behavior;\n  }\n\n  flipOrder.forEach((step, index) => {\n    if (placement !== step || flipOrder.length === index + 1) {\n      return data;\n    }\n\n    placement = data.placement.split('-')[0];\n    placementOpposite = getOppositePlacement(placement);\n\n    const popperOffsets = data.offsets.popper;\n    const refOffsets = data.offsets.reference;\n\n    // using floor because the reference offsets may contain decimals we are not going to consider here\n    const floor = Math.floor;\n    const overlapsRef =\n      (placement === 'left' &&\n        floor(popperOffsets.right) > floor(refOffsets.left)) ||\n      (placement === 'right' &&\n        floor(popperOffsets.left) < floor(refOffsets.right)) ||\n      (placement === 'top' &&\n        floor(popperOffsets.bottom) > floor(refOffsets.top)) ||\n      (placement === 'bottom' &&\n        floor(popperOffsets.top) < floor(refOffsets.bottom));\n\n    const overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n    const overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n    const overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n    const overflowsBottom =\n      floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n    const overflowsBoundaries =\n      (placement === 'left' && overflowsLeft) ||\n      (placement === 'right' && overflowsRight) ||\n      (placement === 'top' && overflowsTop) ||\n      (placement === 'bottom' && overflowsBottom);\n\n    // flip the variation if required\n    const isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n    // flips variation if reference element overflows boundaries\n    const flippedVariationByRef =\n      !!options.flipVariations &&\n      ((isVertical && variation === 'start' && overflowsLeft) ||\n        (isVertical && variation === 'end' && overflowsRight) ||\n        (!isVertical && variation === 'start' && overflowsTop) ||\n        (!isVertical && variation === 'end' && overflowsBottom));\n\n    // flips variation if popper content overflows boundaries\n    const flippedVariationByContent =\n      !!options.flipVariationsByContent &&\n      ((isVertical && variation === 'start' && overflowsRight) ||\n        (isVertical && variation === 'end' && overflowsLeft) ||\n        (!isVertical && variation === 'start' && overflowsBottom) ||\n        (!isVertical && variation === 'end' && overflowsTop));\n\n    const flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n    if (overlapsRef || overflowsBoundaries || flippedVariation) {\n      // this boolean to detect any flip loop\n      data.flipped = true;\n\n      if (overlapsRef || overflowsBoundaries) {\n        placement = flipOrder[index + 1];\n      }\n\n      if (flippedVariation) {\n        variation = getOppositeVariation(variation);\n      }\n\n      data.placement = placement + (variation ? '-' + variation : '');\n\n      // this object contains `position`, we want to preserve it along with\n      // any additional property we may add in the future\n      data.offsets.popper = {\n        ...data.offsets.popper,\n        ...getPopperOffsets(\n          data.instance.popper,\n          data.offsets.reference,\n          data.placement\n        ),\n      };\n\n      data = runModifiers(data.instance.modifiers, data, 'flip');\n    }\n  });\n  return data;\n}\n","/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nexport default function getOppositeVariation(variation) {\n  if (variation === 'end') {\n    return 'start';\n  } else if (variation === 'start') {\n    return 'end';\n  }\n  return variation;\n}\n","import getClientRect from '../utils/getClientRect';\nimport getOppositePlacement from '../utils/getOppositePlacement';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function inner(data) {\n  const placement = data.placement;\n  const basePlacement = placement.split('-')[0];\n  const { popper, reference } = data.offsets;\n  const isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n  const subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n  popper[isHoriz ? 'left' : 'top'] =\n    reference[basePlacement] -\n    (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n  data.placement = getOppositePlacement(placement);\n  data.offsets.popper = getClientRect(popper);\n\n  return data;\n}\n","import isModifierRequired from '../utils/isModifierRequired';\nimport find from '../utils/find';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function hide(data) {\n  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n    return data;\n  }\n\n  const refRect = data.offsets.reference;\n  const bound = find(\n    data.instance.modifiers,\n    modifier => modifier.name === 'preventOverflow'\n  ).boundaries;\n\n  if (\n    refRect.bottom < bound.top ||\n    refRect.left > bound.right ||\n    refRect.top > bound.bottom ||\n    refRect.right < bound.left\n  ) {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === true) {\n      return data;\n    }\n\n    data.hide = true;\n    data.attributes['x-out-of-boundaries'] = '';\n  } else {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === false) {\n      return data;\n    }\n\n    data.hide = false;\n    data.attributes['x-out-of-boundaries'] = false;\n  }\n\n  return data;\n}\n","/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nexport default function getRoundedOffsets(data, shouldRound) {\n  const { popper, reference } = data.offsets;\n  const { round, floor } = Math;\n  const noRound = v => v;\n  \n  const referenceWidth = round(reference.width);\n  const popperWidth = round(popper.width);\n  \n  const isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n  const isVariation = data.placement.indexOf('-') !== -1;\n  const sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n  const bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n  const horizontalToInteger = !shouldRound\n    ? noRound\n    : isVertical || isVariation || sameWidthParity\n    ? round\n    : floor;\n  const verticalToInteger = !shouldRound ? noRound : round;\n\n  return {\n    left: horizontalToInteger(\n      bothOddWidth && !isVariation && shouldRound\n        ? popper.left - 1\n        : popper.left\n    ),\n    top: verticalToInteger(popper.top),\n    bottom: verticalToInteger(popper.bottom),\n    right: horizontalToInteger(popper.right),\n  };\n}\n","import setStyles from '../utils/setStyles';\nimport setAttributes from '../utils/setAttributes';\nimport getReferenceOffsets from '../utils/getReferenceOffsets';\nimport computeAutoPlacement from '../utils/computeAutoPlacement';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nexport default function applyStyle(data) {\n  // any property present in `data.styles` will be applied to the popper,\n  // in this way we can make the 3rd party modifiers add custom styles to it\n  // Be aware, modifiers could override the properties defined in the previous\n  // lines of this modifier!\n  setStyles(data.instance.popper, data.styles);\n\n  // any property present in `data.attributes` will be applied to the popper,\n  // they will be set as HTML attributes of the element\n  setAttributes(data.instance.popper, data.attributes);\n\n  // if arrowElement is defined and arrowStyles has some properties\n  if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n    setStyles(data.arrowElement, data.arrowStyles);\n  }\n\n  return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nexport function applyStyleOnLoad(\n  reference,\n  popper,\n  options,\n  modifierOptions,\n  state\n) {\n  // compute reference element offsets\n  const referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  const placement = computeAutoPlacement(\n    options.placement,\n    referenceOffsets,\n    popper,\n    reference,\n    options.modifiers.flip.boundariesElement,\n    options.modifiers.flip.padding\n  );\n\n  popper.setAttribute('x-placement', placement);\n\n  // Apply `position` to popper before anything else because\n  // without the position applied we can't guarantee correct computations\n  setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n  return options;\n}\n","/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nexport default function setAttributes(element, attributes) {\n  Object.keys(attributes).forEach(function(prop) {\n    const value = attributes[prop];\n    if (value !== false) {\n      element.setAttribute(prop, attributes[prop]);\n    } else {\n      element.removeAttribute(prop);\n    }\n  });\n}\n","import modifiers from '../modifiers/index';\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n *   modifiers: {\n *     preventOverflow: { enabled: false }\n *   }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nexport default {\n  /**\n   * Popper's placement.\n   * @prop {Popper.placements} placement='bottom'\n   */\n  placement: 'bottom',\n\n  /**\n   * Set this to true if you want popper to position it self in 'fixed' mode\n   * @prop {Boolean} positionFixed=false\n   */\n  positionFixed: false,\n\n  /**\n   * Whether events (resize, scroll) are initially enabled.\n   * @prop {Boolean} eventsEnabled=true\n   */\n  eventsEnabled: true,\n\n  /**\n   * Set to true if you want to automatically remove the popper when\n   * you call the `destroy` method.\n   * @prop {Boolean} removeOnDestroy=false\n   */\n  removeOnDestroy: false,\n\n  /**\n   * Callback called when the popper is created.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onCreate}\n   */\n  onCreate: () => {},\n\n  /**\n   * Callback called when the popper is updated. This callback is not called\n   * on the initialization/creation of the popper, but only on subsequent\n   * updates.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onUpdate}\n   */\n  onUpdate: () => {},\n\n  /**\n   * List of modifiers used to modify the offsets before they are applied to the popper.\n   * They provide most of the functionalities of Popper.js.\n   * @prop {modifiers}\n   */\n  modifiers,\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n","// Utils\nimport debounce from './utils/debounce';\nimport isFunction from './utils/isFunction';\n\n// Methods\nimport update from './methods/update';\nimport destroy from './methods/destroy';\nimport enableEventListeners from './methods/enableEventListeners';\nimport disableEventListeners from './methods/disableEventListeners';\nimport Defaults from './methods/defaults';\nimport placements from './methods/placements';\n\nexport default class Popper {\n  /**\n   * Creates a new Popper.js instance.\n   * @class Popper\n   * @param {Element|referenceObject} reference - The reference element used to position the popper\n   * @param {Element} popper - The HTML / XML element used as the popper\n   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n   * @return {Object} instance - The generated Popper.js instance\n   */\n  constructor(reference, popper, options = {}) {\n    // make update() debounced, so that it only runs at most once-per-tick\n    this.update = debounce(this.update.bind(this));\n\n    // with {} we create a new object with the options inside it\n    this.options = { ...Popper.Defaults, ...options };\n\n    // init state\n    this.state = {\n      isDestroyed: false,\n      isCreated: false,\n      scrollParents: [],\n    };\n\n    // get reference and popper elements (allow jQuery wrappers)\n    this.reference = reference && reference.jquery ? reference[0] : reference;\n    this.popper = popper && popper.jquery ? popper[0] : popper;\n\n    // Deep merge modifiers options\n    this.options.modifiers = {};\n    Object.keys({\n      ...Popper.Defaults.modifiers,\n      ...options.modifiers,\n    }).forEach(name => {\n      this.options.modifiers[name] = {\n        // If it's a built-in modifier, use it as base\n        ...(Popper.Defaults.modifiers[name] || {}),\n        // If there are custom options, override and merge with default ones\n        ...(options.modifiers ? options.modifiers[name] : {}),\n      };\n    });\n\n    // Refactoring modifiers' list (Object => Array)\n    this.modifiers = Object.keys(this.options.modifiers)\n      .map(name => ({\n        name,\n        ...this.options.modifiers[name],\n      }))\n      // sort the modifiers by order\n      .sort((a, b) => a.order - b.order);\n\n    // modifiers have the ability to execute arbitrary code when Popper.js get inited\n    // such code is executed in the same order of its modifier\n    // they could add new properties to their options configuration\n    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n    this.modifiers.forEach(modifierOptions => {\n      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n        modifierOptions.onLoad(\n          this.reference,\n          this.popper,\n          this.options,\n          modifierOptions,\n          this.state\n        );\n      }\n    });\n\n    // fire the first update to position the popper in the right place\n    this.update();\n\n    const eventsEnabled = this.options.eventsEnabled;\n    if (eventsEnabled) {\n      // setup event listeners, they will take care of update the position in specific situations\n      this.enableEventListeners();\n    }\n\n    this.state.eventsEnabled = eventsEnabled;\n  }\n\n  // We can't use class properties because they don't get listed in the\n  // class prototype and break stuff like Sinon stubs\n  update() {\n    return update.call(this);\n  }\n  destroy() {\n    return destroy.call(this);\n  }\n  enableEventListeners() {\n    return enableEventListeners.call(this);\n  }\n  disableEventListeners() {\n    return disableEventListeners.call(this);\n  }\n\n  /**\n   * Schedules an update. It will run on the next UI update available.\n   * @method scheduleUpdate\n   * @memberof Popper\n   */\n  scheduleUpdate = () => requestAnimationFrame(this.update);\n\n  /**\n   * Collection of utilities useful when writing custom modifiers.\n   * Starting from version 1.7, this method is available only if you\n   * include `popper-utils.js` before `popper.js`.\n   *\n   * **DEPRECATION**: This way to access PopperUtils is deprecated\n   * and will be removed in v2! Use the PopperUtils module directly instead.\n   * Due to the high instability of the methods contained in Utils, we can't\n   * guarantee them to follow semver. Use them at your own risk!\n   * @static\n   * @private\n   * @type {Object}\n   * @deprecated since version 1.8\n   * @member Utils\n   * @memberof Popper\n   */\n  static Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\n\n  static placements = placements;\n\n  static Defaults = Defaults;\n}\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n","/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nexport default function isFunction(functionToCheck) {\n  const getType = {};\n  return (\n    functionToCheck &&\n    getType.toString.call(functionToCheck) === '[object Function]'\n  );\n}\n","/*!\n * Viewer.js v1.11.7\n * https://fengyuanchen.github.io/viewerjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2024-11-24T04:32:19.116Z\n */\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Viewer = factory());\n})(this, (function () { 'use strict';\n\n  function _classCallCheck(a, n) {\n    if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n  }\n  function _defineProperties(e, r) {\n    for (var t = 0; t < r.length; t++) {\n      var o = r[t];\n      o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);\n    }\n  }\n  function _createClass(e, r, t) {\n    return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n      writable: !1\n    }), e;\n  }\n  function _defineProperty(e, r, t) {\n    return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n      value: t,\n      enumerable: !0,\n      configurable: !0,\n      writable: !0\n    }) : e[r] = t, e;\n  }\n  function ownKeys(e, r) {\n    var t = Object.keys(e);\n    if (Object.getOwnPropertySymbols) {\n      var o = Object.getOwnPropertySymbols(e);\n      r && (o = o.filter(function (r) {\n        return Object.getOwnPropertyDescriptor(e, r).enumerable;\n      })), t.push.apply(t, o);\n    }\n    return t;\n  }\n  function _objectSpread2(e) {\n    for (var r = 1; r < arguments.length; r++) {\n      var t = null != arguments[r] ? arguments[r] : {};\n      r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n        _defineProperty(e, r, t[r]);\n      }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n        Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n      });\n    }\n    return e;\n  }\n  function _toPrimitive(t, r) {\n    if (\"object\" != typeof t || !t) return t;\n    var e = t[Symbol.toPrimitive];\n    if (void 0 !== e) {\n      var i = e.call(t, r || \"default\");\n      if (\"object\" != typeof i) return i;\n      throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n    }\n    return (\"string\" === r ? String : Number)(t);\n  }\n  function _toPropertyKey(t) {\n    var i = _toPrimitive(t, \"string\");\n    return \"symbol\" == typeof i ? i : i + \"\";\n  }\n  function _typeof(o) {\n    \"@babel/helpers - typeof\";\n\n    return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n      return typeof o;\n    } : function (o) {\n      return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n    }, _typeof(o);\n  }\n\n  var DEFAULTS = {\n    /**\n     * Enable a modal backdrop, specify `static` for a backdrop\n     * which doesn't close the modal on click.\n     * @type {boolean}\n     */\n    backdrop: true,\n    /**\n     * Show the button on the top-right of the viewer.\n     * @type {boolean}\n     */\n    button: true,\n    /**\n     * Show the navbar.\n     * @type {boolean | number}\n     */\n    navbar: true,\n    /**\n     * Specify the visibility and the content of the title.\n     * @type {boolean | number | Function | Array}\n     */\n    title: true,\n    /**\n     * Show the toolbar.\n     * @type {boolean | number | Object}\n     */\n    toolbar: true,\n    /**\n     * Custom class name(s) to add to the viewer's root element.\n     * @type {string}\n     */\n    className: '',\n    /**\n     * Define where to put the viewer in modal mode.\n     * @type {string | Element}\n     */\n    container: 'body',\n    /**\n     * Filter the images for viewing. Return true if the image is viewable.\n     * @type {Function}\n     */\n    filter: null,\n    /**\n     * Enable to request fullscreen when play.\n     * {@link https://developer.mozilla.org/en-US/docs/Web/API/FullscreenOptions}\n     * @type {boolean|FullscreenOptions}\n     */\n    fullscreen: true,\n    /**\n     * Define the extra attributes to inherit from the original image.\n     * @type {Array}\n     */\n    inheritedAttributes: ['crossOrigin', 'decoding', 'isMap', 'loading', 'referrerPolicy', 'sizes', 'srcset', 'useMap'],\n    /**\n     * Define the initial coverage of the viewing image.\n     * @type {number}\n     */\n    initialCoverage: 0.9,\n    /**\n     * Define the initial index of the image for viewing.\n     * @type {number}\n     */\n    initialViewIndex: 0,\n    /**\n     * Enable inline mode.\n     * @type {boolean}\n     */\n    inline: false,\n    /**\n     * The amount of time to delay between automatically cycling an image when playing.\n     * @type {number}\n     */\n    interval: 5000,\n    /**\n     * Enable keyboard support.\n     * @type {boolean}\n     */\n    keyboard: true,\n    /**\n     * Focus the viewer when initialized.\n     * @type {boolean}\n     */\n    focus: true,\n    /**\n     * Indicate if show a loading spinner when load image or not.\n     * @type {boolean}\n     */\n    loading: true,\n    /**\n     * Indicate if enable loop viewing or not.\n     * @type {boolean}\n     */\n    loop: true,\n    /**\n     * Min width of the viewer in inline mode.\n     * @type {number}\n     */\n    minWidth: 200,\n    /**\n     * Min height of the viewer in inline mode.\n     * @type {number}\n     */\n    minHeight: 100,\n    /**\n     * Enable to move the image.\n     * @type {boolean}\n     */\n    movable: true,\n    /**\n     * Enable to rotate the image.\n     * @type {boolean}\n     */\n    rotatable: true,\n    /**\n     * Enable to scale the image.\n     * @type {boolean}\n     */\n    scalable: true,\n    /**\n     * Enable to zoom the image.\n     * @type {boolean}\n     */\n    zoomable: true,\n    /**\n     * Enable to zoom the current image by dragging on the touch screen.\n     * @type {boolean}\n     */\n    zoomOnTouch: true,\n    /**\n     * Enable to zoom the image by wheeling mouse.\n     * @type {boolean}\n     */\n    zoomOnWheel: true,\n    /**\n     * Enable to slide to the next or previous image by swiping on the touch screen.\n     * @type {boolean}\n     */\n    slideOnTouch: true,\n    /**\n     * Indicate if toggle the image size between its natural size\n     * and initial size when double click on the image or not.\n     * @type {boolean}\n     */\n    toggleOnDblclick: true,\n    /**\n     * Show the tooltip with image ratio (percentage) when zoom in or zoom out.\n     * @type {boolean}\n     */\n    tooltip: true,\n    /**\n     * Enable CSS3 Transition for some special elements.\n     * @type {boolean}\n     */\n    transition: true,\n    /**\n     * Define the CSS `z-index` value of viewer in modal mode.\n     * @type {number}\n     */\n    zIndex: 2015,\n    /**\n     * Define the CSS `z-index` value of viewer in inline mode.\n     * @type {number}\n     */\n    zIndexInline: 0,\n    /**\n     * Define the ratio when zoom the image by wheeling mouse.\n     * @type {number}\n     */\n    zoomRatio: 0.1,\n    /**\n     * Define the min ratio of the image when zoom out.\n     * @type {number}\n     */\n    minZoomRatio: 0.01,\n    /**\n     * Define the max ratio of the image when zoom in.\n     * @type {number}\n     */\n    maxZoomRatio: 100,\n    /**\n     * Define where to get the original image URL for viewing.\n     * @type {string | Function}\n     */\n    url: 'src',\n    /**\n     * Event shortcuts.\n     * @type {Function}\n     */\n    ready: null,\n    show: null,\n    shown: null,\n    hide: null,\n    hidden: null,\n    view: null,\n    viewed: null,\n    move: null,\n    moved: null,\n    rotate: null,\n    rotated: null,\n    scale: null,\n    scaled: null,\n    zoom: null,\n    zoomed: null,\n    play: null,\n    stop: null\n  };\n\n  var TEMPLATE = '<div class=\"viewer-container\" tabindex=\"-1\" touch-action=\"none\">' + '<div class=\"viewer-canvas\"></div>' + '<div class=\"viewer-footer\">' + '<div class=\"viewer-title\"></div>' + '<div class=\"viewer-toolbar\"></div>' + '<div class=\"viewer-navbar\">' + '<ul class=\"viewer-list\" role=\"navigation\"></ul>' + '</div>' + '</div>' + '<div class=\"viewer-tooltip\" role=\"alert\" aria-hidden=\"true\"></div>' + '<div class=\"viewer-button\" data-viewer-action=\"mix\" role=\"button\"></div>' + '<div class=\"viewer-player\"></div>' + '</div>';\n\n  var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n  var WINDOW = IS_BROWSER ? window : {};\n  var IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\n  var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\n  var NAMESPACE = 'viewer';\n\n  // Actions\n  var ACTION_MOVE = 'move';\n  var ACTION_SWITCH = 'switch';\n  var ACTION_ZOOM = 'zoom';\n\n  // Classes\n  var CLASS_ACTIVE = \"\".concat(NAMESPACE, \"-active\");\n  var CLASS_CLOSE = \"\".concat(NAMESPACE, \"-close\");\n  var CLASS_FADE = \"\".concat(NAMESPACE, \"-fade\");\n  var CLASS_FIXED = \"\".concat(NAMESPACE, \"-fixed\");\n  var CLASS_FULLSCREEN = \"\".concat(NAMESPACE, \"-fullscreen\");\n  var CLASS_FULLSCREEN_EXIT = \"\".concat(NAMESPACE, \"-fullscreen-exit\");\n  var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n  var CLASS_HIDE_MD_DOWN = \"\".concat(NAMESPACE, \"-hide-md-down\");\n  var CLASS_HIDE_SM_DOWN = \"\".concat(NAMESPACE, \"-hide-sm-down\");\n  var CLASS_HIDE_XS_DOWN = \"\".concat(NAMESPACE, \"-hide-xs-down\");\n  var CLASS_IN = \"\".concat(NAMESPACE, \"-in\");\n  var CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\n  var CLASS_LOADING = \"\".concat(NAMESPACE, \"-loading\");\n  var CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\");\n  var CLASS_OPEN = \"\".concat(NAMESPACE, \"-open\");\n  var CLASS_SHOW = \"\".concat(NAMESPACE, \"-show\");\n  var CLASS_TRANSITION = \"\".concat(NAMESPACE, \"-transition\");\n\n  // Native events\n  var EVENT_CLICK = 'click';\n  var EVENT_DBLCLICK = 'dblclick';\n  var EVENT_DRAG_START = 'dragstart';\n  var EVENT_FOCUSIN = 'focusin';\n  var EVENT_KEY_DOWN = 'keydown';\n  var EVENT_LOAD = 'load';\n  var EVENT_ERROR = 'error';\n  var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\n  var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\n  var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\n  var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\n  var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\n  var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\n  var EVENT_RESIZE = 'resize';\n  var EVENT_TRANSITION_END = 'transitionend';\n  var EVENT_WHEEL = 'wheel';\n\n  // Custom events\n  var EVENT_READY = 'ready';\n  var EVENT_SHOW = 'show';\n  var EVENT_SHOWN = 'shown';\n  var EVENT_HIDE = 'hide';\n  var EVENT_HIDDEN = 'hidden';\n  var EVENT_VIEW = 'view';\n  var EVENT_VIEWED = 'viewed';\n  var EVENT_MOVE = 'move';\n  var EVENT_MOVED = 'moved';\n  var EVENT_ROTATE = 'rotate';\n  var EVENT_ROTATED = 'rotated';\n  var EVENT_SCALE = 'scale';\n  var EVENT_SCALED = 'scaled';\n  var EVENT_ZOOM = 'zoom';\n  var EVENT_ZOOMED = 'zoomed';\n  var EVENT_PLAY = 'play';\n  var EVENT_STOP = 'stop';\n\n  // Data keys\n  var DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\n\n  // RegExps\n  var REGEXP_SPACES = /\\s\\s*/;\n\n  // Misc\n  var BUTTONS = ['zoom-in', 'zoom-out', 'one-to-one', 'reset', 'prev', 'play', 'next', 'rotate-left', 'rotate-right', 'flip-horizontal', 'flip-vertical'];\n\n  /**\n   * Check if the given value is a string.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a string, else `false`.\n   */\n  function isString(value) {\n    return typeof value === 'string';\n  }\n\n  /**\n   * Check if the given value is not a number.\n   */\n  var isNaN = Number.isNaN || WINDOW.isNaN;\n\n  /**\n   * Check if the given value is a number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n   */\n  function isNumber(value) {\n    return typeof value === 'number' && !isNaN(value);\n  }\n\n  /**\n   * Check if the given value is undefined.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n   */\n  function isUndefined(value) {\n    return typeof value === 'undefined';\n  }\n\n  /**\n   * Check if the given value is an object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n   */\n  function isObject(value) {\n    return _typeof(value) === 'object' && value !== null;\n  }\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  /**\n   * Check if the given value is a plain object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n   */\n  function isPlainObject(value) {\n    if (!isObject(value)) {\n      return false;\n    }\n    try {\n      var _constructor = value.constructor;\n      var prototype = _constructor.prototype;\n      return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n    } catch (error) {\n      return false;\n    }\n  }\n\n  /**\n   * Check if the given value is a function.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n   */\n  function isFunction(value) {\n    return typeof value === 'function';\n  }\n\n  /**\n   * Iterate the given data.\n   * @param {*} data - The data to iterate.\n   * @param {Function} callback - The process function for each element.\n   * @returns {*} The original data.\n   */\n  function forEach(data, callback) {\n    if (data && isFunction(callback)) {\n      if (Array.isArray(data) || isNumber(data.length) /* array-like */) {\n        var length = data.length;\n        var i;\n        for (i = 0; i < length; i += 1) {\n          if (callback.call(data, data[i], i, data) === false) {\n            break;\n          }\n        }\n      } else if (isObject(data)) {\n        Object.keys(data).forEach(function (key) {\n          callback.call(data, data[key], key, data);\n        });\n      }\n    }\n    return data;\n  }\n\n  /**\n   * Extend the given object.\n   * @param {*} obj - The object to be extended.\n   * @param {*} args - The rest objects which will be merged to the first object.\n   * @returns {Object} The extended object.\n   */\n  var assign = Object.assign || function assign(obj) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    if (isObject(obj) && args.length > 0) {\n      args.forEach(function (arg) {\n        if (isObject(arg)) {\n          Object.keys(arg).forEach(function (key) {\n            obj[key] = arg[key];\n          });\n        }\n      });\n    }\n    return obj;\n  };\n  var REGEXP_SUFFIX = /^(?:width|height|left|top|marginLeft|marginTop)$/;\n\n  /**\n   * Apply styles to the given element.\n   * @param {Element} element - The target element.\n   * @param {Object} styles - The styles for applying.\n   */\n  function setStyle(element, styles) {\n    var style = element.style;\n    forEach(styles, function (value, property) {\n      if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n        value += 'px';\n      }\n      style[property] = value;\n    });\n  }\n\n  /**\n   * Escape a string for using in HTML.\n   * @param {String} value - The string to escape.\n   * @returns {String} Returns the escaped string.\n   */\n  function escapeHTMLEntities(value) {\n    return isString(value) ? value.replace(/&(?!amp;|quot;|#39;|lt;|gt;)/g, '&amp;').replace(/\"/g, '&quot;').replace(/'/g, '&#39;').replace(/</g, '&lt;').replace(/>/g, '&gt;') : value;\n  }\n\n  /**\n   * Check if the given element has a special class.\n   * @param {Element} element - The element to check.\n   * @param {string} value - The class to search.\n   * @returns {boolean} Returns `true` if the special class was found.\n   */\n  function hasClass(element, value) {\n    if (!element || !value) {\n      return false;\n    }\n    return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n  }\n\n  /**\n   * Add classes to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be added.\n   */\n  function addClass(element, value) {\n    if (!element || !value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        addClass(elem, value);\n      });\n      return;\n    }\n    if (element.classList) {\n      element.classList.add(value);\n      return;\n    }\n    var className = element.className.trim();\n    if (!className) {\n      element.className = value;\n    } else if (className.indexOf(value) < 0) {\n      element.className = \"\".concat(className, \" \").concat(value);\n    }\n  }\n\n  /**\n   * Remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be removed.\n   */\n  function removeClass(element, value) {\n    if (!element || !value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        removeClass(elem, value);\n      });\n      return;\n    }\n    if (element.classList) {\n      element.classList.remove(value);\n      return;\n    }\n    if (element.className.indexOf(value) >= 0) {\n      element.className = element.className.replace(value, '');\n    }\n  }\n\n  /**\n   * Add or remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be toggled.\n   * @param {boolean} added - Add only.\n   */\n  function toggleClass(element, value, added) {\n    if (!value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        toggleClass(elem, value, added);\n      });\n      return;\n    }\n\n    // IE10-11 doesn't support the second parameter of `classList.toggle`\n    if (added) {\n      addClass(element, value);\n    } else {\n      removeClass(element, value);\n    }\n  }\n  var REGEXP_HYPHENATE = /([a-z\\d])([A-Z])/g;\n\n  /**\n   * Transform the given string from camelCase to kebab-case\n   * @param {string} value - The value to transform.\n   * @returns {string} The transformed value.\n   */\n  function hyphenate(value) {\n    return value.replace(REGEXP_HYPHENATE, '$1-$2').toLowerCase();\n  }\n\n  /**\n   * Get data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to get.\n   * @returns {string} The data value.\n   */\n  function getData(element, name) {\n    if (isObject(element[name])) {\n      return element[name];\n    }\n    if (element.dataset) {\n      return element.dataset[name];\n    }\n    return element.getAttribute(\"data-\".concat(hyphenate(name)));\n  }\n\n  /**\n   * Set data to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to set.\n   * @param {string} data - The data value.\n   */\n  function setData(element, name, data) {\n    if (isObject(data)) {\n      element[name] = data;\n    } else if (element.dataset) {\n      element.dataset[name] = data;\n    } else {\n      element.setAttribute(\"data-\".concat(hyphenate(name)), data);\n    }\n  }\n  var onceSupported = function () {\n    var supported = false;\n    if (IS_BROWSER) {\n      var once = false;\n      var listener = function listener() {};\n      var options = Object.defineProperty({}, 'once', {\n        get: function get() {\n          supported = true;\n          return once;\n        },\n        /**\n         * This setter can fix a `TypeError` in strict mode\n         * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n         * @param {boolean} value - The value to set\n         */\n        set: function set(value) {\n          once = value;\n        }\n      });\n      WINDOW.addEventListener('test', listener, options);\n      WINDOW.removeEventListener('test', listener, options);\n    }\n    return supported;\n  }();\n\n  /**\n   * Remove event listener from the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n  function removeListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (!onceSupported) {\n        var listeners = element.listeners;\n        if (listeners && listeners[event] && listeners[event][listener]) {\n          handler = listeners[event][listener];\n          delete listeners[event][listener];\n          if (Object.keys(listeners[event]).length === 0) {\n            delete listeners[event];\n          }\n          if (Object.keys(listeners).length === 0) {\n            delete element.listeners;\n          }\n        }\n      }\n      element.removeEventListener(event, handler, options);\n    });\n  }\n\n  /**\n   * Add event listener to the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n  function addListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var _handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (options.once && !onceSupported) {\n        var _element$listeners = element.listeners,\n          listeners = _element$listeners === void 0 ? {} : _element$listeners;\n        _handler = function handler() {\n          delete listeners[event][listener];\n          element.removeEventListener(event, _handler, options);\n          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n            args[_key2] = arguments[_key2];\n          }\n          listener.apply(element, args);\n        };\n        if (!listeners[event]) {\n          listeners[event] = {};\n        }\n        if (listeners[event][listener]) {\n          element.removeEventListener(event, listeners[event][listener], options);\n        }\n        listeners[event][listener] = _handler;\n        element.listeners = listeners;\n      }\n      element.addEventListener(event, _handler, options);\n    });\n  }\n\n  /**\n   * Dispatch event on the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Object} data - The additional event data.\n   * @param {Object} options - The additional event options.\n   * @returns {boolean} Indicate if the event is default prevented or not.\n   */\n  function dispatchEvent(element, type, data, options) {\n    var event;\n\n    // Event and CustomEvent on IE9-11 are global objects, not constructors\n    if (isFunction(Event) && isFunction(CustomEvent)) {\n      event = new CustomEvent(type, _objectSpread2({\n        bubbles: true,\n        cancelable: true,\n        detail: data\n      }, options));\n    } else {\n      event = document.createEvent('CustomEvent');\n      event.initCustomEvent(type, true, true, data);\n    }\n    return element.dispatchEvent(event);\n  }\n\n  /**\n   * Get the offset base on the document.\n   * @param {Element} element - The target element.\n   * @returns {Object} The offset data.\n   */\n  function getOffset(element) {\n    var box = element.getBoundingClientRect();\n    return {\n      left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n      top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n    };\n  }\n\n  /**\n   * Get transforms base on the given object.\n   * @param {Object} obj - The target object.\n   * @returns {string} A string contains transform values.\n   */\n  function getTransforms(_ref) {\n    var rotate = _ref.rotate,\n      scaleX = _ref.scaleX,\n      scaleY = _ref.scaleY,\n      translateX = _ref.translateX,\n      translateY = _ref.translateY;\n    var values = [];\n    if (isNumber(translateX) && translateX !== 0) {\n      values.push(\"translateX(\".concat(translateX, \"px)\"));\n    }\n    if (isNumber(translateY) && translateY !== 0) {\n      values.push(\"translateY(\".concat(translateY, \"px)\"));\n    }\n\n    // Rotate should come first before scale to match orientation transform\n    if (isNumber(rotate) && rotate !== 0) {\n      values.push(\"rotate(\".concat(rotate, \"deg)\"));\n    }\n    if (isNumber(scaleX) && scaleX !== 1) {\n      values.push(\"scaleX(\".concat(scaleX, \")\"));\n    }\n    if (isNumber(scaleY) && scaleY !== 1) {\n      values.push(\"scaleY(\".concat(scaleY, \")\"));\n    }\n    var transform = values.length ? values.join(' ') : 'none';\n    return {\n      WebkitTransform: transform,\n      msTransform: transform,\n      transform: transform\n    };\n  }\n\n  /**\n   * Get an image name from an image url.\n   * @param {string} url - The target url.\n   * @example\n   * // picture.jpg\n   * getImageNameFromURL('https://domain.com/path/to/picture.jpg?size=1280×960')\n   * @returns {string} A string contains the image name.\n   */\n  function getImageNameFromURL(url) {\n    return isString(url) ? decodeURIComponent(url.replace(/^.*\\//, '').replace(/[?&#].*$/, '')) : '';\n  }\n  var IS_SAFARI = WINDOW.navigator && /Version\\/\\d+(\\.\\d+)+?\\s+Safari/i.test(WINDOW.navigator.userAgent);\n\n  /**\n   * Get an image's natural sizes.\n   * @param {string} image - The target image.\n   * @param {Object} options - The viewer options.\n   * @param {Function} callback - The callback function.\n   * @returns {HTMLImageElement} The new image.\n   */\n  function getImageNaturalSizes(image, options, callback) {\n    var newImage = document.createElement('img');\n\n    // Modern browsers (except Safari)\n    if (image.naturalWidth && !IS_SAFARI) {\n      callback(image.naturalWidth, image.naturalHeight);\n      return newImage;\n    }\n    var body = document.body || document.documentElement;\n    newImage.onload = function () {\n      callback(newImage.width, newImage.height);\n      if (!IS_SAFARI) {\n        body.removeChild(newImage);\n      }\n    };\n    forEach(options.inheritedAttributes, function (name) {\n      var value = image.getAttribute(name);\n      if (value !== null) {\n        newImage.setAttribute(name, value);\n      }\n    });\n    newImage.src = image.src;\n\n    // iOS Safari will convert the image automatically\n    // with its orientation once append it into DOM\n    if (!IS_SAFARI) {\n      newImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n      body.appendChild(newImage);\n    }\n    return newImage;\n  }\n\n  /**\n   * Get the related class name of a responsive type number.\n   * @param {string} type - The responsive type.\n   * @returns {string} The related class name.\n   */\n  function getResponsiveClass(type) {\n    switch (type) {\n      case 2:\n        return CLASS_HIDE_XS_DOWN;\n      case 3:\n        return CLASS_HIDE_SM_DOWN;\n      case 4:\n        return CLASS_HIDE_MD_DOWN;\n      default:\n        return '';\n    }\n  }\n\n  /**\n   * Get the max ratio of a group of pointers.\n   * @param {string} pointers - The target pointers.\n   * @returns {number} The result ratio.\n   */\n  function getMaxZoomRatio(pointers) {\n    var pointers2 = _objectSpread2({}, pointers);\n    var ratios = [];\n    forEach(pointers, function (pointer, pointerId) {\n      delete pointers2[pointerId];\n      forEach(pointers2, function (pointer2) {\n        var x1 = Math.abs(pointer.startX - pointer2.startX);\n        var y1 = Math.abs(pointer.startY - pointer2.startY);\n        var x2 = Math.abs(pointer.endX - pointer2.endX);\n        var y2 = Math.abs(pointer.endY - pointer2.endY);\n        var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n        var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n        var ratio = (z2 - z1) / z1;\n        ratios.push(ratio);\n      });\n    });\n    ratios.sort(function (a, b) {\n      return Math.abs(a) < Math.abs(b);\n    });\n    return ratios[0];\n  }\n\n  /**\n   * Get a pointer from an event object.\n   * @param {Object} event - The target event object.\n   * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n   * @returns {Object} The result pointer contains start and/or end point coordinates.\n   */\n  function getPointer(_ref2, endOnly) {\n    var pageX = _ref2.pageX,\n      pageY = _ref2.pageY;\n    var end = {\n      endX: pageX,\n      endY: pageY\n    };\n    return endOnly ? end : _objectSpread2({\n      timeStamp: Date.now(),\n      startX: pageX,\n      startY: pageY\n    }, end);\n  }\n\n  /**\n   * Get the center point coordinate of a group of pointers.\n   * @param {Object} pointers - The target pointers.\n   * @returns {Object} The center point coordinate.\n   */\n  function getPointersCenter(pointers) {\n    var pageX = 0;\n    var pageY = 0;\n    var count = 0;\n    forEach(pointers, function (_ref3) {\n      var startX = _ref3.startX,\n        startY = _ref3.startY;\n      pageX += startX;\n      pageY += startY;\n      count += 1;\n    });\n    pageX /= count;\n    pageY /= count;\n    return {\n      pageX: pageX,\n      pageY: pageY\n    };\n  }\n\n  var render = {\n    render: function render() {\n      this.initContainer();\n      this.initViewer();\n      this.initList();\n      this.renderViewer();\n    },\n    initBody: function initBody() {\n      var ownerDocument = this.element.ownerDocument;\n      var body = ownerDocument.body || ownerDocument.documentElement;\n      this.body = body;\n      this.scrollbarWidth = window.innerWidth - ownerDocument.documentElement.clientWidth;\n      this.initialBodyPaddingRight = body.style.paddingRight;\n      this.initialBodyComputedPaddingRight = window.getComputedStyle(body).paddingRight;\n    },\n    initContainer: function initContainer() {\n      this.containerData = {\n        width: window.innerWidth,\n        height: window.innerHeight\n      };\n    },\n    initViewer: function initViewer() {\n      var options = this.options,\n        parent = this.parent;\n      var viewerData;\n      if (options.inline) {\n        viewerData = {\n          width: Math.max(parent.offsetWidth, options.minWidth),\n          height: Math.max(parent.offsetHeight, options.minHeight)\n        };\n        this.parentData = viewerData;\n      }\n      if (this.fulled || !viewerData) {\n        viewerData = this.containerData;\n      }\n      this.viewerData = assign({}, viewerData);\n    },\n    renderViewer: function renderViewer() {\n      if (this.options.inline && !this.fulled) {\n        setStyle(this.viewer, this.viewerData);\n      }\n    },\n    initList: function initList() {\n      var _this = this;\n      var element = this.element,\n        options = this.options,\n        list = this.list;\n      var items = [];\n\n      // initList may be called in this.update, so should keep idempotent\n      list.innerHTML = '';\n      forEach(this.images, function (image, index) {\n        var src = image.src;\n        var alt = image.alt || getImageNameFromURL(src);\n        var url = _this.getImageURL(image);\n        if (src || url) {\n          var item = document.createElement('li');\n          var img = document.createElement('img');\n          forEach(options.inheritedAttributes, function (name) {\n            var value = image.getAttribute(name);\n            if (value !== null) {\n              img.setAttribute(name, value);\n            }\n          });\n          if (options.navbar) {\n            img.src = src || url;\n          }\n          img.alt = alt;\n          img.setAttribute('data-original-url', url || src);\n          item.setAttribute('data-index', index);\n          item.setAttribute('data-viewer-action', 'view');\n          item.setAttribute('role', 'button');\n          if (options.keyboard) {\n            item.setAttribute('tabindex', 0);\n          }\n          item.appendChild(img);\n          list.appendChild(item);\n          items.push(item);\n        }\n      });\n      this.items = items;\n      forEach(items, function (item) {\n        var image = item.firstElementChild;\n        var onLoad;\n        var onError;\n        setData(image, 'filled', true);\n        if (options.loading) {\n          addClass(item, CLASS_LOADING);\n        }\n        addListener(image, EVENT_LOAD, onLoad = function onLoad(event) {\n          removeListener(image, EVENT_ERROR, onError);\n          if (options.loading) {\n            removeClass(item, CLASS_LOADING);\n          }\n          _this.loadImage(event);\n        }, {\n          once: true\n        });\n        addListener(image, EVENT_ERROR, onError = function onError() {\n          removeListener(image, EVENT_LOAD, onLoad);\n          if (options.loading) {\n            removeClass(item, CLASS_LOADING);\n          }\n        }, {\n          once: true\n        });\n      });\n      if (options.transition) {\n        addListener(element, EVENT_VIEWED, function () {\n          addClass(list, CLASS_TRANSITION);\n        }, {\n          once: true\n        });\n      }\n    },\n    renderList: function renderList() {\n      var index = this.index;\n      var item = this.items[index];\n      if (!item) {\n        return;\n      }\n      var next = item.nextElementSibling;\n      var gutter = parseInt(window.getComputedStyle(next || item).marginLeft, 10);\n      var offsetWidth = item.offsetWidth;\n      var outerWidth = offsetWidth + gutter;\n\n      // Place the active item in the center of the screen\n      setStyle(this.list, assign({\n        width: outerWidth * this.length - gutter\n      }, getTransforms({\n        translateX: (this.viewerData.width - offsetWidth) / 2 - outerWidth * index\n      })));\n    },\n    resetList: function resetList() {\n      var list = this.list;\n      list.innerHTML = '';\n      removeClass(list, CLASS_TRANSITION);\n      setStyle(list, getTransforms({\n        translateX: 0\n      }));\n    },\n    initImage: function initImage(done) {\n      var _this2 = this;\n      var options = this.options,\n        image = this.image,\n        viewerData = this.viewerData;\n      var footerHeight = this.footer.offsetHeight;\n      var viewerWidth = viewerData.width;\n      var viewerHeight = Math.max(viewerData.height - footerHeight, footerHeight);\n      var oldImageData = this.imageData || {};\n      var sizingImage;\n      this.imageInitializing = {\n        abort: function abort() {\n          sizingImage.onload = null;\n        }\n      };\n      sizingImage = getImageNaturalSizes(image, options, function (naturalWidth, naturalHeight) {\n        var aspectRatio = naturalWidth / naturalHeight;\n        var initialCoverage = Math.max(0, Math.min(1, options.initialCoverage));\n        var width = viewerWidth;\n        var height = viewerHeight;\n        _this2.imageInitializing = false;\n        if (viewerHeight * aspectRatio > viewerWidth) {\n          height = viewerWidth / aspectRatio;\n        } else {\n          width = viewerHeight * aspectRatio;\n        }\n        initialCoverage = isNumber(initialCoverage) ? initialCoverage : 0.9;\n        width = Math.min(width * initialCoverage, naturalWidth);\n        height = Math.min(height * initialCoverage, naturalHeight);\n        var left = (viewerWidth - width) / 2;\n        var top = (viewerHeight - height) / 2;\n        var imageData = {\n          left: left,\n          top: top,\n          x: left,\n          y: top,\n          width: width,\n          height: height,\n          oldRatio: 1,\n          ratio: width / naturalWidth,\n          aspectRatio: aspectRatio,\n          naturalWidth: naturalWidth,\n          naturalHeight: naturalHeight\n        };\n        var initialImageData = assign({}, imageData);\n        if (options.rotatable) {\n          imageData.rotate = oldImageData.rotate || 0;\n          initialImageData.rotate = 0;\n        }\n        if (options.scalable) {\n          imageData.scaleX = oldImageData.scaleX || 1;\n          imageData.scaleY = oldImageData.scaleY || 1;\n          initialImageData.scaleX = 1;\n          initialImageData.scaleY = 1;\n        }\n        _this2.imageData = imageData;\n        _this2.initialImageData = initialImageData;\n        if (done) {\n          done();\n        }\n      });\n    },\n    renderImage: function renderImage(done) {\n      var _this3 = this;\n      var image = this.image,\n        imageData = this.imageData;\n      setStyle(image, assign({\n        width: imageData.width,\n        height: imageData.height,\n        // XXX: Not to use translateX/Y to avoid image shaking when zooming\n        marginLeft: imageData.x,\n        marginTop: imageData.y\n      }, getTransforms(imageData)));\n      if (done) {\n        if ((this.viewing || this.moving || this.rotating || this.scaling || this.zooming) && this.options.transition && hasClass(image, CLASS_TRANSITION)) {\n          var onTransitionEnd = function onTransitionEnd() {\n            _this3.imageRendering = false;\n            done();\n          };\n          this.imageRendering = {\n            abort: function abort() {\n              removeListener(image, EVENT_TRANSITION_END, onTransitionEnd);\n            }\n          };\n          addListener(image, EVENT_TRANSITION_END, onTransitionEnd, {\n            once: true\n          });\n        } else {\n          done();\n        }\n      }\n    },\n    resetImage: function resetImage() {\n      var image = this.image;\n      if (image) {\n        if (this.viewing) {\n          this.viewing.abort();\n        }\n        image.parentNode.removeChild(image);\n        this.image = null;\n        this.title.innerHTML = '';\n      }\n    }\n  };\n\n  var events = {\n    bind: function bind() {\n      var options = this.options,\n        viewer = this.viewer,\n        canvas = this.canvas;\n      var document = this.element.ownerDocument;\n      addListener(viewer, EVENT_CLICK, this.onClick = this.click.bind(this));\n      addListener(viewer, EVENT_DRAG_START, this.onDragStart = this.dragstart.bind(this));\n      addListener(canvas, EVENT_POINTER_DOWN, this.onPointerDown = this.pointerdown.bind(this));\n      addListener(document, EVENT_POINTER_MOVE, this.onPointerMove = this.pointermove.bind(this));\n      addListener(document, EVENT_POINTER_UP, this.onPointerUp = this.pointerup.bind(this));\n      addListener(document, EVENT_KEY_DOWN, this.onKeyDown = this.keydown.bind(this));\n      addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n      if (options.zoomable && options.zoomOnWheel) {\n        addListener(viewer, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n          passive: false,\n          capture: true\n        });\n      }\n      if (options.toggleOnDblclick) {\n        addListener(canvas, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n      }\n    },\n    unbind: function unbind() {\n      var options = this.options,\n        viewer = this.viewer,\n        canvas = this.canvas;\n      var document = this.element.ownerDocument;\n      removeListener(viewer, EVENT_CLICK, this.onClick);\n      removeListener(viewer, EVENT_DRAG_START, this.onDragStart);\n      removeListener(canvas, EVENT_POINTER_DOWN, this.onPointerDown);\n      removeListener(document, EVENT_POINTER_MOVE, this.onPointerMove);\n      removeListener(document, EVENT_POINTER_UP, this.onPointerUp);\n      removeListener(document, EVENT_KEY_DOWN, this.onKeyDown);\n      removeListener(window, EVENT_RESIZE, this.onResize);\n      if (options.zoomable && options.zoomOnWheel) {\n        removeListener(viewer, EVENT_WHEEL, this.onWheel, {\n          passive: false,\n          capture: true\n        });\n      }\n      if (options.toggleOnDblclick) {\n        removeListener(canvas, EVENT_DBLCLICK, this.onDblclick);\n      }\n    }\n  };\n\n  var handlers = {\n    click: function click(event) {\n      var options = this.options,\n        imageData = this.imageData;\n      var target = event.target;\n      var action = getData(target, DATA_ACTION);\n      if (!action && target.localName === 'img' && target.parentElement.localName === 'li') {\n        target = target.parentElement;\n        action = getData(target, DATA_ACTION);\n      }\n\n      // Cancel the emulated click when the native click event was triggered.\n      if (IS_TOUCH_DEVICE && event.isTrusted && target === this.canvas) {\n        clearTimeout(this.clickCanvasTimeout);\n      }\n      switch (action) {\n        case 'mix':\n          if (this.played) {\n            this.stop();\n          } else if (options.inline) {\n            if (this.fulled) {\n              this.exit();\n            } else {\n              this.full();\n            }\n          } else {\n            this.hide();\n          }\n          break;\n        case 'hide':\n          if (!this.pointerMoved) {\n            this.hide();\n          }\n          break;\n        case 'view':\n          this.view(getData(target, 'index'));\n          break;\n        case 'zoom-in':\n          this.zoom(0.1, true);\n          break;\n        case 'zoom-out':\n          this.zoom(-0.1, true);\n          break;\n        case 'one-to-one':\n          this.toggle();\n          break;\n        case 'reset':\n          this.reset();\n          break;\n        case 'prev':\n          this.prev(options.loop);\n          break;\n        case 'play':\n          this.play(options.fullscreen);\n          break;\n        case 'next':\n          this.next(options.loop);\n          break;\n        case 'rotate-left':\n          this.rotate(-90);\n          break;\n        case 'rotate-right':\n          this.rotate(90);\n          break;\n        case 'flip-horizontal':\n          this.scaleX(-imageData.scaleX || -1);\n          break;\n        case 'flip-vertical':\n          this.scaleY(-imageData.scaleY || -1);\n          break;\n        default:\n          if (this.played) {\n            this.stop();\n          }\n      }\n    },\n    dblclick: function dblclick(event) {\n      event.preventDefault();\n      if (this.viewed && event.target === this.image) {\n        // Cancel the emulated double click when the native dblclick event was triggered.\n        if (IS_TOUCH_DEVICE && event.isTrusted) {\n          clearTimeout(this.doubleClickImageTimeout);\n        }\n\n        // XXX: No pageX/Y properties in custom event, fallback to the original event.\n        this.toggle(event.isTrusted ? event : event.detail && event.detail.originalEvent);\n      }\n    },\n    load: function load() {\n      var _this = this;\n      if (this.timeout) {\n        clearTimeout(this.timeout);\n        this.timeout = false;\n      }\n      var element = this.element,\n        options = this.options,\n        image = this.image,\n        index = this.index,\n        viewerData = this.viewerData;\n      removeClass(image, CLASS_INVISIBLE);\n      if (options.loading) {\n        removeClass(this.canvas, CLASS_LOADING);\n      }\n      image.style.cssText = 'height:0;' + \"margin-left:\".concat(viewerData.width / 2, \"px;\") + \"margin-top:\".concat(viewerData.height / 2, \"px;\") + 'max-width:none!important;' + 'position:relative;' + 'width:0;';\n      this.initImage(function () {\n        toggleClass(image, CLASS_MOVE, options.movable);\n        toggleClass(image, CLASS_TRANSITION, options.transition);\n        _this.renderImage(function () {\n          _this.viewed = true;\n          _this.viewing = false;\n          if (isFunction(options.viewed)) {\n            addListener(element, EVENT_VIEWED, options.viewed, {\n              once: true\n            });\n          }\n          dispatchEvent(element, EVENT_VIEWED, {\n            originalImage: _this.images[index],\n            index: index,\n            image: image\n          }, {\n            cancelable: false\n          });\n        });\n      });\n    },\n    loadImage: function loadImage(event) {\n      var image = event.target;\n      var parent = image.parentNode;\n      var parentWidth = parent.offsetWidth || 30;\n      var parentHeight = parent.offsetHeight || 50;\n      var filled = !!getData(image, 'filled');\n      getImageNaturalSizes(image, this.options, function (naturalWidth, naturalHeight) {\n        var aspectRatio = naturalWidth / naturalHeight;\n        var width = parentWidth;\n        var height = parentHeight;\n        if (parentHeight * aspectRatio > parentWidth) {\n          if (filled) {\n            width = parentHeight * aspectRatio;\n          } else {\n            height = parentWidth / aspectRatio;\n          }\n        } else if (filled) {\n          height = parentWidth / aspectRatio;\n        } else {\n          width = parentHeight * aspectRatio;\n        }\n        setStyle(image, assign({\n          width: width,\n          height: height\n        }, getTransforms({\n          translateX: (parentWidth - width) / 2,\n          translateY: (parentHeight - height) / 2\n        })));\n      });\n    },\n    keydown: function keydown(event) {\n      var options = this.options;\n      if (!options.keyboard) {\n        return;\n      }\n      var keyCode = event.keyCode || event.which || event.charCode;\n      switch (keyCode) {\n        // Enter\n        case 13:\n          if (this.viewer.contains(event.target)) {\n            this.click(event);\n          }\n          break;\n      }\n      if (!this.fulled) {\n        return;\n      }\n      switch (keyCode) {\n        // Escape\n        case 27:\n          if (this.played) {\n            this.stop();\n          } else if (options.inline) {\n            if (this.fulled) {\n              this.exit();\n            }\n          } else {\n            this.hide();\n          }\n          break;\n\n        // Space\n        case 32:\n          if (this.played) {\n            this.stop();\n          }\n          break;\n\n        // ArrowLeft\n        case 37:\n          if (this.played && this.playing) {\n            this.playing.prev();\n          } else {\n            this.prev(options.loop);\n          }\n          break;\n\n        // ArrowUp\n        case 38:\n          // Prevent scroll on Firefox\n          event.preventDefault();\n\n          // Zoom in\n          this.zoom(options.zoomRatio, true);\n          break;\n\n        // ArrowRight\n        case 39:\n          if (this.played && this.playing) {\n            this.playing.next();\n          } else {\n            this.next(options.loop);\n          }\n          break;\n\n        // ArrowDown\n        case 40:\n          // Prevent scroll on Firefox\n          event.preventDefault();\n\n          // Zoom out\n          this.zoom(-options.zoomRatio, true);\n          break;\n\n        // Ctrl + 0\n        case 48:\n        // Fall through\n\n        // Ctrl + 1\n        // eslint-disable-next-line no-fallthrough\n        case 49:\n          if (event.ctrlKey) {\n            event.preventDefault();\n            this.toggle();\n          }\n          break;\n      }\n    },\n    dragstart: function dragstart(event) {\n      if (event.target.localName === 'img') {\n        event.preventDefault();\n      }\n    },\n    pointerdown: function pointerdown(event) {\n      var options = this.options,\n        pointers = this.pointers;\n      var buttons = event.buttons,\n        button = event.button;\n      this.pointerMoved = false;\n      if (!this.viewed || this.showing || this.viewing || this.hiding\n\n      // Handle mouse event and pointer event and ignore touch event\n      || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && (\n      // No primary button (Usually the left button)\n      isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0\n\n      // Open context menu\n      || event.ctrlKey)) {\n        return;\n      }\n\n      // Prevent default behaviours as page zooming in touch devices.\n      event.preventDefault();\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          pointers[touch.identifier] = getPointer(touch);\n        });\n      } else {\n        pointers[event.pointerId || 0] = getPointer(event);\n      }\n      var action = options.movable ? ACTION_MOVE : false;\n      if (options.zoomOnTouch && options.zoomable && Object.keys(pointers).length > 1) {\n        action = ACTION_ZOOM;\n      } else if (options.slideOnTouch && (event.pointerType === 'touch' || event.type === 'touchstart') && this.isSwitchable()) {\n        action = ACTION_SWITCH;\n      }\n      if (options.transition && (action === ACTION_MOVE || action === ACTION_ZOOM)) {\n        removeClass(this.image, CLASS_TRANSITION);\n      }\n      this.action = action;\n    },\n    pointermove: function pointermove(event) {\n      var pointers = this.pointers,\n        action = this.action;\n      if (!this.viewed || !action) {\n        return;\n      }\n      event.preventDefault();\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n        });\n      } else {\n        assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n      }\n      this.change(event);\n    },\n    pointerup: function pointerup(event) {\n      var _this2 = this;\n      var options = this.options,\n        action = this.action,\n        pointers = this.pointers;\n      var pointer;\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          pointer = pointers[touch.identifier];\n          delete pointers[touch.identifier];\n        });\n      } else {\n        pointer = pointers[event.pointerId || 0];\n        delete pointers[event.pointerId || 0];\n      }\n      if (!action) {\n        return;\n      }\n      event.preventDefault();\n      if (options.transition && (action === ACTION_MOVE || action === ACTION_ZOOM)) {\n        addClass(this.image, CLASS_TRANSITION);\n      }\n      this.action = false;\n\n      // Emulate click and double click in touch devices to support backdrop and image zooming (#210).\n      if (IS_TOUCH_DEVICE && action !== ACTION_ZOOM && pointer && Date.now() - pointer.timeStamp < 500) {\n        clearTimeout(this.clickCanvasTimeout);\n        clearTimeout(this.doubleClickImageTimeout);\n        if (options.toggleOnDblclick && this.viewed && event.target === this.image) {\n          if (this.imageClicked) {\n            this.imageClicked = false;\n\n            // This timeout will be cleared later when a native dblclick event is triggering\n            this.doubleClickImageTimeout = setTimeout(function () {\n              dispatchEvent(_this2.image, EVENT_DBLCLICK, {\n                originalEvent: event\n              });\n            }, 50);\n          } else {\n            this.imageClicked = true;\n\n            // The default timing of a double click in Windows is 500 ms\n            this.doubleClickImageTimeout = setTimeout(function () {\n              _this2.imageClicked = false;\n            }, 500);\n          }\n        } else {\n          this.imageClicked = false;\n          if (options.backdrop && options.backdrop !== 'static' && event.target === this.canvas) {\n            // This timeout will be cleared later when a native click event is triggering\n            this.clickCanvasTimeout = setTimeout(function () {\n              dispatchEvent(_this2.canvas, EVENT_CLICK, {\n                originalEvent: event\n              });\n            }, 50);\n          }\n        }\n      }\n    },\n    resize: function resize() {\n      var _this3 = this;\n      if (!this.isShown || this.hiding) {\n        return;\n      }\n      if (this.fulled) {\n        this.close();\n        this.initBody();\n        this.open();\n      }\n      this.initContainer();\n      this.initViewer();\n      this.renderViewer();\n      this.renderList();\n      if (this.viewed) {\n        this.initImage(function () {\n          _this3.renderImage();\n        });\n      }\n      if (this.played) {\n        if (this.options.fullscreen && this.fulled && !(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement)) {\n          this.stop();\n          return;\n        }\n        forEach(this.player.getElementsByTagName('img'), function (image) {\n          addListener(image, EVENT_LOAD, _this3.loadImage.bind(_this3), {\n            once: true\n          });\n          dispatchEvent(image, EVENT_LOAD);\n        });\n      }\n    },\n    wheel: function wheel(event) {\n      var _this4 = this;\n      if (!this.viewed) {\n        return;\n      }\n      event.preventDefault();\n\n      // Limit wheel speed to prevent zoom too fast\n      if (this.wheeling) {\n        return;\n      }\n      this.wheeling = true;\n      setTimeout(function () {\n        _this4.wheeling = false;\n      }, 50);\n      var ratio = Number(this.options.zoomRatio) || 0.1;\n      var delta = 1;\n      if (event.deltaY) {\n        delta = event.deltaY > 0 ? 1 : -1;\n      } else if (event.wheelDelta) {\n        delta = -event.wheelDelta / 120;\n      } else if (event.detail) {\n        delta = event.detail > 0 ? 1 : -1;\n      }\n      this.zoom(-delta * ratio, true, null, event);\n    }\n  };\n\n  var methods = {\n    /** Show the viewer (only available in modal mode)\n     * @param {boolean} [immediate=false] - Indicates if show the viewer immediately or not.\n     * @returns {Viewer} this\n     */\n    show: function show() {\n      var immediate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var element = this.element,\n        options = this.options;\n      if (options.inline || this.showing || this.isShown || this.showing) {\n        return this;\n      }\n      if (!this.ready) {\n        this.build();\n        if (this.ready) {\n          this.show(immediate);\n        }\n        return this;\n      }\n      if (isFunction(options.show)) {\n        addListener(element, EVENT_SHOW, options.show, {\n          once: true\n        });\n      }\n      if (dispatchEvent(element, EVENT_SHOW) === false || !this.ready) {\n        return this;\n      }\n      if (this.hiding) {\n        this.transitioning.abort();\n      }\n      this.showing = true;\n      this.open();\n      var viewer = this.viewer;\n      removeClass(viewer, CLASS_HIDE);\n      viewer.setAttribute('role', 'dialog');\n      viewer.setAttribute('aria-labelledby', this.title.id);\n      viewer.setAttribute('aria-modal', true);\n      viewer.removeAttribute('aria-hidden');\n      if (options.transition && !immediate) {\n        var shown = this.shown.bind(this);\n        this.transitioning = {\n          abort: function abort() {\n            removeListener(viewer, EVENT_TRANSITION_END, shown);\n            removeClass(viewer, CLASS_IN);\n          }\n        };\n        addClass(viewer, CLASS_TRANSITION);\n\n        // Force reflow to enable CSS3 transition\n        viewer.initialOffsetWidth = viewer.offsetWidth;\n        addListener(viewer, EVENT_TRANSITION_END, shown, {\n          once: true\n        });\n        addClass(viewer, CLASS_IN);\n      } else {\n        addClass(viewer, CLASS_IN);\n        this.shown();\n      }\n      return this;\n    },\n    /**\n     * Hide the viewer (only available in modal mode)\n     * @param {boolean} [immediate=false] - Indicates if hide the viewer immediately or not.\n     * @returns {Viewer} this\n     */\n    hide: function hide() {\n      var _this = this;\n      var immediate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var element = this.element,\n        options = this.options;\n      if (options.inline || this.hiding || !(this.isShown || this.showing)) {\n        return this;\n      }\n      if (isFunction(options.hide)) {\n        addListener(element, EVENT_HIDE, options.hide, {\n          once: true\n        });\n      }\n      if (dispatchEvent(element, EVENT_HIDE) === false) {\n        return this;\n      }\n      if (this.showing) {\n        this.transitioning.abort();\n      }\n      this.hiding = true;\n      if (this.played) {\n        this.stop();\n      } else if (this.viewing) {\n        this.viewing.abort();\n      }\n      var viewer = this.viewer,\n        image = this.image;\n      var hideImmediately = function hideImmediately() {\n        removeClass(viewer, CLASS_IN);\n        _this.hidden();\n      };\n      if (options.transition && !immediate) {\n        var _onViewerTransitionEnd = function onViewerTransitionEnd(event) {\n          // Ignore all propagating `transitionend` events (#275).\n          if (event && event.target === viewer) {\n            removeListener(viewer, EVENT_TRANSITION_END, _onViewerTransitionEnd);\n            _this.hidden();\n          }\n        };\n        var onImageTransitionEnd = function onImageTransitionEnd() {\n          // In case of show the viewer by `viewer.show(true)` previously (#407).\n          if (hasClass(viewer, CLASS_TRANSITION)) {\n            addListener(viewer, EVENT_TRANSITION_END, _onViewerTransitionEnd);\n            removeClass(viewer, CLASS_IN);\n          } else {\n            hideImmediately();\n          }\n        };\n        this.transitioning = {\n          abort: function abort() {\n            if (_this.viewed && hasClass(image, CLASS_TRANSITION)) {\n              removeListener(image, EVENT_TRANSITION_END, onImageTransitionEnd);\n            } else if (hasClass(viewer, CLASS_TRANSITION)) {\n              removeListener(viewer, EVENT_TRANSITION_END, _onViewerTransitionEnd);\n            }\n          }\n        };\n\n        // In case of hiding the viewer when holding on the image (#255),\n        // note that the `CLASS_TRANSITION` class will be removed on pointer down.\n        if (this.viewed && hasClass(image, CLASS_TRANSITION)) {\n          addListener(image, EVENT_TRANSITION_END, onImageTransitionEnd, {\n            once: true\n          });\n          this.zoomTo(0, false, null, null, true);\n        } else {\n          onImageTransitionEnd();\n        }\n      } else {\n        hideImmediately();\n      }\n      return this;\n    },\n    /**\n     * View one of the images with image's index\n     * @param {number} index - The index of the image to view.\n     * @returns {Viewer} this\n     */\n    view: function view() {\n      var _this2 = this;\n      var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.options.initialViewIndex;\n      index = Number(index) || 0;\n      if (this.hiding || this.played || index < 0 || index >= this.length || this.viewed && index === this.index) {\n        return this;\n      }\n      if (!this.isShown) {\n        this.index = index;\n        return this.show();\n      }\n      if (this.viewing) {\n        this.viewing.abort();\n      }\n      var element = this.element,\n        options = this.options,\n        title = this.title,\n        canvas = this.canvas;\n      var item = this.items[index];\n      var img = item.querySelector('img');\n      var url = getData(img, 'originalUrl');\n      var alt = img.getAttribute('alt');\n      var image = document.createElement('img');\n      forEach(options.inheritedAttributes, function (name) {\n        var value = img.getAttribute(name);\n        if (value !== null) {\n          image.setAttribute(name, value);\n        }\n      });\n      image.src = url;\n      image.alt = alt;\n      if (isFunction(options.view)) {\n        addListener(element, EVENT_VIEW, options.view, {\n          once: true\n        });\n      }\n      if (dispatchEvent(element, EVENT_VIEW, {\n        originalImage: this.images[index],\n        index: index,\n        image: image\n      }) === false || !this.isShown || this.hiding || this.played) {\n        return this;\n      }\n      var activeItem = this.items[this.index];\n      if (activeItem) {\n        removeClass(activeItem, CLASS_ACTIVE);\n        activeItem.removeAttribute('aria-selected');\n      }\n      addClass(item, CLASS_ACTIVE);\n      item.setAttribute('aria-selected', true);\n      if (options.focus) {\n        item.focus();\n      }\n      this.image = image;\n      this.viewed = false;\n      this.index = index;\n      this.imageData = {};\n      addClass(image, CLASS_INVISIBLE);\n      if (options.loading) {\n        addClass(canvas, CLASS_LOADING);\n      }\n      canvas.innerHTML = '';\n      canvas.appendChild(image);\n\n      // Center current item\n      this.renderList();\n\n      // Clear title\n      title.innerHTML = '';\n\n      // Generate title after viewed\n      var onViewed = function onViewed() {\n        var imageData = _this2.imageData;\n        var render = Array.isArray(options.title) ? options.title[1] : options.title;\n        title.innerHTML = escapeHTMLEntities(isFunction(render) ? render.call(_this2, image, imageData) : \"\".concat(alt, \" (\").concat(imageData.naturalWidth, \" \\xD7 \").concat(imageData.naturalHeight, \")\"));\n      };\n      var onLoad;\n      var onError;\n      addListener(element, EVENT_VIEWED, onViewed, {\n        once: true\n      });\n      this.viewing = {\n        abort: function abort() {\n          removeListener(element, EVENT_VIEWED, onViewed);\n          if (image.complete) {\n            if (_this2.imageRendering) {\n              _this2.imageRendering.abort();\n            } else if (_this2.imageInitializing) {\n              _this2.imageInitializing.abort();\n            }\n          } else {\n            // Cancel download to save bandwidth.\n            image.src = '';\n            removeListener(image, EVENT_LOAD, onLoad);\n            if (_this2.timeout) {\n              clearTimeout(_this2.timeout);\n            }\n          }\n        }\n      };\n      if (image.complete) {\n        this.load();\n      } else {\n        addListener(image, EVENT_LOAD, onLoad = function onLoad() {\n          removeListener(image, EVENT_ERROR, onError);\n          _this2.load();\n        }, {\n          once: true\n        });\n        addListener(image, EVENT_ERROR, onError = function onError() {\n          removeListener(image, EVENT_LOAD, onLoad);\n          if (_this2.timeout) {\n            clearTimeout(_this2.timeout);\n            _this2.timeout = false;\n          }\n          removeClass(image, CLASS_INVISIBLE);\n          if (options.loading) {\n            removeClass(_this2.canvas, CLASS_LOADING);\n          }\n        }, {\n          once: true\n        });\n        if (this.timeout) {\n          clearTimeout(this.timeout);\n        }\n\n        // Make the image visible if it fails to load within 1s\n        this.timeout = setTimeout(function () {\n          removeClass(image, CLASS_INVISIBLE);\n          _this2.timeout = false;\n        }, 1000);\n      }\n      return this;\n    },\n    /**\n     * View the previous image\n     * @param {boolean} [loop=false] - Indicate if view the last one\n     * when it is the first one at present.\n     * @returns {Viewer} this\n     */\n    prev: function prev() {\n      var loop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var index = this.index - 1;\n      if (index < 0) {\n        index = loop ? this.length - 1 : 0;\n      }\n      this.view(index);\n      return this;\n    },\n    /**\n     * View the next image\n     * @param {boolean} [loop=false] - Indicate if view the first one\n     * when it is the last one at present.\n     * @returns {Viewer} this\n     */\n    next: function next() {\n      var loop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var maxIndex = this.length - 1;\n      var index = this.index + 1;\n      if (index > maxIndex) {\n        index = loop ? 0 : maxIndex;\n      }\n      this.view(index);\n      return this;\n    },\n    /**\n     * Move the image with relative offsets.\n     * @param {number} x - The moving distance in the horizontal direction.\n     * @param {number} [y=x] The moving distance in the vertical direction.\n     * @returns {Viewer} this\n     */\n    move: function move(x) {\n      var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n      var imageData = this.imageData;\n      this.moveTo(isUndefined(x) ? x : imageData.x + Number(x), isUndefined(y) ? y : imageData.y + Number(y));\n      return this;\n    },\n    /**\n     * Move the image to an absolute point.\n     * @param {number} x - The new position in the horizontal direction.\n     * @param {number} [y=x] - The new position in the vertical direction.\n     * @param {Event} [_originalEvent=null] - The original event if any.\n     * @returns {Viewer} this\n     */\n    moveTo: function moveTo(x) {\n      var _this3 = this;\n      var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n      var _originalEvent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n      var element = this.element,\n        options = this.options,\n        imageData = this.imageData;\n      x = Number(x);\n      y = Number(y);\n      if (this.viewed && !this.played && options.movable) {\n        var oldX = imageData.x;\n        var oldY = imageData.y;\n        var changed = false;\n        if (isNumber(x)) {\n          changed = true;\n        } else {\n          x = oldX;\n        }\n        if (isNumber(y)) {\n          changed = true;\n        } else {\n          y = oldY;\n        }\n        if (changed) {\n          if (isFunction(options.move)) {\n            addListener(element, EVENT_MOVE, options.move, {\n              once: true\n            });\n          }\n          if (dispatchEvent(element, EVENT_MOVE, {\n            x: x,\n            y: y,\n            oldX: oldX,\n            oldY: oldY,\n            originalEvent: _originalEvent\n          }) === false) {\n            return this;\n          }\n          imageData.x = x;\n          imageData.y = y;\n          imageData.left = x;\n          imageData.top = y;\n          this.moving = true;\n          this.renderImage(function () {\n            _this3.moving = false;\n            if (isFunction(options.moved)) {\n              addListener(element, EVENT_MOVED, options.moved, {\n                once: true\n              });\n            }\n            dispatchEvent(element, EVENT_MOVED, {\n              x: x,\n              y: y,\n              oldX: oldX,\n              oldY: oldY,\n              originalEvent: _originalEvent\n            }, {\n              cancelable: false\n            });\n          });\n        }\n      }\n      return this;\n    },\n    /**\n     * Rotate the image with a relative degree.\n     * @param {number} degree - The rotate degree.\n     * @returns {Viewer} this\n     */\n    rotate: function rotate(degree) {\n      this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n      return this;\n    },\n    /**\n     * Rotate the image to an absolute degree.\n     * @param {number} degree - The rotate degree.\n     * @returns {Viewer} this\n     */\n    rotateTo: function rotateTo(degree) {\n      var _this4 = this;\n      var element = this.element,\n        options = this.options,\n        imageData = this.imageData;\n      degree = Number(degree);\n      if (isNumber(degree) && this.viewed && !this.played && options.rotatable) {\n        var oldDegree = imageData.rotate;\n        if (isFunction(options.rotate)) {\n          addListener(element, EVENT_ROTATE, options.rotate, {\n            once: true\n          });\n        }\n        if (dispatchEvent(element, EVENT_ROTATE, {\n          degree: degree,\n          oldDegree: oldDegree\n        }) === false) {\n          return this;\n        }\n        imageData.rotate = degree;\n        this.rotating = true;\n        this.renderImage(function () {\n          _this4.rotating = false;\n          if (isFunction(options.rotated)) {\n            addListener(element, EVENT_ROTATED, options.rotated, {\n              once: true\n            });\n          }\n          dispatchEvent(element, EVENT_ROTATED, {\n            degree: degree,\n            oldDegree: oldDegree\n          }, {\n            cancelable: false\n          });\n        });\n      }\n      return this;\n    },\n    /**\n     * Scale the image on the x-axis.\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @returns {Viewer} this\n     */\n    scaleX: function scaleX(_scaleX) {\n      this.scale(_scaleX, this.imageData.scaleY);\n      return this;\n    },\n    /**\n     * Scale the image on the y-axis.\n     * @param {number} scaleY - The scale ratio on the y-axis.\n     * @returns {Viewer} this\n     */\n    scaleY: function scaleY(_scaleY) {\n      this.scale(this.imageData.scaleX, _scaleY);\n      return this;\n    },\n    /**\n     * Scale the image.\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n     * @returns {Viewer} this\n     */\n    scale: function scale(scaleX) {\n      var _this5 = this;\n      var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n      var element = this.element,\n        options = this.options,\n        imageData = this.imageData;\n      scaleX = Number(scaleX);\n      scaleY = Number(scaleY);\n      if (this.viewed && !this.played && options.scalable) {\n        var oldScaleX = imageData.scaleX;\n        var oldScaleY = imageData.scaleY;\n        var changed = false;\n        if (isNumber(scaleX)) {\n          changed = true;\n        } else {\n          scaleX = oldScaleX;\n        }\n        if (isNumber(scaleY)) {\n          changed = true;\n        } else {\n          scaleY = oldScaleY;\n        }\n        if (changed) {\n          if (isFunction(options.scale)) {\n            addListener(element, EVENT_SCALE, options.scale, {\n              once: true\n            });\n          }\n          if (dispatchEvent(element, EVENT_SCALE, {\n            scaleX: scaleX,\n            scaleY: scaleY,\n            oldScaleX: oldScaleX,\n            oldScaleY: oldScaleY\n          }) === false) {\n            return this;\n          }\n          imageData.scaleX = scaleX;\n          imageData.scaleY = scaleY;\n          this.scaling = true;\n          this.renderImage(function () {\n            _this5.scaling = false;\n            if (isFunction(options.scaled)) {\n              addListener(element, EVENT_SCALED, options.scaled, {\n                once: true\n              });\n            }\n            dispatchEvent(element, EVENT_SCALED, {\n              scaleX: scaleX,\n              scaleY: scaleY,\n              oldScaleX: oldScaleX,\n              oldScaleY: oldScaleY\n            }, {\n              cancelable: false\n            });\n          });\n        }\n      }\n      return this;\n    },\n    /**\n     * Zoom the image with a relative ratio.\n     * @param {number} ratio - The target ratio.\n     * @param {boolean} [showTooltip=false] - Indicates whether to show the tooltip.\n     * @param {Object} [pivot] - The pivot point coordinate for zooming.\n     * @param {Event} [_originalEvent=null] - The original event if any.\n     * @returns {Viewer} this\n     */\n    zoom: function zoom(ratio) {\n      var showTooltip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var pivot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n      var _originalEvent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n      var imageData = this.imageData;\n      ratio = Number(ratio);\n      if (ratio < 0) {\n        ratio = 1 / (1 - ratio);\n      } else {\n        ratio = 1 + ratio;\n      }\n      this.zoomTo(imageData.width * ratio / imageData.naturalWidth, showTooltip, pivot, _originalEvent);\n      return this;\n    },\n    /**\n     * Zoom the image to an absolute ratio.\n     * @param {number} ratio - The target ratio.\n     * @param {boolean} [showTooltip] - Indicates whether to show the tooltip.\n     * @param {Object} [pivot] - The pivot point coordinate for zooming.\n     * @param {Event} [_originalEvent=null] - The original event if any.\n     * @param {Event} [_zoomable=false] - Indicates if the current zoom is available or not.\n     * @returns {Viewer} this\n     */\n    zoomTo: function zoomTo(ratio) {\n      var _this6 = this;\n      var showTooltip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var pivot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n      var _originalEvent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n      var _zoomable = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n      var element = this.element,\n        options = this.options,\n        pointers = this.pointers,\n        imageData = this.imageData;\n      var x = imageData.x,\n        y = imageData.y,\n        width = imageData.width,\n        height = imageData.height,\n        naturalWidth = imageData.naturalWidth,\n        naturalHeight = imageData.naturalHeight;\n      ratio = Math.max(0, ratio);\n      if (isNumber(ratio) && this.viewed && !this.played && (_zoomable || options.zoomable)) {\n        if (!_zoomable) {\n          var minZoomRatio = Math.max(0.01, options.minZoomRatio);\n          var maxZoomRatio = Math.min(100, options.maxZoomRatio);\n          ratio = Math.min(Math.max(ratio, minZoomRatio), maxZoomRatio);\n        }\n        if (_originalEvent) {\n          switch (_originalEvent.type) {\n            case 'wheel':\n              if (options.zoomRatio >= 0.055 && ratio > 0.95 && ratio < 1.05) {\n                ratio = 1;\n              }\n              break;\n            case 'pointermove':\n            case 'touchmove':\n            case 'mousemove':\n              if (ratio > 0.99 && ratio < 1.01) {\n                ratio = 1;\n              }\n              break;\n          }\n        }\n        var newWidth = naturalWidth * ratio;\n        var newHeight = naturalHeight * ratio;\n        var offsetWidth = newWidth - width;\n        var offsetHeight = newHeight - height;\n        var oldRatio = imageData.ratio;\n        if (isFunction(options.zoom)) {\n          addListener(element, EVENT_ZOOM, options.zoom, {\n            once: true\n          });\n        }\n        if (dispatchEvent(element, EVENT_ZOOM, {\n          ratio: ratio,\n          oldRatio: oldRatio,\n          originalEvent: _originalEvent\n        }) === false) {\n          return this;\n        }\n        this.zooming = true;\n        if (_originalEvent) {\n          var offset = getOffset(this.viewer);\n          var center = pointers && Object.keys(pointers).length > 0 ? getPointersCenter(pointers) : {\n            pageX: _originalEvent.pageX,\n            pageY: _originalEvent.pageY\n          };\n\n          // Zoom from the triggering point of the event\n          imageData.x -= offsetWidth * ((center.pageX - offset.left - x) / width);\n          imageData.y -= offsetHeight * ((center.pageY - offset.top - y) / height);\n        } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n          imageData.x -= offsetWidth * ((pivot.x - x) / width);\n          imageData.y -= offsetHeight * ((pivot.y - y) / height);\n        } else {\n          // Zoom from the center of the image\n          imageData.x -= offsetWidth / 2;\n          imageData.y -= offsetHeight / 2;\n        }\n        imageData.left = imageData.x;\n        imageData.top = imageData.y;\n        imageData.width = newWidth;\n        imageData.height = newHeight;\n        imageData.oldRatio = oldRatio;\n        imageData.ratio = ratio;\n        this.renderImage(function () {\n          _this6.zooming = false;\n          if (isFunction(options.zoomed)) {\n            addListener(element, EVENT_ZOOMED, options.zoomed, {\n              once: true\n            });\n          }\n          dispatchEvent(element, EVENT_ZOOMED, {\n            ratio: ratio,\n            oldRatio: oldRatio,\n            originalEvent: _originalEvent\n          }, {\n            cancelable: false\n          });\n        });\n        if (showTooltip) {\n          this.tooltip();\n        }\n      }\n      return this;\n    },\n    /**\n     * Play the images\n     * @param {boolean|FullscreenOptions} [fullscreen=false] - Indicate if request fullscreen or not.\n     * @returns {Viewer} this\n     */\n    play: function play() {\n      var _this7 = this;\n      var fullscreen = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      if (!this.isShown || this.played) {\n        return this;\n      }\n      var element = this.element,\n        options = this.options;\n      if (isFunction(options.play)) {\n        addListener(element, EVENT_PLAY, options.play, {\n          once: true\n        });\n      }\n      if (dispatchEvent(element, EVENT_PLAY) === false) {\n        return this;\n      }\n      var player = this.player;\n      var onLoad = this.loadImage.bind(this);\n      var list = [];\n      var total = 0;\n      var index = 0;\n      this.played = true;\n      this.onLoadWhenPlay = onLoad;\n      if (fullscreen) {\n        this.requestFullscreen(fullscreen);\n      }\n      addClass(player, CLASS_SHOW);\n      forEach(this.items, function (item, i) {\n        var img = item.querySelector('img');\n        var image = document.createElement('img');\n        image.src = getData(img, 'originalUrl');\n        image.alt = img.getAttribute('alt');\n        image.referrerPolicy = img.referrerPolicy;\n        total += 1;\n        addClass(image, CLASS_FADE);\n        toggleClass(image, CLASS_TRANSITION, options.transition);\n        if (hasClass(item, CLASS_ACTIVE)) {\n          addClass(image, CLASS_IN);\n          index = i;\n        }\n        list.push(image);\n        addListener(image, EVENT_LOAD, onLoad, {\n          once: true\n        });\n        player.appendChild(image);\n      });\n      if (isNumber(options.interval) && options.interval > 0) {\n        var _prev = function prev() {\n          clearTimeout(_this7.playing.timeout);\n          removeClass(list[index], CLASS_IN);\n          index -= 1;\n          index = index >= 0 ? index : total - 1;\n          addClass(list[index], CLASS_IN);\n          _this7.playing.timeout = setTimeout(_prev, options.interval);\n        };\n        var _next = function next() {\n          clearTimeout(_this7.playing.timeout);\n          removeClass(list[index], CLASS_IN);\n          index += 1;\n          index = index < total ? index : 0;\n          addClass(list[index], CLASS_IN);\n          _this7.playing.timeout = setTimeout(_next, options.interval);\n        };\n        if (total > 1) {\n          this.playing = {\n            prev: _prev,\n            next: _next,\n            timeout: setTimeout(_next, options.interval)\n          };\n        }\n      }\n      return this;\n    },\n    // Stop play\n    stop: function stop() {\n      var _this8 = this;\n      if (!this.played) {\n        return this;\n      }\n      var element = this.element,\n        options = this.options;\n      if (isFunction(options.stop)) {\n        addListener(element, EVENT_STOP, options.stop, {\n          once: true\n        });\n      }\n      if (dispatchEvent(element, EVENT_STOP) === false) {\n        return this;\n      }\n      var player = this.player;\n      clearTimeout(this.playing.timeout);\n      this.playing = false;\n      this.played = false;\n      forEach(player.getElementsByTagName('img'), function (image) {\n        removeListener(image, EVENT_LOAD, _this8.onLoadWhenPlay);\n      });\n      removeClass(player, CLASS_SHOW);\n      player.innerHTML = '';\n      this.exitFullscreen();\n      return this;\n    },\n    // Enter modal mode (only available in inline mode)\n    full: function full() {\n      var _this9 = this;\n      var options = this.options,\n        viewer = this.viewer,\n        image = this.image,\n        list = this.list;\n      if (!this.isShown || this.played || this.fulled || !options.inline) {\n        return this;\n      }\n      this.fulled = true;\n      this.open();\n      addClass(this.button, CLASS_FULLSCREEN_EXIT);\n      if (options.transition) {\n        removeClass(list, CLASS_TRANSITION);\n        if (this.viewed) {\n          removeClass(image, CLASS_TRANSITION);\n        }\n      }\n      addClass(viewer, CLASS_FIXED);\n      viewer.setAttribute('role', 'dialog');\n      viewer.setAttribute('aria-labelledby', this.title.id);\n      viewer.setAttribute('aria-modal', true);\n      viewer.removeAttribute('style');\n      setStyle(viewer, {\n        zIndex: options.zIndex\n      });\n      if (options.focus) {\n        this.enforceFocus();\n      }\n      this.initContainer();\n      this.viewerData = assign({}, this.containerData);\n      this.renderList();\n      if (this.viewed) {\n        this.initImage(function () {\n          _this9.renderImage(function () {\n            if (options.transition) {\n              setTimeout(function () {\n                addClass(image, CLASS_TRANSITION);\n                addClass(list, CLASS_TRANSITION);\n              }, 0);\n            }\n          });\n        });\n      }\n      return this;\n    },\n    // Exit modal mode (only available in inline mode)\n    exit: function exit() {\n      var _this10 = this;\n      var options = this.options,\n        viewer = this.viewer,\n        image = this.image,\n        list = this.list;\n      if (!this.isShown || this.played || !this.fulled || !options.inline) {\n        return this;\n      }\n      this.fulled = false;\n      this.close();\n      removeClass(this.button, CLASS_FULLSCREEN_EXIT);\n      if (options.transition) {\n        removeClass(list, CLASS_TRANSITION);\n        if (this.viewed) {\n          removeClass(image, CLASS_TRANSITION);\n        }\n      }\n      if (options.focus) {\n        this.clearEnforceFocus();\n      }\n      viewer.removeAttribute('role');\n      viewer.removeAttribute('aria-labelledby');\n      viewer.removeAttribute('aria-modal');\n      removeClass(viewer, CLASS_FIXED);\n      setStyle(viewer, {\n        zIndex: options.zIndexInline\n      });\n      this.viewerData = assign({}, this.parentData);\n      this.renderViewer();\n      this.renderList();\n      if (this.viewed) {\n        this.initImage(function () {\n          _this10.renderImage(function () {\n            if (options.transition) {\n              setTimeout(function () {\n                addClass(image, CLASS_TRANSITION);\n                addClass(list, CLASS_TRANSITION);\n              }, 0);\n            }\n          });\n        });\n      }\n      return this;\n    },\n    // Show the current ratio of the image with percentage\n    tooltip: function tooltip() {\n      var _this11 = this;\n      var options = this.options,\n        tooltipBox = this.tooltipBox,\n        imageData = this.imageData;\n      if (!this.viewed || this.played || !options.tooltip) {\n        return this;\n      }\n      tooltipBox.textContent = \"\".concat(Math.round(imageData.ratio * 100), \"%\");\n      if (!this.tooltipping) {\n        if (options.transition) {\n          if (this.fading) {\n            dispatchEvent(tooltipBox, EVENT_TRANSITION_END);\n          }\n          addClass(tooltipBox, CLASS_SHOW);\n          addClass(tooltipBox, CLASS_FADE);\n          addClass(tooltipBox, CLASS_TRANSITION);\n          tooltipBox.removeAttribute('aria-hidden');\n\n          // Force reflow to enable CSS3 transition\n          tooltipBox.initialOffsetWidth = tooltipBox.offsetWidth;\n          addClass(tooltipBox, CLASS_IN);\n        } else {\n          addClass(tooltipBox, CLASS_SHOW);\n          tooltipBox.removeAttribute('aria-hidden');\n        }\n      } else {\n        clearTimeout(this.tooltipping);\n      }\n      this.tooltipping = setTimeout(function () {\n        if (options.transition) {\n          addListener(tooltipBox, EVENT_TRANSITION_END, function () {\n            removeClass(tooltipBox, CLASS_SHOW);\n            removeClass(tooltipBox, CLASS_FADE);\n            removeClass(tooltipBox, CLASS_TRANSITION);\n            tooltipBox.setAttribute('aria-hidden', true);\n            _this11.fading = false;\n          }, {\n            once: true\n          });\n          removeClass(tooltipBox, CLASS_IN);\n          _this11.fading = true;\n        } else {\n          removeClass(tooltipBox, CLASS_SHOW);\n          tooltipBox.setAttribute('aria-hidden', true);\n        }\n        _this11.tooltipping = false;\n      }, 1000);\n      return this;\n    },\n    /**\n     * Toggle the image size between its current size and natural size\n     * @param {Event} [_originalEvent=null] - The original event if any.\n     * @returns {Viewer} this\n     */\n    toggle: function toggle() {\n      var _originalEvent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n      if (this.imageData.ratio === 1) {\n        this.zoomTo(this.imageData.oldRatio, true, null, _originalEvent);\n      } else {\n        this.zoomTo(1, true, null, _originalEvent);\n      }\n      return this;\n    },\n    // Reset the image to its initial state\n    reset: function reset() {\n      if (this.viewed && !this.played) {\n        this.imageData = assign({}, this.initialImageData);\n        this.renderImage();\n      }\n      return this;\n    },\n    // Update viewer when images changed\n    update: function update() {\n      var _this12 = this;\n      var element = this.element,\n        options = this.options,\n        isImg = this.isImg;\n\n      // Destroy viewer if the target image was deleted\n      if (isImg && !element.parentNode) {\n        return this.destroy();\n      }\n      var images = [];\n      forEach(isImg ? [element] : element.querySelectorAll('img'), function (image) {\n        if (isFunction(options.filter)) {\n          if (options.filter.call(_this12, image)) {\n            images.push(image);\n          }\n        } else if (_this12.getImageURL(image)) {\n          images.push(image);\n        }\n      });\n      if (!images.length) {\n        return this;\n      }\n      this.images = images;\n      this.length = images.length;\n      if (this.ready) {\n        var changedIndexes = [];\n        forEach(this.items, function (item, i) {\n          var img = item.querySelector('img');\n          var image = images[i];\n          if (image && img) {\n            if (image.src !== img.src\n\n            // Title changed (#408)\n            || image.alt !== img.alt) {\n              changedIndexes.push(i);\n            }\n          } else {\n            changedIndexes.push(i);\n          }\n        });\n        setStyle(this.list, {\n          width: 'auto'\n        });\n        this.initList();\n        if (this.isShown) {\n          if (this.length) {\n            if (this.viewed) {\n              var changedIndex = changedIndexes.indexOf(this.index);\n              if (changedIndex >= 0) {\n                this.viewed = false;\n                this.view(Math.max(Math.min(this.index - changedIndex, this.length - 1), 0));\n              } else {\n                var activeItem = this.items[this.index];\n\n                // Reactivate the current viewing item after reset the list.\n                addClass(activeItem, CLASS_ACTIVE);\n                activeItem.setAttribute('aria-selected', true);\n              }\n            }\n          } else {\n            this.image = null;\n            this.viewed = false;\n            this.index = 0;\n            this.imageData = {};\n            this.canvas.innerHTML = '';\n            this.title.innerHTML = '';\n          }\n        }\n      } else {\n        this.build();\n      }\n      return this;\n    },\n    // Destroy the viewer\n    destroy: function destroy() {\n      var element = this.element,\n        options = this.options;\n      if (!element[NAMESPACE]) {\n        return this;\n      }\n      this.destroyed = true;\n      if (this.ready) {\n        if (this.played) {\n          this.stop();\n        }\n        if (options.inline) {\n          if (this.fulled) {\n            this.exit();\n          }\n          this.unbind();\n        } else if (this.isShown) {\n          if (this.viewing) {\n            if (this.imageRendering) {\n              this.imageRendering.abort();\n            } else if (this.imageInitializing) {\n              this.imageInitializing.abort();\n            }\n          }\n          if (this.hiding) {\n            this.transitioning.abort();\n          }\n          this.hidden();\n        } else if (this.showing) {\n          this.transitioning.abort();\n          this.hidden();\n        }\n        this.ready = false;\n        this.viewer.parentNode.removeChild(this.viewer);\n      } else if (options.inline) {\n        if (this.delaying) {\n          this.delaying.abort();\n        } else if (this.initializing) {\n          this.initializing.abort();\n        }\n      }\n      if (!options.inline) {\n        removeListener(element, EVENT_CLICK, this.onStart);\n      }\n      element[NAMESPACE] = undefined;\n      return this;\n    }\n  };\n\n  var others = {\n    getImageURL: function getImageURL(image) {\n      var url = this.options.url;\n      if (isString(url)) {\n        url = image.getAttribute(url);\n      } else if (isFunction(url)) {\n        url = url.call(this, image);\n      } else {\n        url = '';\n      }\n      return url;\n    },\n    enforceFocus: function enforceFocus() {\n      var _this = this;\n      this.clearEnforceFocus();\n      addListener(document, EVENT_FOCUSIN, this.onFocusin = function (event) {\n        var viewer = _this.viewer;\n        var target = event.target;\n        if (target === document || target === viewer || viewer.contains(target)) {\n          return;\n        }\n        while (target) {\n          // Avoid conflicts with other modals (#474, #540)\n          if (target.getAttribute('tabindex') !== null || target.getAttribute('aria-modal') === 'true') {\n            return;\n          }\n          target = target.parentElement;\n        }\n        viewer.focus();\n      });\n    },\n    clearEnforceFocus: function clearEnforceFocus() {\n      if (this.onFocusin) {\n        removeListener(document, EVENT_FOCUSIN, this.onFocusin);\n        this.onFocusin = null;\n      }\n    },\n    open: function open() {\n      var body = this.body;\n      addClass(body, CLASS_OPEN);\n      if (this.scrollbarWidth > 0) {\n        body.style.paddingRight = \"\".concat(this.scrollbarWidth + (parseFloat(this.initialBodyComputedPaddingRight) || 0), \"px\");\n      }\n    },\n    close: function close() {\n      var body = this.body;\n      removeClass(body, CLASS_OPEN);\n      if (this.scrollbarWidth > 0) {\n        body.style.paddingRight = this.initialBodyPaddingRight;\n      }\n    },\n    shown: function shown() {\n      var element = this.element,\n        options = this.options,\n        viewer = this.viewer;\n      this.fulled = true;\n      this.isShown = true;\n      this.render();\n      this.bind();\n      this.showing = false;\n      if (options.focus) {\n        viewer.focus();\n        this.enforceFocus();\n      }\n      if (isFunction(options.shown)) {\n        addListener(element, EVENT_SHOWN, options.shown, {\n          once: true\n        });\n      }\n      if (dispatchEvent(element, EVENT_SHOWN) === false) {\n        return;\n      }\n      if (this.ready && this.isShown && !this.hiding) {\n        this.view(this.index);\n      }\n    },\n    hidden: function hidden() {\n      var element = this.element,\n        options = this.options,\n        viewer = this.viewer;\n      if (options.fucus) {\n        this.clearEnforceFocus();\n      }\n      this.close();\n      this.unbind();\n      addClass(viewer, CLASS_HIDE);\n      viewer.removeAttribute('role');\n      viewer.removeAttribute('aria-labelledby');\n      viewer.removeAttribute('aria-modal');\n      viewer.setAttribute('aria-hidden', true);\n      this.resetList();\n      this.resetImage();\n      this.fulled = false;\n      this.viewed = false;\n      this.isShown = false;\n      this.hiding = false;\n      if (!this.destroyed) {\n        if (isFunction(options.hidden)) {\n          addListener(element, EVENT_HIDDEN, options.hidden, {\n            once: true\n          });\n        }\n        dispatchEvent(element, EVENT_HIDDEN, null, {\n          cancelable: false\n        });\n      }\n    },\n    requestFullscreen: function requestFullscreen(options) {\n      var document = this.element.ownerDocument;\n      if (this.fulled && !(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement)) {\n        var documentElement = document.documentElement;\n\n        // Element.requestFullscreen()\n        if (documentElement.requestFullscreen) {\n          // Avoid TypeError when convert `options` to dictionary\n          if (isPlainObject(options)) {\n            documentElement.requestFullscreen(options);\n          } else {\n            documentElement.requestFullscreen();\n          }\n        } else if (documentElement.webkitRequestFullscreen) {\n          documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n        } else if (documentElement.mozRequestFullScreen) {\n          documentElement.mozRequestFullScreen();\n        } else if (documentElement.msRequestFullscreen) {\n          documentElement.msRequestFullscreen();\n        }\n      }\n    },\n    exitFullscreen: function exitFullscreen() {\n      var document = this.element.ownerDocument;\n      if (this.fulled && (document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement)) {\n        // Document.exitFullscreen()\n        if (document.exitFullscreen) {\n          document.exitFullscreen();\n        } else if (document.webkitExitFullscreen) {\n          document.webkitExitFullscreen();\n        } else if (document.mozCancelFullScreen) {\n          document.mozCancelFullScreen();\n        } else if (document.msExitFullscreen) {\n          document.msExitFullscreen();\n        }\n      }\n    },\n    change: function change(event) {\n      var options = this.options,\n        pointers = this.pointers;\n      var pointer = pointers[Object.keys(pointers)[0]];\n\n      // In the case of the `pointers` object is empty (#421)\n      if (!pointer) {\n        return;\n      }\n      var offsetX = pointer.endX - pointer.startX;\n      var offsetY = pointer.endY - pointer.startY;\n      switch (this.action) {\n        // Move the current image\n        case ACTION_MOVE:\n          if (offsetX !== 0 || offsetY !== 0) {\n            this.pointerMoved = true;\n            this.move(offsetX, offsetY, event);\n          }\n          break;\n\n        // Zoom the current image\n        case ACTION_ZOOM:\n          this.zoom(getMaxZoomRatio(pointers), false, null, event);\n          break;\n        case ACTION_SWITCH:\n          {\n            this.action = 'switched';\n            var absoluteOffsetX = Math.abs(offsetX);\n            if (absoluteOffsetX > 1 && absoluteOffsetX > Math.abs(offsetY)) {\n              // Empty `pointers` as `touchend` event will not be fired after swiped in iOS browsers.\n              this.pointers = {};\n              if (offsetX > 1) {\n                this.prev(options.loop);\n              } else if (offsetX < -1) {\n                this.next(options.loop);\n              }\n            }\n            break;\n          }\n      }\n\n      // Override\n      forEach(pointers, function (p) {\n        p.startX = p.endX;\n        p.startY = p.endY;\n      });\n    },\n    isSwitchable: function isSwitchable() {\n      var imageData = this.imageData,\n        viewerData = this.viewerData;\n      return this.length > 1 && imageData.x >= 0 && imageData.y >= 0 && imageData.width <= viewerData.width && imageData.height <= viewerData.height;\n    }\n  };\n\n  var AnotherViewer = WINDOW.Viewer;\n  var getUniqueID = function (id) {\n    return function () {\n      id += 1;\n      return id;\n    };\n  }(-1);\n  var Viewer = /*#__PURE__*/function () {\n    /**\n     * Create a new Viewer.\n     * @param {Element} element - The target element for viewing.\n     * @param {Object} [options={}] - The configuration options.\n     */\n    function Viewer(element) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      _classCallCheck(this, Viewer);\n      if (!element || element.nodeType !== 1) {\n        throw new Error('The first argument is required and must be an element.');\n      }\n      this.element = element;\n      this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n      this.action = false;\n      this.fading = false;\n      this.fulled = false;\n      this.hiding = false;\n      this.imageClicked = false;\n      this.imageData = {};\n      this.index = this.options.initialViewIndex;\n      this.isImg = false;\n      this.isShown = false;\n      this.length = 0;\n      this.moving = false;\n      this.played = false;\n      this.playing = false;\n      this.pointers = {};\n      this.ready = false;\n      this.rotating = false;\n      this.scaling = false;\n      this.showing = false;\n      this.timeout = false;\n      this.tooltipping = false;\n      this.viewed = false;\n      this.viewing = false;\n      this.wheeling = false;\n      this.zooming = false;\n      this.pointerMoved = false;\n      this.id = getUniqueID();\n      this.init();\n    }\n    return _createClass(Viewer, [{\n      key: \"init\",\n      value: function init() {\n        var _this = this;\n        var element = this.element,\n          options = this.options;\n        if (element[NAMESPACE]) {\n          return;\n        }\n        element[NAMESPACE] = this;\n\n        // The `focus` option requires the `keyboard` option set to `true`.\n        if (options.focus && !options.keyboard) {\n          options.focus = false;\n        }\n        var isImg = element.localName === 'img';\n        var images = [];\n        forEach(isImg ? [element] : element.querySelectorAll('img'), function (image) {\n          if (isFunction(options.filter)) {\n            if (options.filter.call(_this, image)) {\n              images.push(image);\n            }\n          } else if (_this.getImageURL(image)) {\n            images.push(image);\n          }\n        });\n        this.isImg = isImg;\n        this.length = images.length;\n        this.images = images;\n        this.initBody();\n\n        // Override `transition` option if it is not supported\n        if (isUndefined(document.createElement(NAMESPACE).style.transition)) {\n          options.transition = false;\n        }\n        if (options.inline) {\n          var count = 0;\n          var progress = function progress() {\n            count += 1;\n            if (count === _this.length) {\n              var timeout;\n              _this.initializing = false;\n              _this.delaying = {\n                abort: function abort() {\n                  clearTimeout(timeout);\n                }\n              };\n\n              // build asynchronously to keep `this.viewer` is accessible in `ready` event handler.\n              timeout = setTimeout(function () {\n                _this.delaying = false;\n                _this.build();\n              }, 0);\n            }\n          };\n          this.initializing = {\n            abort: function abort() {\n              forEach(images, function (image) {\n                if (!image.complete) {\n                  removeListener(image, EVENT_LOAD, progress);\n                  removeListener(image, EVENT_ERROR, progress);\n                }\n              });\n            }\n          };\n          forEach(images, function (image) {\n            if (image.complete) {\n              progress();\n            } else {\n              var onLoad;\n              var onError;\n              addListener(image, EVENT_LOAD, onLoad = function onLoad() {\n                removeListener(image, EVENT_ERROR, onError);\n                progress();\n              }, {\n                once: true\n              });\n              addListener(image, EVENT_ERROR, onError = function onError() {\n                removeListener(image, EVENT_LOAD, onLoad);\n                progress();\n              }, {\n                once: true\n              });\n            }\n          });\n        } else {\n          addListener(element, EVENT_CLICK, this.onStart = function (_ref) {\n            var target = _ref.target;\n            if (target.localName === 'img' && (!isFunction(options.filter) || options.filter.call(_this, target))) {\n              _this.view(_this.images.indexOf(target));\n            }\n          });\n        }\n      }\n    }, {\n      key: \"build\",\n      value: function build() {\n        if (this.ready) {\n          return;\n        }\n        var element = this.element,\n          options = this.options;\n        var parent = element.parentNode;\n        var template = document.createElement('div');\n        template.innerHTML = TEMPLATE;\n        var viewer = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n        var title = viewer.querySelector(\".\".concat(NAMESPACE, \"-title\"));\n        var toolbar = viewer.querySelector(\".\".concat(NAMESPACE, \"-toolbar\"));\n        var navbar = viewer.querySelector(\".\".concat(NAMESPACE, \"-navbar\"));\n        var button = viewer.querySelector(\".\".concat(NAMESPACE, \"-button\"));\n        var canvas = viewer.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n        this.parent = parent;\n        this.viewer = viewer;\n        this.title = title;\n        this.toolbar = toolbar;\n        this.navbar = navbar;\n        this.button = button;\n        this.canvas = canvas;\n        this.footer = viewer.querySelector(\".\".concat(NAMESPACE, \"-footer\"));\n        this.tooltipBox = viewer.querySelector(\".\".concat(NAMESPACE, \"-tooltip\"));\n        this.player = viewer.querySelector(\".\".concat(NAMESPACE, \"-player\"));\n        this.list = viewer.querySelector(\".\".concat(NAMESPACE, \"-list\"));\n        viewer.id = \"\".concat(NAMESPACE).concat(this.id);\n        title.id = \"\".concat(NAMESPACE, \"Title\").concat(this.id);\n        addClass(title, !options.title ? CLASS_HIDE : getResponsiveClass(Array.isArray(options.title) ? options.title[0] : options.title));\n        addClass(navbar, !options.navbar ? CLASS_HIDE : getResponsiveClass(options.navbar));\n        toggleClass(button, CLASS_HIDE, !options.button);\n        if (options.keyboard) {\n          button.setAttribute('tabindex', 0);\n        }\n        if (options.backdrop) {\n          addClass(viewer, \"\".concat(NAMESPACE, \"-backdrop\"));\n          if (!options.inline && options.backdrop !== 'static') {\n            setData(canvas, DATA_ACTION, 'hide');\n          }\n        }\n        if (isString(options.className) && options.className) {\n          // In case there are multiple class names\n          options.className.split(REGEXP_SPACES).forEach(function (className) {\n            addClass(viewer, className);\n          });\n        }\n        if (options.toolbar) {\n          var list = document.createElement('ul');\n          var custom = isPlainObject(options.toolbar);\n          var zoomButtons = BUTTONS.slice(0, 3);\n          var rotateButtons = BUTTONS.slice(7, 9);\n          var scaleButtons = BUTTONS.slice(9);\n          if (!custom) {\n            addClass(toolbar, getResponsiveClass(options.toolbar));\n          }\n          forEach(custom ? options.toolbar : BUTTONS, function (value, index) {\n            var deep = custom && isPlainObject(value);\n            var name = custom ? hyphenate(index) : value;\n            var show = deep && !isUndefined(value.show) ? value.show : value;\n            if (!show || !options.zoomable && zoomButtons.indexOf(name) !== -1 || !options.rotatable && rotateButtons.indexOf(name) !== -1 || !options.scalable && scaleButtons.indexOf(name) !== -1) {\n              return;\n            }\n            var size = deep && !isUndefined(value.size) ? value.size : value;\n            var click = deep && !isUndefined(value.click) ? value.click : value;\n            var item = document.createElement('li');\n            if (options.keyboard) {\n              item.setAttribute('tabindex', 0);\n            }\n            item.setAttribute('role', 'button');\n            addClass(item, \"\".concat(NAMESPACE, \"-\").concat(name));\n            if (!isFunction(click)) {\n              setData(item, DATA_ACTION, name);\n            }\n            if (isNumber(show)) {\n              addClass(item, getResponsiveClass(show));\n            }\n            if (['small', 'large'].indexOf(size) !== -1) {\n              addClass(item, \"\".concat(NAMESPACE, \"-\").concat(size));\n            } else if (name === 'play') {\n              addClass(item, \"\".concat(NAMESPACE, \"-large\"));\n            }\n            if (isFunction(click)) {\n              addListener(item, EVENT_CLICK, click);\n            }\n            list.appendChild(item);\n          });\n          toolbar.appendChild(list);\n        } else {\n          addClass(toolbar, CLASS_HIDE);\n        }\n        if (!options.rotatable) {\n          var rotates = toolbar.querySelectorAll('li[class*=\"rotate\"]');\n          addClass(rotates, CLASS_INVISIBLE);\n          forEach(rotates, function (rotate) {\n            toolbar.appendChild(rotate);\n          });\n        }\n        if (options.inline) {\n          addClass(button, CLASS_FULLSCREEN);\n          setStyle(viewer, {\n            zIndex: options.zIndexInline\n          });\n          if (window.getComputedStyle(parent).position === 'static') {\n            setStyle(parent, {\n              position: 'relative'\n            });\n          }\n          parent.insertBefore(viewer, element.nextSibling);\n        } else {\n          addClass(button, CLASS_CLOSE);\n          addClass(viewer, CLASS_FIXED);\n          addClass(viewer, CLASS_FADE);\n          addClass(viewer, CLASS_HIDE);\n          setStyle(viewer, {\n            zIndex: options.zIndex\n          });\n          var container = options.container;\n          if (isString(container)) {\n            container = element.ownerDocument.querySelector(container);\n          }\n          if (!container) {\n            container = this.body;\n          }\n          container.appendChild(viewer);\n        }\n        if (options.inline) {\n          this.render();\n          this.bind();\n          this.isShown = true;\n        }\n        this.ready = true;\n        if (isFunction(options.ready)) {\n          addListener(element, EVENT_READY, options.ready, {\n            once: true\n          });\n        }\n        if (dispatchEvent(element, EVENT_READY) === false) {\n          this.ready = false;\n          return;\n        }\n        if (this.ready && options.inline) {\n          this.view(this.index);\n        }\n      }\n\n      /**\n       * Get the no conflict viewer class.\n       * @returns {Viewer} The viewer class.\n       */\n    }], [{\n      key: \"noConflict\",\n      value: function noConflict() {\n        window.Viewer = AnotherViewer;\n        return Viewer;\n      }\n\n      /**\n       * Change the default options.\n       * @param {Object} options - The new default options.\n       */\n    }, {\n      key: \"setDefaults\",\n      value: function setDefaults(options) {\n        assign(DEFAULTS, isPlainObject(options) && options);\n      }\n    }]);\n  }();\n  assign(Viewer.prototype, render, events, handlers, methods, others);\n\n  return Viewer;\n\n}));\n","'use strict';\n\nvar tslib_es6 = require('./external/tslib/tslib.es6.cjs');\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\nvar _Channel_onmessage, _Channel_nextMessageIndex, _Channel_pendingMessages, _Channel_messageEndIndex, _Resource_rid;\n/**\n * Invoke your custom commands.\n *\n * This package is also accessible with `window.__TAURI__.core` when [`app.withGlobalTauri`](https://v2.tauri.app/reference/config/#withglobaltauri) in `tauri.conf.json` is set to `true`.\n * @module\n */\n/**\n * A key to be used to implement a special function\n * on your types that define how your type should be serialized\n * when passing across the IPC.\n * @example\n * Given a type in Rust that looks like this\n * ```rs\n * #[derive(serde::Serialize, serde::Deserialize)\n * enum UserId {\n *   String(String),\n *   Number(u32),\n * }\n * ```\n * `UserId::String(\"id\")` would be serialized into `{ String: \"id\" }`\n * and so we need to pass the same structure back to Rust\n * ```ts\n * import { SERIALIZE_TO_IPC_FN } from \"@tauri-apps/api/core\"\n *\n * class UserIdString {\n *   id\n *   constructor(id) {\n *     this.id = id\n *   }\n *\n *   [SERIALIZE_TO_IPC_FN]() {\n *     return { String: this.id }\n *   }\n * }\n *\n * class UserIdNumber {\n *   id\n *   constructor(id) {\n *     this.id = id\n *   }\n *\n *   [SERIALIZE_TO_IPC_FN]() {\n *     return { Number: this.id }\n *   }\n * }\n *\n * type UserId = UserIdString | UserIdNumber\n * ```\n *\n */\n// if this value changes, make sure to update it in:\n// 1. ipc.js\n// 2. process-ipc-message-fn.js\nconst SERIALIZE_TO_IPC_FN = '__TAURI_TO_IPC_KEY__';\n/**\n * Transforms a callback function to a string identifier that can be passed to the backend.\n * The backend uses the identifier to `eval()` the callback.\n *\n * @return A unique identifier associated with the callback function.\n *\n * @since 1.0.0\n */\nfunction transformCallback(callback, once = false) {\n    return window.__TAURI_INTERNALS__.transformCallback(callback, once);\n}\nclass Channel {\n    constructor(onmessage) {\n        _Channel_onmessage.set(this, void 0);\n        // the index is used as a mechanism to preserve message order\n        _Channel_nextMessageIndex.set(this, 0);\n        _Channel_pendingMessages.set(this, []);\n        _Channel_messageEndIndex.set(this, void 0);\n        tslib_es6.__classPrivateFieldSet(this, _Channel_onmessage, onmessage || (() => { }), \"f\");\n        this.id = transformCallback((rawMessage) => {\n            const index = rawMessage.index;\n            if ('end' in rawMessage) {\n                if (index == tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n                    this.cleanupCallback();\n                }\n                else {\n                    tslib_es6.__classPrivateFieldSet(this, _Channel_messageEndIndex, index, \"f\");\n                }\n                return;\n            }\n            const message = rawMessage.message;\n            // Process the message if we're at the right order\n            if (index == tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n                tslib_es6.__classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n                tslib_es6.__classPrivateFieldSet(this, _Channel_nextMessageIndex, tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n                // process pending messages\n                while (tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") in tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")) {\n                    const message = tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n                    tslib_es6.__classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n                    // eslint-disable-next-line @typescript-eslint/no-array-delete\n                    delete tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n                    tslib_es6.__classPrivateFieldSet(this, _Channel_nextMessageIndex, tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n                }\n                if (tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") === tslib_es6.__classPrivateFieldGet(this, _Channel_messageEndIndex, \"f\")) {\n                    this.cleanupCallback();\n                }\n            }\n            // Queue the message if we're not\n            else {\n                // eslint-disable-next-line security/detect-object-injection\n                tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[index] = message;\n            }\n        });\n    }\n    cleanupCallback() {\n        Reflect.deleteProperty(window, `_${this.id}`);\n    }\n    set onmessage(handler) {\n        tslib_es6.__classPrivateFieldSet(this, _Channel_onmessage, handler, \"f\");\n    }\n    get onmessage() {\n        return tslib_es6.__classPrivateFieldGet(this, _Channel_onmessage, \"f\");\n    }\n    [(_Channel_onmessage = new WeakMap(), _Channel_nextMessageIndex = new WeakMap(), _Channel_pendingMessages = new WeakMap(), _Channel_messageEndIndex = new WeakMap(), SERIALIZE_TO_IPC_FN)]() {\n        return `__CHANNEL__:${this.id}`;\n    }\n    toJSON() {\n        // eslint-disable-next-line security/detect-object-injection\n        return this[SERIALIZE_TO_IPC_FN]();\n    }\n}\nclass PluginListener {\n    constructor(plugin, event, channelId) {\n        this.plugin = plugin;\n        this.event = event;\n        this.channelId = channelId;\n    }\n    async unregister() {\n        return invoke(`plugin:${this.plugin}|remove_listener`, {\n            event: this.event,\n            channelId: this.channelId\n        });\n    }\n}\n/**\n * Adds a listener to a plugin event.\n *\n * @returns The listener object to stop listening to the events.\n *\n * @since 2.0.0\n */\nasync function addPluginListener(plugin, event, cb) {\n    const handler = new Channel(cb);\n    return invoke(`plugin:${plugin}|registerListener`, { event, handler }).then(() => new PluginListener(plugin, event, handler.id));\n}\n/**\n * Get permission state for a plugin.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function checkPermissions(plugin) {\n    return invoke(`plugin:${plugin}|check_permissions`);\n}\n/**\n * Request permissions.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function requestPermissions(plugin) {\n    return invoke(`plugin:${plugin}|request_permissions`);\n}\n/**\n * Sends a message to the backend.\n * @example\n * ```typescript\n * import { invoke } from '@tauri-apps/api/core';\n * await invoke('login', { user: 'tauri', password: 'poiwe3h4r5ip3yrhtew9ty' });\n * ```\n *\n * @param cmd The command name.\n * @param args The optional arguments to pass to the command.\n * @param options The request options.\n * @return A promise resolving or rejecting to the backend response.\n *\n * @since 1.0.0\n */\nasync function invoke(cmd, args = {}, options) {\n    return window.__TAURI_INTERNALS__.invoke(cmd, args, options);\n}\n/**\n * Convert a device file path to an URL that can be loaded by the webview.\n * Note that `asset:` and `http://asset.localhost` must be added to [`app.security.csp`](https://v2.tauri.app/reference/config/#csp-1) in `tauri.conf.json`.\n * Example CSP value: `\"csp\": \"default-src 'self' ipc: http://ipc.localhost; img-src 'self' asset: http://asset.localhost\"` to use the asset protocol on image sources.\n *\n * Additionally, `\"enable\" : \"true\"` must be added to [`app.security.assetProtocol`](https://v2.tauri.app/reference/config/#assetprotocolconfig)\n * in `tauri.conf.json` and its access scope must be defined on the `scope` array on the same `assetProtocol` object.\n *\n * @param  filePath The file path.\n * @param  protocol The protocol to use. Defaults to `asset`. You only need to set this when using a custom protocol.\n * @example\n * ```typescript\n * import { appDataDir, join } from '@tauri-apps/api/path';\n * import { convertFileSrc } from '@tauri-apps/api/core';\n * const appDataDirPath = await appDataDir();\n * const filePath = await join(appDataDirPath, 'assets/video.mp4');\n * const assetUrl = convertFileSrc(filePath);\n *\n * const video = document.getElementById('my-video');\n * const source = document.createElement('source');\n * source.type = 'video/mp4';\n * source.src = assetUrl;\n * video.appendChild(source);\n * video.load();\n * ```\n *\n * @return the URL that can be used as source on the webview.\n *\n * @since 1.0.0\n */\nfunction convertFileSrc(filePath, protocol = 'asset') {\n    return window.__TAURI_INTERNALS__.convertFileSrc(filePath, protocol);\n}\n/**\n * A rust-backed resource stored through `tauri::Manager::resources_table` API.\n *\n * The resource lives in the main process and does not exist\n * in the Javascript world, and thus will not be cleaned up automatiacally\n * except on application exit. If you want to clean it up early, call {@linkcode Resource.close}\n *\n * @example\n * ```typescript\n * import { Resource, invoke } from '@tauri-apps/api/core';\n * export class DatabaseHandle extends Resource {\n *   static async open(path: string): Promise<DatabaseHandle> {\n *     const rid: number = await invoke('open_db', { path });\n *     return new DatabaseHandle(rid);\n *   }\n *\n *   async execute(sql: string): Promise<void> {\n *     await invoke('execute_sql', { rid: this.rid, sql });\n *   }\n * }\n * ```\n */\nclass Resource {\n    get rid() {\n        return tslib_es6.__classPrivateFieldGet(this, _Resource_rid, \"f\");\n    }\n    constructor(rid) {\n        _Resource_rid.set(this, void 0);\n        tslib_es6.__classPrivateFieldSet(this, _Resource_rid, rid, \"f\");\n    }\n    /**\n     * Destroys and cleans up this resource from memory.\n     * **You should not call any method on this object anymore and should drop any reference to it.**\n     */\n    async close() {\n        return invoke('plugin:resources|close', {\n            rid: this.rid\n        });\n    }\n}\n_Resource_rid = new WeakMap();\nfunction isTauri() {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access\n    return !!(globalThis || window).isTauri;\n}\n\nexports.Channel = Channel;\nexports.PluginListener = PluginListener;\nexports.Resource = Resource;\nexports.SERIALIZE_TO_IPC_FN = SERIALIZE_TO_IPC_FN;\nexports.addPluginListener = addPluginListener;\nexports.checkPermissions = checkPermissions;\nexports.convertFileSrc = convertFileSrc;\nexports.invoke = invoke;\nexports.isTauri = isTauri;\nexports.requestPermissions = requestPermissions;\nexports.transformCallback = transformCallback;\n","'use strict';\n\nvar core = require('./core.cjs');\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\n/**\n * The event system allows you to emit events to the backend and listen to events from it.\n *\n * This package is also accessible with `window.__TAURI__.event` when [`app.withGlobalTauri`](https://v2.tauri.app/reference/config/#withglobaltauri) in `tauri.conf.json` is set to `true`.\n * @module\n */\n/**\n * @since 1.1.0\n */\nexports.TauriEvent = void 0;\n(function (TauriEvent) {\n    TauriEvent[\"WINDOW_RESIZED\"] = \"tauri://resize\";\n    TauriEvent[\"WINDOW_MOVED\"] = \"tauri://move\";\n    TauriEvent[\"WINDOW_CLOSE_REQUESTED\"] = \"tauri://close-requested\";\n    TauriEvent[\"WINDOW_DESTROYED\"] = \"tauri://destroyed\";\n    TauriEvent[\"WINDOW_FOCUS\"] = \"tauri://focus\";\n    TauriEvent[\"WINDOW_BLUR\"] = \"tauri://blur\";\n    TauriEvent[\"WINDOW_SCALE_FACTOR_CHANGED\"] = \"tauri://scale-change\";\n    TauriEvent[\"WINDOW_THEME_CHANGED\"] = \"tauri://theme-changed\";\n    TauriEvent[\"WINDOW_CREATED\"] = \"tauri://window-created\";\n    TauriEvent[\"WEBVIEW_CREATED\"] = \"tauri://webview-created\";\n    TauriEvent[\"DRAG_ENTER\"] = \"tauri://drag-enter\";\n    TauriEvent[\"DRAG_OVER\"] = \"tauri://drag-over\";\n    TauriEvent[\"DRAG_DROP\"] = \"tauri://drag-drop\";\n    TauriEvent[\"DRAG_LEAVE\"] = \"tauri://drag-leave\";\n})(exports.TauriEvent || (exports.TauriEvent = {}));\n/**\n * Unregister the event listener associated with the given name and id.\n *\n * @ignore\n * @param event The event name\n * @param eventId Event identifier\n * @returns\n */\nasync function _unlisten(event, eventId) {\n    await core.invoke('plugin:event|unlisten', {\n        event,\n        eventId\n    });\n}\n/**\n * Listen to an emitted event to any {@link EventTarget|target}.\n *\n * @example\n * ```typescript\n * import { listen } from '@tauri-apps/api/event';\n * const unlisten = await listen<string>('error', (event) => {\n *   console.log(`Got error, payload: ${event.payload}`);\n * });\n *\n * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted\n * unlisten();\n * ```\n *\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param handler Event handler callback.\n * @param options Event listening options.\n * @returns A promise resolving to a function to unlisten to the event.\n * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted.\n *\n * @since 1.0.0\n */\nasync function listen(event, handler, options) {\n    var _a;\n    const target = typeof (options === null || options === void 0 ? void 0 : options.target) === 'string'\n        ? { kind: 'AnyLabel', label: options.target }\n        : ((_a = options === null || options === void 0 ? void 0 : options.target) !== null && _a !== void 0 ? _a : { kind: 'Any' });\n    return core.invoke('plugin:event|listen', {\n        event,\n        target,\n        handler: core.transformCallback(handler)\n    }).then((eventId) => {\n        return async () => _unlisten(event, eventId);\n    });\n}\n/**\n * Listens once to an emitted event to any {@link EventTarget|target}.\n *\n * @example\n * ```typescript\n * import { once } from '@tauri-apps/api/event';\n * interface LoadedPayload {\n *   loggedIn: boolean,\n *   token: string\n * }\n * const unlisten = await once<LoadedPayload>('loaded', (event) => {\n *   console.log(`App is loaded, loggedIn: ${event.payload.loggedIn}, token: ${event.payload.token}`);\n * });\n *\n * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted\n * unlisten();\n * ```\n *\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param handler Event handler callback.\n * @param options Event listening options.\n * @returns A promise resolving to a function to unlisten to the event.\n * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted.\n *\n * @since 1.0.0\n */\nasync function once(event, handler, options) {\n    return listen(event, (eventData) => {\n        // eslint-disable-next-line @typescript-eslint/no-floating-promises\n        _unlisten(event, eventData.id);\n        handler(eventData);\n    }, options);\n}\n/**\n * Emits an event to all {@link EventTarget|targets}.\n *\n * @example\n * ```typescript\n * import { emit } from '@tauri-apps/api/event';\n * await emit('frontend-loaded', { loggedIn: true, token: 'authToken' });\n * ```\n *\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param payload Event payload.\n *\n * @since 1.0.0\n */\nasync function emit(event, payload) {\n    await core.invoke('plugin:event|emit', {\n        event,\n        payload\n    });\n}\n/**\n * Emits an event to all {@link EventTarget|targets} matching the given target.\n *\n * @example\n * ```typescript\n * import { emitTo } from '@tauri-apps/api/event';\n * await emitTo('main', 'frontend-loaded', { loggedIn: true, token: 'authToken' });\n * ```\n *\n * @param target Label of the target Window/Webview/WebviewWindow or raw {@link EventTarget} object.\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param payload Event payload.\n *\n * @since 2.0.0\n */\nasync function emitTo(target, event, payload) {\n    const eventTarget = typeof target === 'string' ? { kind: 'AnyLabel', label: target } : target;\n    await core.invoke('plugin:event|emit_to', {\n        target: eventTarget,\n        event,\n        payload\n    });\n}\n\nexports.emit = emit;\nexports.emitTo = emitTo;\nexports.listen = listen;\nexports.once = once;\n","'use strict';\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nexports.__classPrivateFieldGet = __classPrivateFieldGet;\nexports.__classPrivateFieldSet = __classPrivateFieldSet;\n","'use strict';\n\nvar core = require('@tauri-apps/api/core');\n\n// Copyright 2019-2023 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\n/**\n * Open a file/directory selection dialog.\n *\n * The selected paths are added to the filesystem and asset protocol scopes.\n * When security is more important than the easy of use of this API,\n * prefer writing a dedicated command instead.\n *\n * Note that the scope change is not persisted, so the values are cleared when the application is restarted.\n * You can save it to the filesystem using [tauri-plugin-persisted-scope](https://github.com/tauri-apps/tauri-plugin-persisted-scope).\n * @example\n * ```typescript\n * import { open } from '@tauri-apps/plugin-dialog';\n * // Open a selection dialog for image files\n * const selected = await open({\n *   multiple: true,\n *   filters: [{\n *     name: 'Image',\n *     extensions: ['png', 'jpeg']\n *   }]\n * });\n * if (Array.isArray(selected)) {\n *   // user selected multiple files\n * } else if (selected === null) {\n *   // user cancelled the selection\n * } else {\n *   // user selected a single file\n * }\n * ```\n *\n * @example\n * ```typescript\n * import { open } from '@tauri-apps/plugin-dialog';\n * import { appDir } from '@tauri-apps/api/path';\n * // Open a selection dialog for directories\n * const selected = await open({\n *   directory: true,\n *   multiple: true,\n *   defaultPath: await appDir(),\n * });\n * if (Array.isArray(selected)) {\n *   // user selected multiple directories\n * } else if (selected === null) {\n *   // user cancelled the selection\n * } else {\n *   // user selected a single directory\n * }\n * ```\n *\n * @returns A promise resolving to the selected path(s)\n *\n * @since 2.0.0\n */\nasync function open(options = {}) {\n    if (typeof options === 'object') {\n        Object.freeze(options);\n    }\n    return await core.invoke('plugin:dialog|open', { options });\n}\n/**\n * Open a file/directory save dialog.\n *\n * The selected path is added to the filesystem and asset protocol scopes.\n * When security is more important than the easy of use of this API,\n * prefer writing a dedicated command instead.\n *\n * Note that the scope change is not persisted, so the values are cleared when the application is restarted.\n * You can save it to the filesystem using [tauri-plugin-persisted-scope](https://github.com/tauri-apps/tauri-plugin-persisted-scope).\n * @example\n * ```typescript\n * import { save } from '@tauri-apps/plugin-dialog';\n * const filePath = await save({\n *   filters: [{\n *     name: 'Image',\n *     extensions: ['png', 'jpeg']\n *   }]\n * });\n * ```\n *\n * @returns A promise resolving to the selected path.\n *\n * @since 2.0.0\n */\nasync function save(options = {}) {\n    if (typeof options === 'object') {\n        Object.freeze(options);\n    }\n    return await core.invoke('plugin:dialog|save', { options });\n}\n/**\n * Shows a message dialog with an `Ok` button.\n * @example\n * ```typescript\n * import { message } from '@tauri-apps/plugin-dialog';\n * await message('Tauri is awesome', 'Tauri');\n * await message('File not found', { title: 'Tauri', kind: 'error' });\n * ```\n *\n * @param message The message to show.\n * @param options The dialog's options. If a string, it represents the dialog title.\n *\n * @returns A promise indicating the success or failure of the operation.\n *\n * @since 2.0.0\n *\n */\nasync function message(message, options) {\n    const opts = typeof options === 'string' ? { title: options } : options;\n    await core.invoke('plugin:dialog|message', {\n        message: message.toString(),\n        title: opts?.title?.toString(),\n        kind: opts?.kind,\n        okButtonLabel: opts?.okLabel?.toString()\n    });\n}\n/**\n * Shows a question dialog with `Yes` and `No` buttons.\n * @example\n * ```typescript\n * import { ask } from '@tauri-apps/plugin-dialog';\n * const yes = await ask('Are you sure?', 'Tauri');\n * const yes2 = await ask('This action cannot be reverted. Are you sure?', { title: 'Tauri', kind: 'warning' });\n * ```\n *\n * @param message The message to show.\n * @param options The dialog's options. If a string, it represents the dialog title.\n *\n * @returns A promise resolving to a boolean indicating whether `Yes` was clicked or not.\n *\n * @since 2.0.0\n */\nasync function ask(message, options) {\n    const opts = typeof options === 'string' ? { title: options } : options;\n    return await core.invoke('plugin:dialog|ask', {\n        message: message.toString(),\n        title: opts?.title?.toString(),\n        kind: opts?.kind,\n        yesButtonLabel: opts?.okLabel?.toString(),\n        noButtonLabel: opts?.cancelLabel?.toString()\n    });\n}\n/**\n * Shows a question dialog with `Ok` and `Cancel` buttons.\n * @example\n * ```typescript\n * import { confirm } from '@tauri-apps/plugin-dialog';\n * const confirmed = await confirm('Are you sure?', 'Tauri');\n * const confirmed2 = await confirm('This action cannot be reverted. Are you sure?', { title: 'Tauri', kind: 'warning' });\n * ```\n *\n * @param message The message to show.\n * @param options The dialog's options. If a string, it represents the dialog title.\n *\n * @returns A promise resolving to a boolean indicating whether `Ok` was clicked or not.\n *\n * @since 2.0.0\n */\nasync function confirm(message, options) {\n    const opts = typeof options === 'string' ? { title: options } : options;\n    return await core.invoke('plugin:dialog|confirm', {\n        message: message.toString(),\n        title: opts?.title?.toString(),\n        kind: opts?.kind,\n        okButtonLabel: opts?.okLabel?.toString(),\n        cancelButtonLabel: opts?.cancelLabel?.toString()\n    });\n}\n\nexports.ask = ask;\nexports.confirm = confirm;\nexports.message = message;\nexports.open = open;\nexports.save = save;\n","'use strict';\n\nvar tslib_es6 = require('./external/tslib/tslib.es6.cjs');\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\nvar _Channel_onmessage, _Channel_nextMessageIndex, _Channel_pendingMessages, _Channel_messageEndIndex, _Resource_rid;\n/**\n * Invoke your custom commands.\n *\n * This package is also accessible with `window.__TAURI__.core` when [`app.withGlobalTauri`](https://v2.tauri.app/reference/config/#withglobaltauri) in `tauri.conf.json` is set to `true`.\n * @module\n */\n/**\n * A key to be used to implement a special function\n * on your types that define how your type should be serialized\n * when passing across the IPC.\n * @example\n * Given a type in Rust that looks like this\n * ```rs\n * #[derive(serde::Serialize, serde::Deserialize)\n * enum UserId {\n *   String(String),\n *   Number(u32),\n * }\n * ```\n * `UserId::String(\"id\")` would be serialized into `{ String: \"id\" }`\n * and so we need to pass the same structure back to Rust\n * ```ts\n * import { SERIALIZE_TO_IPC_FN } from \"@tauri-apps/api/core\"\n *\n * class UserIdString {\n *   id\n *   constructor(id) {\n *     this.id = id\n *   }\n *\n *   [SERIALIZE_TO_IPC_FN]() {\n *     return { String: this.id }\n *   }\n * }\n *\n * class UserIdNumber {\n *   id\n *   constructor(id) {\n *     this.id = id\n *   }\n *\n *   [SERIALIZE_TO_IPC_FN]() {\n *     return { Number: this.id }\n *   }\n * }\n *\n * type UserId = UserIdString | UserIdNumber\n * ```\n *\n */\n// if this value changes, make sure to update it in:\n// 1. ipc.js\n// 2. process-ipc-message-fn.js\nconst SERIALIZE_TO_IPC_FN = '__TAURI_TO_IPC_KEY__';\n/**\n * Stores the callback in a known location, and returns an identifier that can be passed to the backend.\n * The backend uses the identifier to `eval()` the callback.\n *\n * @return An unique identifier associated with the callback function.\n *\n * @since 1.0.0\n */\nfunction transformCallback(\n// TODO: Make this not optional in v3\ncallback, once = false) {\n    return window.__TAURI_INTERNALS__.transformCallback(callback, once);\n}\nclass Channel {\n    constructor(onmessage) {\n        _Channel_onmessage.set(this, void 0);\n        // the index is used as a mechanism to preserve message order\n        _Channel_nextMessageIndex.set(this, 0);\n        _Channel_pendingMessages.set(this, []);\n        _Channel_messageEndIndex.set(this, void 0);\n        tslib_es6.__classPrivateFieldSet(this, _Channel_onmessage, onmessage || (() => { }), \"f\");\n        this.id = transformCallback((rawMessage) => {\n            const index = rawMessage.index;\n            if ('end' in rawMessage) {\n                if (index == tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n                    this.cleanupCallback();\n                }\n                else {\n                    tslib_es6.__classPrivateFieldSet(this, _Channel_messageEndIndex, index, \"f\");\n                }\n                return;\n            }\n            const message = rawMessage.message;\n            // Process the message if we're at the right order\n            if (index == tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n                tslib_es6.__classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n                tslib_es6.__classPrivateFieldSet(this, _Channel_nextMessageIndex, tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n                // process pending messages\n                while (tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") in tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")) {\n                    const message = tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n                    tslib_es6.__classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n                    // eslint-disable-next-line @typescript-eslint/no-array-delete\n                    delete tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n                    tslib_es6.__classPrivateFieldSet(this, _Channel_nextMessageIndex, tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n                }\n                if (tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") === tslib_es6.__classPrivateFieldGet(this, _Channel_messageEndIndex, \"f\")) {\n                    this.cleanupCallback();\n                }\n            }\n            // Queue the message if we're not\n            else {\n                // eslint-disable-next-line security/detect-object-injection\n                tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[index] = message;\n            }\n        });\n    }\n    cleanupCallback() {\n        window.__TAURI_INTERNALS__.unregisterCallback(this.id);\n    }\n    set onmessage(handler) {\n        tslib_es6.__classPrivateFieldSet(this, _Channel_onmessage, handler, \"f\");\n    }\n    get onmessage() {\n        return tslib_es6.__classPrivateFieldGet(this, _Channel_onmessage, \"f\");\n    }\n    [(_Channel_onmessage = new WeakMap(), _Channel_nextMessageIndex = new WeakMap(), _Channel_pendingMessages = new WeakMap(), _Channel_messageEndIndex = new WeakMap(), SERIALIZE_TO_IPC_FN)]() {\n        return `__CHANNEL__:${this.id}`;\n    }\n    toJSON() {\n        // eslint-disable-next-line security/detect-object-injection\n        return this[SERIALIZE_TO_IPC_FN]();\n    }\n}\nclass PluginListener {\n    constructor(plugin, event, channelId) {\n        this.plugin = plugin;\n        this.event = event;\n        this.channelId = channelId;\n    }\n    async unregister() {\n        return invoke(`plugin:${this.plugin}|remove_listener`, {\n            event: this.event,\n            channelId: this.channelId\n        });\n    }\n}\n/**\n * Adds a listener to a plugin event.\n *\n * @returns The listener object to stop listening to the events.\n *\n * @since 2.0.0\n */\nasync function addPluginListener(plugin, event, cb) {\n    const handler = new Channel(cb);\n    try {\n        await invoke(`plugin:${plugin}|register_listener`, {\n            event,\n            handler\n        });\n        return new PluginListener(plugin, event, handler.id);\n    }\n    catch {\n        // TODO(v3): remove this fallback\n        // note: we must try with camelCase here for backwards compatibility\n        await invoke(`plugin:${plugin}|registerListener`, { event, handler });\n        return new PluginListener(plugin, event, handler.id);\n    }\n}\n/**\n * Get permission state for a plugin.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function checkPermissions(plugin) {\n    return invoke(`plugin:${plugin}|check_permissions`);\n}\n/**\n * Request permissions.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function requestPermissions(plugin) {\n    return invoke(`plugin:${plugin}|request_permissions`);\n}\n/**\n * Sends a message to the backend.\n * @example\n * ```typescript\n * import { invoke } from '@tauri-apps/api/core';\n * await invoke('login', { user: 'tauri', password: 'poiwe3h4r5ip3yrhtew9ty' });\n * ```\n *\n * @param cmd The command name.\n * @param args The optional arguments to pass to the command.\n * @param options The request options.\n * @return A promise resolving or rejecting to the backend response.\n *\n * @since 1.0.0\n */\nasync function invoke(cmd, args = {}, options) {\n    return window.__TAURI_INTERNALS__.invoke(cmd, args, options);\n}\n/**\n * Convert a device file path to an URL that can be loaded by the webview.\n * Note that `asset:` and `http://asset.localhost` must be added to [`app.security.csp`](https://v2.tauri.app/reference/config/#csp-1) in `tauri.conf.json`.\n * Example CSP value: `\"csp\": \"default-src 'self' ipc: http://ipc.localhost; img-src 'self' asset: http://asset.localhost\"` to use the asset protocol on image sources.\n *\n * Additionally, `\"enable\" : \"true\"` must be added to [`app.security.assetProtocol`](https://v2.tauri.app/reference/config/#assetprotocolconfig)\n * in `tauri.conf.json` and its access scope must be defined on the `scope` array on the same `assetProtocol` object.\n *\n * @param  filePath The file path.\n * @param  protocol The protocol to use. Defaults to `asset`. You only need to set this when using a custom protocol.\n * @example\n * ```typescript\n * import { appDataDir, join } from '@tauri-apps/api/path';\n * import { convertFileSrc } from '@tauri-apps/api/core';\n * const appDataDirPath = await appDataDir();\n * const filePath = await join(appDataDirPath, 'assets/video.mp4');\n * const assetUrl = convertFileSrc(filePath);\n *\n * const video = document.getElementById('my-video');\n * const source = document.createElement('source');\n * source.type = 'video/mp4';\n * source.src = assetUrl;\n * video.appendChild(source);\n * video.load();\n * ```\n *\n * @return the URL that can be used as source on the webview.\n *\n * @since 1.0.0\n */\nfunction convertFileSrc(filePath, protocol = 'asset') {\n    return window.__TAURI_INTERNALS__.convertFileSrc(filePath, protocol);\n}\n/**\n * A rust-backed resource stored through `tauri::Manager::resources_table` API.\n *\n * The resource lives in the main process and does not exist\n * in the Javascript world, and thus will not be cleaned up automatically\n * except on application exit. If you want to clean it up early, call {@linkcode Resource.close}\n *\n * @example\n * ```typescript\n * import { Resource, invoke } from '@tauri-apps/api/core';\n * export class DatabaseHandle extends Resource {\n *   static async open(path: string): Promise<DatabaseHandle> {\n *     const rid: number = await invoke('open_db', { path });\n *     return new DatabaseHandle(rid);\n *   }\n *\n *   async execute(sql: string): Promise<void> {\n *     await invoke('execute_sql', { rid: this.rid, sql });\n *   }\n * }\n * ```\n */\nclass Resource {\n    get rid() {\n        return tslib_es6.__classPrivateFieldGet(this, _Resource_rid, \"f\");\n    }\n    constructor(rid) {\n        _Resource_rid.set(this, void 0);\n        tslib_es6.__classPrivateFieldSet(this, _Resource_rid, rid, \"f\");\n    }\n    /**\n     * Destroys and cleans up this resource from memory.\n     * **You should not call any method on this object anymore and should drop any reference to it.**\n     */\n    async close() {\n        return invoke('plugin:resources|close', {\n            rid: this.rid\n        });\n    }\n}\n_Resource_rid = new WeakMap();\nfunction isTauri() {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n    return !!(globalThis || window).isTauri;\n}\n\nexports.Channel = Channel;\nexports.PluginListener = PluginListener;\nexports.Resource = Resource;\nexports.SERIALIZE_TO_IPC_FN = SERIALIZE_TO_IPC_FN;\nexports.addPluginListener = addPluginListener;\nexports.checkPermissions = checkPermissions;\nexports.convertFileSrc = convertFileSrc;\nexports.invoke = invoke;\nexports.isTauri = isTauri;\nexports.requestPermissions = requestPermissions;\nexports.transformCallback = transformCallback;\n","'use strict';\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nexports.__classPrivateFieldGet = __classPrivateFieldGet;\nexports.__classPrivateFieldSet = __classPrivateFieldSet;\n","'use strict';\n\nvar core = require('@tauri-apps/api/core');\n\n// Copyright 2019-2023 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\n/**\n * Open files and URLs using their default application.\n *\n * ## Security\n *\n * This API has a scope configuration that forces you to restrict the files and urls to be opened.\n *\n * ### Restricting access to the {@link open | `open`} API\n *\n * On the configuration object, `open: true` means that the {@link open} API can be used with any URL,\n * as the argument is validated with the `^((mailto:\\w+)|(tel:\\w+)|(https?://\\w+)).+` regex.\n * You can change that regex by changing the boolean value to a string, e.g. `open: ^https://github.com/`.\n *\n * @module\n */\n/**\n * Opens a url with the system's default app, or the one specified with {@linkcode openWith}.\n *\n * @example\n * ```typescript\n * import { openUrl } from '@tauri-apps/plugin-opener';\n *\n * // opens the given URL on the default browser:\n * await openUrl('https://github.com/tauri-apps/tauri');\n * // opens the given URL using `firefox`:\n * await openUrl('https://github.com/tauri-apps/tauri', 'firefox');\n * ```\n *\n * @param url The URL to open.\n * @param openWith The app to open the URL with. If not specified, defaults to the system default application for the specified url type.\n *\n * @since 2.0.0\n */\nasync function openUrl(url, openWith) {\n    await core.invoke('plugin:opener|open_url', {\n        url,\n        with: openWith\n    });\n}\n/**\n * Opens a path with the system's default app, or the one specified with {@linkcode openWith}.\n *\n * @example\n * ```typescript\n * import { openPath } from '@tauri-apps/plugin-opener';\n *\n * // opens a file using the default program:\n * await openPath('/path/to/file');\n * // opens a file using `vlc` command on Windows.\n * await openPath('C:/path/to/file', 'vlc');\n * ```\n *\n * @param path The path to open.\n * @param openWith The app to open the path with. If not specified, defaults to the system default application for the specified path type.\n *\n * @since 2.0.0\n */\nasync function openPath(path, openWith) {\n    await core.invoke('plugin:opener|open_path', {\n        path,\n        with: openWith\n    });\n}\n/**\n * Reveal a path with the system's default explorer.\n *\n * #### Platform-specific:\n *\n * - **Android / iOS:** Unsupported.\n *\n * @example\n * ```typescript\n * import { revealItemInDir } from '@tauri-apps/plugin-opener';\n * await revealItemInDir('/path/to/file');\n * ```\n *\n * @param path The path to reveal.\n *\n * @since 2.0.0\n */\nasync function revealItemInDir(path) {\n    return core.invoke('plugin:opener|reveal_item_in_dir', { path });\n}\n\nexports.openPath = openPath;\nexports.openUrl = openUrl;\nexports.revealItemInDir = revealItemInDir;\n","'use strict';\n\nvar tslib_es6 = require('./external/tslib/tslib.es6.cjs');\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\nvar _Channel_onmessage, _Channel_nextMessageIndex, _Channel_pendingMessages, _Channel_messageEndIndex, _Resource_rid;\n/**\n * Invoke your custom commands.\n *\n * This package is also accessible with `window.__TAURI__.core` when [`app.withGlobalTauri`](https://v2.tauri.app/reference/config/#withglobaltauri) in `tauri.conf.json` is set to `true`.\n * @module\n */\n/**\n * A key to be used to implement a special function\n * on your types that define how your type should be serialized\n * when passing across the IPC.\n * @example\n * Given a type in Rust that looks like this\n * ```rs\n * #[derive(serde::Serialize, serde::Deserialize)\n * enum UserId {\n *   String(String),\n *   Number(u32),\n * }\n * ```\n * `UserId::String(\"id\")` would be serialized into `{ String: \"id\" }`\n * and so we need to pass the same structure back to Rust\n * ```ts\n * import { SERIALIZE_TO_IPC_FN } from \"@tauri-apps/api/core\"\n *\n * class UserIdString {\n *   id\n *   constructor(id) {\n *     this.id = id\n *   }\n *\n *   [SERIALIZE_TO_IPC_FN]() {\n *     return { String: this.id }\n *   }\n * }\n *\n * class UserIdNumber {\n *   id\n *   constructor(id) {\n *     this.id = id\n *   }\n *\n *   [SERIALIZE_TO_IPC_FN]() {\n *     return { Number: this.id }\n *   }\n * }\n *\n * type UserId = UserIdString | UserIdNumber\n * ```\n *\n */\n// if this value changes, make sure to update it in:\n// 1. ipc.js\n// 2. process-ipc-message-fn.js\nconst SERIALIZE_TO_IPC_FN = '__TAURI_TO_IPC_KEY__';\n/**\n * Stores the callback in a known location, and returns an identifier that can be passed to the backend.\n * The backend uses the identifier to `eval()` the callback.\n *\n * @return An unique identifier associated with the callback function.\n *\n * @since 1.0.0\n */\nfunction transformCallback(\n// TODO: Make this not optional in v3\ncallback, once = false) {\n    return window.__TAURI_INTERNALS__.transformCallback(callback, once);\n}\nclass Channel {\n    constructor(onmessage) {\n        _Channel_onmessage.set(this, void 0);\n        // the index is used as a mechanism to preserve message order\n        _Channel_nextMessageIndex.set(this, 0);\n        _Channel_pendingMessages.set(this, []);\n        _Channel_messageEndIndex.set(this, void 0);\n        tslib_es6.__classPrivateFieldSet(this, _Channel_onmessage, onmessage || (() => { }), \"f\");\n        this.id = transformCallback((rawMessage) => {\n            const index = rawMessage.index;\n            if ('end' in rawMessage) {\n                if (index == tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n                    this.cleanupCallback();\n                }\n                else {\n                    tslib_es6.__classPrivateFieldSet(this, _Channel_messageEndIndex, index, \"f\");\n                }\n                return;\n            }\n            const message = rawMessage.message;\n            // Process the message if we're at the right order\n            if (index == tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n                tslib_es6.__classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n                tslib_es6.__classPrivateFieldSet(this, _Channel_nextMessageIndex, tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n                // process pending messages\n                while (tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") in tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")) {\n                    const message = tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n                    tslib_es6.__classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n                    // eslint-disable-next-line @typescript-eslint/no-array-delete\n                    delete tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n                    tslib_es6.__classPrivateFieldSet(this, _Channel_nextMessageIndex, tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n                }\n                if (tslib_es6.__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") === tslib_es6.__classPrivateFieldGet(this, _Channel_messageEndIndex, \"f\")) {\n                    this.cleanupCallback();\n                }\n            }\n            // Queue the message if we're not\n            else {\n                // eslint-disable-next-line security/detect-object-injection\n                tslib_es6.__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[index] = message;\n            }\n        });\n    }\n    cleanupCallback() {\n        window.__TAURI_INTERNALS__.unregisterCallback(this.id);\n    }\n    set onmessage(handler) {\n        tslib_es6.__classPrivateFieldSet(this, _Channel_onmessage, handler, \"f\");\n    }\n    get onmessage() {\n        return tslib_es6.__classPrivateFieldGet(this, _Channel_onmessage, \"f\");\n    }\n    [(_Channel_onmessage = new WeakMap(), _Channel_nextMessageIndex = new WeakMap(), _Channel_pendingMessages = new WeakMap(), _Channel_messageEndIndex = new WeakMap(), SERIALIZE_TO_IPC_FN)]() {\n        return `__CHANNEL__:${this.id}`;\n    }\n    toJSON() {\n        // eslint-disable-next-line security/detect-object-injection\n        return this[SERIALIZE_TO_IPC_FN]();\n    }\n}\nclass PluginListener {\n    constructor(plugin, event, channelId) {\n        this.plugin = plugin;\n        this.event = event;\n        this.channelId = channelId;\n    }\n    async unregister() {\n        return invoke(`plugin:${this.plugin}|remove_listener`, {\n            event: this.event,\n            channelId: this.channelId\n        });\n    }\n}\n/**\n * Adds a listener to a plugin event.\n *\n * @returns The listener object to stop listening to the events.\n *\n * @since 2.0.0\n */\nasync function addPluginListener(plugin, event, cb) {\n    const handler = new Channel(cb);\n    try {\n        await invoke(`plugin:${plugin}|register_listener`, {\n            event,\n            handler\n        });\n        return new PluginListener(plugin, event, handler.id);\n    }\n    catch {\n        // TODO(v3): remove this fallback\n        // note: we must try with camelCase here for backwards compatibility\n        await invoke(`plugin:${plugin}|registerListener`, { event, handler });\n        return new PluginListener(plugin, event, handler.id);\n    }\n}\n/**\n * Get permission state for a plugin.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function checkPermissions(plugin) {\n    return invoke(`plugin:${plugin}|check_permissions`);\n}\n/**\n * Request permissions.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function requestPermissions(plugin) {\n    return invoke(`plugin:${plugin}|request_permissions`);\n}\n/**\n * Sends a message to the backend.\n * @example\n * ```typescript\n * import { invoke } from '@tauri-apps/api/core';\n * await invoke('login', { user: 'tauri', password: 'poiwe3h4r5ip3yrhtew9ty' });\n * ```\n *\n * @param cmd The command name.\n * @param args The optional arguments to pass to the command.\n * @param options The request options.\n * @return A promise resolving or rejecting to the backend response.\n *\n * @since 1.0.0\n */\nasync function invoke(cmd, args = {}, options) {\n    return window.__TAURI_INTERNALS__.invoke(cmd, args, options);\n}\n/**\n * Convert a device file path to an URL that can be loaded by the webview.\n * Note that `asset:` and `http://asset.localhost` must be added to [`app.security.csp`](https://v2.tauri.app/reference/config/#csp-1) in `tauri.conf.json`.\n * Example CSP value: `\"csp\": \"default-src 'self' ipc: http://ipc.localhost; img-src 'self' asset: http://asset.localhost\"` to use the asset protocol on image sources.\n *\n * Additionally, `\"enable\" : \"true\"` must be added to [`app.security.assetProtocol`](https://v2.tauri.app/reference/config/#assetprotocolconfig)\n * in `tauri.conf.json` and its access scope must be defined on the `scope` array on the same `assetProtocol` object.\n *\n * @param  filePath The file path.\n * @param  protocol The protocol to use. Defaults to `asset`. You only need to set this when using a custom protocol.\n * @example\n * ```typescript\n * import { appDataDir, join } from '@tauri-apps/api/path';\n * import { convertFileSrc } from '@tauri-apps/api/core';\n * const appDataDirPath = await appDataDir();\n * const filePath = await join(appDataDirPath, 'assets/video.mp4');\n * const assetUrl = convertFileSrc(filePath);\n *\n * const video = document.getElementById('my-video');\n * const source = document.createElement('source');\n * source.type = 'video/mp4';\n * source.src = assetUrl;\n * video.appendChild(source);\n * video.load();\n * ```\n *\n * @return the URL that can be used as source on the webview.\n *\n * @since 1.0.0\n */\nfunction convertFileSrc(filePath, protocol = 'asset') {\n    return window.__TAURI_INTERNALS__.convertFileSrc(filePath, protocol);\n}\n/**\n * A rust-backed resource stored through `tauri::Manager::resources_table` API.\n *\n * The resource lives in the main process and does not exist\n * in the Javascript world, and thus will not be cleaned up automatically\n * except on application exit. If you want to clean it up early, call {@linkcode Resource.close}\n *\n * @example\n * ```typescript\n * import { Resource, invoke } from '@tauri-apps/api/core';\n * export class DatabaseHandle extends Resource {\n *   static async open(path: string): Promise<DatabaseHandle> {\n *     const rid: number = await invoke('open_db', { path });\n *     return new DatabaseHandle(rid);\n *   }\n *\n *   async execute(sql: string): Promise<void> {\n *     await invoke('execute_sql', { rid: this.rid, sql });\n *   }\n * }\n * ```\n */\nclass Resource {\n    get rid() {\n        return tslib_es6.__classPrivateFieldGet(this, _Resource_rid, \"f\");\n    }\n    constructor(rid) {\n        _Resource_rid.set(this, void 0);\n        tslib_es6.__classPrivateFieldSet(this, _Resource_rid, rid, \"f\");\n    }\n    /**\n     * Destroys and cleans up this resource from memory.\n     * **You should not call any method on this object anymore and should drop any reference to it.**\n     */\n    async close() {\n        return invoke('plugin:resources|close', {\n            rid: this.rid\n        });\n    }\n}\n_Resource_rid = new WeakMap();\nfunction isTauri() {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n    return !!(globalThis || window).isTauri;\n}\n\nexports.Channel = Channel;\nexports.PluginListener = PluginListener;\nexports.Resource = Resource;\nexports.SERIALIZE_TO_IPC_FN = SERIALIZE_TO_IPC_FN;\nexports.addPluginListener = addPluginListener;\nexports.checkPermissions = checkPermissions;\nexports.convertFileSrc = convertFileSrc;\nexports.invoke = invoke;\nexports.isTauri = isTauri;\nexports.requestPermissions = requestPermissions;\nexports.transformCallback = transformCallback;\n","'use strict';\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nexports.__classPrivateFieldGet = __classPrivateFieldGet;\nexports.__classPrivateFieldSet = __classPrivateFieldSet;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.version = exports.validate = exports.v7 = exports.v6ToV1 = exports.v6 = exports.v5 = exports.v4 = exports.v3 = exports.v1ToV6 = exports.v1 = exports.stringify = exports.parse = exports.NIL = exports.MAX = void 0;\nvar max_js_1 = require(\"./max.js\");\nObject.defineProperty(exports, \"MAX\", { enumerable: true, get: function () { return max_js_1.default; } });\nvar nil_js_1 = require(\"./nil.js\");\nObject.defineProperty(exports, \"NIL\", { enumerable: true, get: function () { return nil_js_1.default; } });\nvar parse_js_1 = require(\"./parse.js\");\nObject.defineProperty(exports, \"parse\", { enumerable: true, get: function () { return parse_js_1.default; } });\nvar stringify_js_1 = require(\"./stringify.js\");\nObject.defineProperty(exports, \"stringify\", { enumerable: true, get: function () { return stringify_js_1.default; } });\nvar v1_js_1 = require(\"./v1.js\");\nObject.defineProperty(exports, \"v1\", { enumerable: true, get: function () { return v1_js_1.default; } });\nvar v1ToV6_js_1 = require(\"./v1ToV6.js\");\nObject.defineProperty(exports, \"v1ToV6\", { enumerable: true, get: function () { return v1ToV6_js_1.default; } });\nvar v3_js_1 = require(\"./v3.js\");\nObject.defineProperty(exports, \"v3\", { enumerable: true, get: function () { return v3_js_1.default; } });\nvar v4_js_1 = require(\"./v4.js\");\nObject.defineProperty(exports, \"v4\", { enumerable: true, get: function () { return v4_js_1.default; } });\nvar v5_js_1 = require(\"./v5.js\");\nObject.defineProperty(exports, \"v5\", { enumerable: true, get: function () { return v5_js_1.default; } });\nvar v6_js_1 = require(\"./v6.js\");\nObject.defineProperty(exports, \"v6\", { enumerable: true, get: function () { return v6_js_1.default; } });\nvar v6ToV1_js_1 = require(\"./v6ToV1.js\");\nObject.defineProperty(exports, \"v6ToV1\", { enumerable: true, get: function () { return v6ToV1_js_1.default; } });\nvar v7_js_1 = require(\"./v7.js\");\nObject.defineProperty(exports, \"v7\", { enumerable: true, get: function () { return v7_js_1.default; } });\nvar validate_js_1 = require(\"./validate.js\");\nObject.defineProperty(exports, \"validate\", { enumerable: true, get: function () { return validate_js_1.default; } });\nvar version_js_1 = require(\"./version.js\");\nObject.defineProperty(exports, \"version\", { enumerable: true, get: function () { return version_js_1.default; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = 'ffffffff-ffff-ffff-ffff-ffffffffffff';\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction md5(bytes) {\n    const words = uint8ToUint32(bytes);\n    const md5Bytes = wordsToMd5(words, bytes.length * 8);\n    return uint32ToUint8(md5Bytes);\n}\nfunction uint32ToUint8(input) {\n    const bytes = new Uint8Array(input.length * 4);\n    for (let i = 0; i < input.length * 4; i++) {\n        bytes[i] = (input[i >> 2] >>> ((i % 4) * 8)) & 0xff;\n    }\n    return bytes;\n}\nfunction getOutputLength(inputLength8) {\n    return (((inputLength8 + 64) >>> 9) << 4) + 14 + 1;\n}\nfunction wordsToMd5(x, len) {\n    const xpad = new Uint32Array(getOutputLength(len)).fill(0);\n    xpad.set(x);\n    xpad[len >> 5] |= 0x80 << len % 32;\n    xpad[xpad.length - 1] = len;\n    x = xpad;\n    let a = 1732584193;\n    let b = -271733879;\n    let c = -1732584194;\n    let d = 271733878;\n    for (let i = 0; i < x.length; i += 16) {\n        const olda = a;\n        const oldb = b;\n        const oldc = c;\n        const oldd = d;\n        a = md5ff(a, b, c, d, x[i], 7, -680876936);\n        d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n        c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n        b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n        a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n        d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n        c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n        b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n        a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n        d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n        c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n        b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n        a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n        d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n        c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n        b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n        a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n        d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n        c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n        b = md5gg(b, c, d, a, x[i], 20, -373897302);\n        a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n        d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n        c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n        b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n        a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n        d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n        c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n        b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n        a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n        d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n        c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n        b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n        a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n        d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n        c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n        b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n        a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n        d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n        c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n        b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n        a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n        d = md5hh(d, a, b, c, x[i], 11, -358537222);\n        c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n        b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n        a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n        d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n        c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n        b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n        a = md5ii(a, b, c, d, x[i], 6, -198630844);\n        d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n        c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n        b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n        a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n        d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n        c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n        b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n        a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n        d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n        c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n        b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n        a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n        d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n        c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n        b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n        a = safeAdd(a, olda);\n        b = safeAdd(b, oldb);\n        c = safeAdd(c, oldc);\n        d = safeAdd(d, oldd);\n    }\n    return Uint32Array.of(a, b, c, d);\n}\nfunction uint8ToUint32(input) {\n    if (input.length === 0) {\n        return new Uint32Array();\n    }\n    const output = new Uint32Array(getOutputLength(input.length * 8)).fill(0);\n    for (let i = 0; i < input.length; i++) {\n        output[i >> 2] |= (input[i] & 0xff) << ((i % 4) * 8);\n    }\n    return output;\n}\nfunction safeAdd(x, y) {\n    const lsw = (x & 0xffff) + (y & 0xffff);\n    const msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n    return (msw << 16) | (lsw & 0xffff);\n}\nfunction bitRotateLeft(num, cnt) {\n    return (num << cnt) | (num >>> (32 - cnt));\n}\nfunction md5cmn(q, a, b, x, s, t) {\n    return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n    return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n    return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n    return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n    return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\nexports.default = md5;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexports.default = { randomUUID };\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = '00000000-0000-0000-0000-000000000000';\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst validate_js_1 = require(\"./validate.js\");\nfunction parse(uuid) {\n    if (!(0, validate_js_1.default)(uuid)) {\n        throw TypeError('Invalid UUID');\n    }\n    let v;\n    return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\nexports.default = parse;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nfunction rng() {\n    if (!getRandomValues) {\n        if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n            throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n        }\n        getRandomValues = crypto.getRandomValues.bind(crypto);\n    }\n    return getRandomValues(rnds8);\n}\nexports.default = rng;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction f(s, x, y, z) {\n    switch (s) {\n        case 0:\n            return (x & y) ^ (~x & z);\n        case 1:\n            return x ^ y ^ z;\n        case 2:\n            return (x & y) ^ (x & z) ^ (y & z);\n        case 3:\n            return x ^ y ^ z;\n    }\n}\nfunction ROTL(x, n) {\n    return (x << n) | (x >>> (32 - n));\n}\nfunction sha1(bytes) {\n    const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n    const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n    const newBytes = new Uint8Array(bytes.length + 1);\n    newBytes.set(bytes);\n    newBytes[bytes.length] = 0x80;\n    bytes = newBytes;\n    const l = bytes.length / 4 + 2;\n    const N = Math.ceil(l / 16);\n    const M = new Array(N);\n    for (let i = 0; i < N; ++i) {\n        const arr = new Uint32Array(16);\n        for (let j = 0; j < 16; ++j) {\n            arr[j] =\n                (bytes[i * 64 + j * 4] << 24) |\n                    (bytes[i * 64 + j * 4 + 1] << 16) |\n                    (bytes[i * 64 + j * 4 + 2] << 8) |\n                    bytes[i * 64 + j * 4 + 3];\n        }\n        M[i] = arr;\n    }\n    M[N - 1][14] = ((bytes.length - 1) * 8) / Math.pow(2, 32);\n    M[N - 1][14] = Math.floor(M[N - 1][14]);\n    M[N - 1][15] = ((bytes.length - 1) * 8) & 0xffffffff;\n    for (let i = 0; i < N; ++i) {\n        const W = new Uint32Array(80);\n        for (let t = 0; t < 16; ++t) {\n            W[t] = M[i][t];\n        }\n        for (let t = 16; t < 80; ++t) {\n            W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);\n        }\n        let a = H[0];\n        let b = H[1];\n        let c = H[2];\n        let d = H[3];\n        let e = H[4];\n        for (let t = 0; t < 80; ++t) {\n            const s = Math.floor(t / 20);\n            const T = (ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t]) >>> 0;\n            e = d;\n            d = c;\n            c = ROTL(b, 30) >>> 0;\n            b = a;\n            a = T;\n        }\n        H[0] = (H[0] + a) >>> 0;\n        H[1] = (H[1] + b) >>> 0;\n        H[2] = (H[2] + c) >>> 0;\n        H[3] = (H[3] + d) >>> 0;\n        H[4] = (H[4] + e) >>> 0;\n    }\n    return Uint8Array.of(H[0] >> 24, H[0] >> 16, H[0] >> 8, H[0], H[1] >> 24, H[1] >> 16, H[1] >> 8, H[1], H[2] >> 24, H[2] >> 16, H[2] >> 8, H[2], H[3] >> 24, H[3] >> 16, H[3] >> 8, H[3], H[4] >> 24, H[4] >> 16, H[4] >> 8, H[4]);\n}\nexports.default = sha1;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.unsafeStringify = void 0;\nconst validate_js_1 = require(\"./validate.js\");\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n    byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nfunction unsafeStringify(arr, offset = 0) {\n    return (byteToHex[arr[offset + 0]] +\n        byteToHex[arr[offset + 1]] +\n        byteToHex[arr[offset + 2]] +\n        byteToHex[arr[offset + 3]] +\n        '-' +\n        byteToHex[arr[offset + 4]] +\n        byteToHex[arr[offset + 5]] +\n        '-' +\n        byteToHex[arr[offset + 6]] +\n        byteToHex[arr[offset + 7]] +\n        '-' +\n        byteToHex[arr[offset + 8]] +\n        byteToHex[arr[offset + 9]] +\n        '-' +\n        byteToHex[arr[offset + 10]] +\n        byteToHex[arr[offset + 11]] +\n        byteToHex[arr[offset + 12]] +\n        byteToHex[arr[offset + 13]] +\n        byteToHex[arr[offset + 14]] +\n        byteToHex[arr[offset + 15]]).toLowerCase();\n}\nexports.unsafeStringify = unsafeStringify;\nfunction stringify(arr, offset = 0) {\n    const uuid = unsafeStringify(arr, offset);\n    if (!(0, validate_js_1.default)(uuid)) {\n        throw TypeError('Stringified UUID is invalid');\n    }\n    return uuid;\n}\nexports.default = stringify;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.updateV1State = void 0;\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nconst _state = {};\nfunction v1(options, buf, offset) {\n    let bytes;\n    const isV6 = options?._v6 ?? false;\n    if (options) {\n        const optionsKeys = Object.keys(options);\n        if (optionsKeys.length === 1 && optionsKeys[0] === '_v6') {\n            options = undefined;\n        }\n    }\n    if (options) {\n        bytes = v1Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.nsecs, options.clockseq, options.node, buf, offset);\n    }\n    else {\n        const now = Date.now();\n        const rnds = (0, rng_js_1.default)();\n        updateV1State(_state, now, rnds);\n        bytes = v1Bytes(rnds, _state.msecs, _state.nsecs, isV6 ? undefined : _state.clockseq, isV6 ? undefined : _state.node, buf, offset);\n    }\n    return buf ?? (0, stringify_js_1.unsafeStringify)(bytes);\n}\nfunction updateV1State(state, now, rnds) {\n    state.msecs ??= -Infinity;\n    state.nsecs ??= 0;\n    if (now === state.msecs) {\n        state.nsecs++;\n        if (state.nsecs >= 10000) {\n            state.node = undefined;\n            state.nsecs = 0;\n        }\n    }\n    else if (now > state.msecs) {\n        state.nsecs = 0;\n    }\n    else if (now < state.msecs) {\n        state.node = undefined;\n    }\n    if (!state.node) {\n        state.node = rnds.slice(10, 16);\n        state.node[0] |= 0x01;\n        state.clockseq = ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n    }\n    state.msecs = now;\n    return state;\n}\nexports.updateV1State = updateV1State;\nfunction v1Bytes(rnds, msecs, nsecs, clockseq, node, buf, offset = 0) {\n    if (rnds.length < 16) {\n        throw new Error('Random bytes length must be >= 16');\n    }\n    if (!buf) {\n        buf = new Uint8Array(16);\n        offset = 0;\n    }\n    else {\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n    }\n    msecs ??= Date.now();\n    nsecs ??= 0;\n    clockseq ??= ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n    node ??= rnds.slice(10, 16);\n    msecs += 12219292800000;\n    const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n    buf[offset++] = (tl >>> 24) & 0xff;\n    buf[offset++] = (tl >>> 16) & 0xff;\n    buf[offset++] = (tl >>> 8) & 0xff;\n    buf[offset++] = tl & 0xff;\n    const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff;\n    buf[offset++] = (tmh >>> 8) & 0xff;\n    buf[offset++] = tmh & 0xff;\n    buf[offset++] = ((tmh >>> 24) & 0xf) | 0x10;\n    buf[offset++] = (tmh >>> 16) & 0xff;\n    buf[offset++] = (clockseq >>> 8) | 0x80;\n    buf[offset++] = clockseq & 0xff;\n    for (let n = 0; n < 6; ++n) {\n        buf[offset++] = node[n];\n    }\n    return buf;\n}\nexports.default = v1;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v1ToV6(uuid) {\n    const v1Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid;\n    const v6Bytes = _v1ToV6(v1Bytes);\n    return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v6Bytes) : v6Bytes;\n}\nexports.default = v1ToV6;\nfunction _v1ToV6(v1Bytes) {\n    return Uint8Array.of(((v1Bytes[6] & 0x0f) << 4) | ((v1Bytes[7] >> 4) & 0x0f), ((v1Bytes[7] & 0x0f) << 4) | ((v1Bytes[4] & 0xf0) >> 4), ((v1Bytes[4] & 0x0f) << 4) | ((v1Bytes[5] & 0xf0) >> 4), ((v1Bytes[5] & 0x0f) << 4) | ((v1Bytes[0] & 0xf0) >> 4), ((v1Bytes[0] & 0x0f) << 4) | ((v1Bytes[1] & 0xf0) >> 4), ((v1Bytes[1] & 0x0f) << 4) | ((v1Bytes[2] & 0xf0) >> 4), 0x60 | (v1Bytes[2] & 0x0f), v1Bytes[3], v1Bytes[8], v1Bytes[9], v1Bytes[10], v1Bytes[11], v1Bytes[12], v1Bytes[13], v1Bytes[14], v1Bytes[15]);\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = void 0;\nconst md5_js_1 = require(\"./md5.js\");\nconst v35_js_1 = require(\"./v35.js\");\nvar v35_js_2 = require(\"./v35.js\");\nObject.defineProperty(exports, \"DNS\", { enumerable: true, get: function () { return v35_js_2.DNS; } });\nObject.defineProperty(exports, \"URL\", { enumerable: true, get: function () { return v35_js_2.URL; } });\nfunction v3(value, namespace, buf, offset) {\n    return (0, v35_js_1.default)(0x30, md5_js_1.default, value, namespace, buf, offset);\n}\nv3.DNS = v35_js_1.DNS;\nv3.URL = v35_js_1.URL;\nexports.default = v3;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = exports.stringToBytes = void 0;\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction stringToBytes(str) {\n    str = unescape(encodeURIComponent(str));\n    const bytes = new Uint8Array(str.length);\n    for (let i = 0; i < str.length; ++i) {\n        bytes[i] = str.charCodeAt(i);\n    }\n    return bytes;\n}\nexports.stringToBytes = stringToBytes;\nexports.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexports.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nfunction v35(version, hash, value, namespace, buf, offset) {\n    const valueBytes = typeof value === 'string' ? stringToBytes(value) : value;\n    const namespaceBytes = typeof namespace === 'string' ? (0, parse_js_1.default)(namespace) : namespace;\n    if (typeof namespace === 'string') {\n        namespace = (0, parse_js_1.default)(namespace);\n    }\n    if (namespace?.length !== 16) {\n        throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n    }\n    let bytes = new Uint8Array(16 + valueBytes.length);\n    bytes.set(namespaceBytes);\n    bytes.set(valueBytes, namespaceBytes.length);\n    bytes = hash(bytes);\n    bytes[6] = (bytes[6] & 0x0f) | version;\n    bytes[8] = (bytes[8] & 0x3f) | 0x80;\n    if (buf) {\n        offset = offset || 0;\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n        for (let i = 0; i < 16; ++i) {\n            buf[offset + i] = bytes[i];\n        }\n        return buf;\n    }\n    return (0, stringify_js_1.unsafeStringify)(bytes);\n}\nexports.default = v35;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst native_js_1 = require(\"./native.js\");\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v4(options, buf, offset) {\n    if (native_js_1.default.randomUUID && !buf && !options) {\n        return native_js_1.default.randomUUID();\n    }\n    options = options || {};\n    const rnds = options.random ?? options.rng?.() ?? (0, rng_js_1.default)();\n    if (rnds.length < 16) {\n        throw new Error('Random bytes length must be >= 16');\n    }\n    rnds[6] = (rnds[6] & 0x0f) | 0x40;\n    rnds[8] = (rnds[8] & 0x3f) | 0x80;\n    if (buf) {\n        offset = offset || 0;\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n        for (let i = 0; i < 16; ++i) {\n            buf[offset + i] = rnds[i];\n        }\n        return buf;\n    }\n    return (0, stringify_js_1.unsafeStringify)(rnds);\n}\nexports.default = v4;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = void 0;\nconst sha1_js_1 = require(\"./sha1.js\");\nconst v35_js_1 = require(\"./v35.js\");\nvar v35_js_2 = require(\"./v35.js\");\nObject.defineProperty(exports, \"DNS\", { enumerable: true, get: function () { return v35_js_2.DNS; } });\nObject.defineProperty(exports, \"URL\", { enumerable: true, get: function () { return v35_js_2.URL; } });\nfunction v5(value, namespace, buf, offset) {\n    return (0, v35_js_1.default)(0x50, sha1_js_1.default, value, namespace, buf, offset);\n}\nv5.DNS = v35_js_1.DNS;\nv5.URL = v35_js_1.URL;\nexports.default = v5;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stringify_js_1 = require(\"./stringify.js\");\nconst v1_js_1 = require(\"./v1.js\");\nconst v1ToV6_js_1 = require(\"./v1ToV6.js\");\nfunction v6(options, buf, offset) {\n    options ??= {};\n    offset ??= 0;\n    let bytes = (0, v1_js_1.default)({ ...options, _v6: true }, new Uint8Array(16));\n    bytes = (0, v1ToV6_js_1.default)(bytes);\n    if (buf) {\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n        for (let i = 0; i < 16; i++) {\n            buf[offset + i] = bytes[i];\n        }\n        return buf;\n    }\n    return (0, stringify_js_1.unsafeStringify)(bytes);\n}\nexports.default = v6;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v6ToV1(uuid) {\n    const v6Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid;\n    const v1Bytes = _v6ToV1(v6Bytes);\n    return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v1Bytes) : v1Bytes;\n}\nexports.default = v6ToV1;\nfunction _v6ToV1(v6Bytes) {\n    return Uint8Array.of(((v6Bytes[3] & 0x0f) << 4) | ((v6Bytes[4] >> 4) & 0x0f), ((v6Bytes[4] & 0x0f) << 4) | ((v6Bytes[5] & 0xf0) >> 4), ((v6Bytes[5] & 0x0f) << 4) | (v6Bytes[6] & 0x0f), v6Bytes[7], ((v6Bytes[1] & 0x0f) << 4) | ((v6Bytes[2] & 0xf0) >> 4), ((v6Bytes[2] & 0x0f) << 4) | ((v6Bytes[3] & 0xf0) >> 4), 0x10 | ((v6Bytes[0] & 0xf0) >> 4), ((v6Bytes[0] & 0x0f) << 4) | ((v6Bytes[1] & 0xf0) >> 4), v6Bytes[8], v6Bytes[9], v6Bytes[10], v6Bytes[11], v6Bytes[12], v6Bytes[13], v6Bytes[14], v6Bytes[15]);\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.updateV7State = void 0;\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nconst _state = {};\nfunction v7(options, buf, offset) {\n    let bytes;\n    if (options) {\n        bytes = v7Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.seq, buf, offset);\n    }\n    else {\n        const now = Date.now();\n        const rnds = (0, rng_js_1.default)();\n        updateV7State(_state, now, rnds);\n        bytes = v7Bytes(rnds, _state.msecs, _state.seq, buf, offset);\n    }\n    return buf ?? (0, stringify_js_1.unsafeStringify)(bytes);\n}\nfunction updateV7State(state, now, rnds) {\n    state.msecs ??= -Infinity;\n    state.seq ??= 0;\n    if (now > state.msecs) {\n        state.seq = (rnds[6] << 23) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9];\n        state.msecs = now;\n    }\n    else {\n        state.seq = (state.seq + 1) | 0;\n        if (state.seq === 0) {\n            state.msecs++;\n        }\n    }\n    return state;\n}\nexports.updateV7State = updateV7State;\nfunction v7Bytes(rnds, msecs, seq, buf, offset = 0) {\n    if (rnds.length < 16) {\n        throw new Error('Random bytes length must be >= 16');\n    }\n    if (!buf) {\n        buf = new Uint8Array(16);\n        offset = 0;\n    }\n    else {\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n    }\n    msecs ??= Date.now();\n    seq ??= ((rnds[6] * 0x7f) << 24) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9];\n    buf[offset++] = (msecs / 0x10000000000) & 0xff;\n    buf[offset++] = (msecs / 0x100000000) & 0xff;\n    buf[offset++] = (msecs / 0x1000000) & 0xff;\n    buf[offset++] = (msecs / 0x10000) & 0xff;\n    buf[offset++] = (msecs / 0x100) & 0xff;\n    buf[offset++] = msecs & 0xff;\n    buf[offset++] = 0x70 | ((seq >>> 28) & 0x0f);\n    buf[offset++] = (seq >>> 20) & 0xff;\n    buf[offset++] = 0x80 | ((seq >>> 14) & 0x3f);\n    buf[offset++] = (seq >>> 6) & 0xff;\n    buf[offset++] = ((seq << 2) & 0xff) | (rnds[10] & 0x03);\n    buf[offset++] = rnds[11];\n    buf[offset++] = rnds[12];\n    buf[offset++] = rnds[13];\n    buf[offset++] = rnds[14];\n    buf[offset++] = rnds[15];\n    return buf;\n}\nexports.default = v7;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst regex_js_1 = require(\"./regex.js\");\nfunction validate(uuid) {\n    return typeof uuid === 'string' && regex_js_1.default.test(uuid);\n}\nexports.default = validate;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst validate_js_1 = require(\"./validate.js\");\nfunction version(uuid) {\n    if (!(0, validate_js_1.default)(uuid)) {\n        throw TypeError('Invalid UUID');\n    }\n    return parseInt(uuid.slice(14, 15), 16);\n}\nexports.default = version;\n","export interface Descriptor {\n  configurable?: boolean;\n  enumerable?: boolean;\n  writable?: boolean;\n  get?(): any;\n  set?(v: any): void;\n  initializer?: null | (() => any);\n  value?: any;\n}\nexport type LegacyDecorator = (\n  target: object,\n  prop: unknown,\n  desc: Descriptor,\n) => Descriptor | null | undefined | void;\n\nexport type LegacyClassDecorator = (target: new (...args: any) => any) =>\n  | {\n      new (...args: any): any;\n    }\n  | null\n  | undefined\n  | void;\n\nconst deferred: WeakMap<\n  object,\n  Map<string | number | symbol, Descriptor>\n> = new WeakMap();\n\nfunction deferDecorator(\n  proto: object,\n  prop: string | number | symbol,\n  desc: Descriptor,\n): void {\n  let map = deferred.get(proto);\n  if (!map) {\n    map = new Map();\n    deferred.set(proto, map);\n  }\n  map.set(prop, desc);\n}\n\nfunction findDeferredDecorator(\n  target: object,\n  prop: string | number | symbol,\n): Descriptor | undefined {\n  let cursor: object = (target as any).prototype;\n  while (cursor) {\n    let desc = deferred.get(cursor)?.get(prop);\n    if (desc) {\n      return desc;\n    }\n    cursor = (cursor as any).prototype;\n  }\n}\n\nfunction decorateFieldV1(\n  target: { prototype: object },\n  prop: string | number | symbol,\n  decorators: LegacyDecorator[],\n  initializer?: () => any,\n): void {\n  return decorateFieldV2(target.prototype, prop, decorators, initializer);\n}\n\nfunction decorateFieldV2(\n  prototype: object,\n  prop: string | number | symbol,\n  decorators: LegacyDecorator[],\n  initializer?: () => any,\n): void {\n  let desc: Descriptor = {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null,\n  };\n  if (initializer) {\n    desc.initializer = initializer;\n  }\n  for (let decorator of decorators) {\n    desc = decorator(prototype, prop, desc) || desc;\n  }\n  if (desc.initializer === undefined) {\n    Object.defineProperty(prototype, prop, desc);\n  } else {\n    deferDecorator(prototype, prop, desc);\n  }\n}\n\nfunction decorateMethodV1(\n  { prototype }: { prototype: object },\n  prop: string | number | symbol,\n  decorators: LegacyDecorator[],\n): void {\n  return decorateMethodV2(prototype, prop, decorators);\n}\n\nfunction decorateMethodV2(\n  prototype: object,\n  prop: string | number | symbol,\n  decorators: LegacyDecorator[],\n): void {\n  const origDesc = Object.getOwnPropertyDescriptor(prototype, prop);\n  let desc: Descriptor = { ...origDesc };\n  for (let decorator of decorators) {\n    desc = decorator(prototype, prop, desc) || desc;\n  }\n  if (desc.initializer !== undefined) {\n    desc.value = desc.initializer ? desc.initializer.call(prototype) : void 0;\n    desc.initializer = undefined;\n  }\n  Object.defineProperty(prototype, prop, desc);\n}\n\nfunction initializeDeferredDecorator(\n  target: object,\n  prop: string | number | symbol,\n): void {\n  let desc = findDeferredDecorator(target.constructor, prop);\n  if (desc) {\n    Object.defineProperty(target, prop, {\n      enumerable: desc.enumerable,\n      configurable: desc.configurable,\n      writable: desc.writable,\n      value: desc.initializer ? desc.initializer.call(target) : undefined,\n    });\n  }\n}\n\nfunction decorateClass(\n  target: new (...args: any) => any,\n  decorators: LegacyClassDecorator[],\n): new (...args: any) => any {\n  return decorators.reduce(\n    (accum, decorator) => decorator(accum) || accum,\n    target,\n  );\n}\n\nfunction decoratePOJO(\n  pojo: object,\n  decorated: [\n    'field' | 'method',\n    string | number | symbol,\n    LegacyDecorator[],\n  ][],\n) {\n  for (let [type, prop, decorators] of decorated) {\n    if (type === 'field') {\n      decoratePojoField(pojo, prop, decorators);\n    } else {\n      decorateMethodV2(pojo, prop, decorators);\n    }\n  }\n  return pojo;\n}\nfunction decoratePojoField(\n  pojo: object,\n  prop: string | number | symbol,\n  decorators: LegacyDecorator[],\n) {\n  let desc: Descriptor = {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: () => Object.getOwnPropertyDescriptor(pojo, prop)?.value,\n  };\n  for (let decorator of decorators) {\n    desc = decorator(pojo, prop, desc) || desc;\n  }\n  if (desc.initializer) {\n    desc.value = desc.initializer.call(pojo);\n    delete desc.initializer;\n  }\n  Object.defineProperty(pojo, prop, desc);\n}\n\nexport {\n  decorateFieldV1 as f,\n  decorateFieldV2 as g,\n  decorateMethodV1 as m,\n  decorateMethodV2 as n,\n  initializeDeferredDecorator as i,\n  decorateClass as c,\n  decoratePOJO as p,\n};\n","const types = {\n    'application/prs.cww': ['cww'],\n    'application/prs.xsf+xml': ['xsf'],\n    'application/vnd.1000minds.decision-model+xml': ['1km'],\n    'application/vnd.3gpp.pic-bw-large': ['plb'],\n    'application/vnd.3gpp.pic-bw-small': ['psb'],\n    'application/vnd.3gpp.pic-bw-var': ['pvb'],\n    'application/vnd.3gpp2.tcap': ['tcap'],\n    'application/vnd.3m.post-it-notes': ['pwn'],\n    'application/vnd.accpac.simply.aso': ['aso'],\n    'application/vnd.accpac.simply.imp': ['imp'],\n    'application/vnd.acucobol': ['acu'],\n    'application/vnd.acucorp': ['atc', 'acutc'],\n    'application/vnd.adobe.air-application-installer-package+zip': ['air'],\n    'application/vnd.adobe.formscentral.fcdt': ['fcdt'],\n    'application/vnd.adobe.fxp': ['fxp', 'fxpl'],\n    'application/vnd.adobe.xdp+xml': ['xdp'],\n    'application/vnd.adobe.xfdf': ['*xfdf'],\n    'application/vnd.age': ['age'],\n    'application/vnd.ahead.space': ['ahead'],\n    'application/vnd.airzip.filesecure.azf': ['azf'],\n    'application/vnd.airzip.filesecure.azs': ['azs'],\n    'application/vnd.amazon.ebook': ['azw'],\n    'application/vnd.americandynamics.acc': ['acc'],\n    'application/vnd.amiga.ami': ['ami'],\n    'application/vnd.android.package-archive': ['apk'],\n    'application/vnd.anser-web-certificate-issue-initiation': ['cii'],\n    'application/vnd.anser-web-funds-transfer-initiation': ['fti'],\n    'application/vnd.antix.game-component': ['atx'],\n    'application/vnd.apple.installer+xml': ['mpkg'],\n    'application/vnd.apple.keynote': ['key'],\n    'application/vnd.apple.mpegurl': ['m3u8'],\n    'application/vnd.apple.numbers': ['numbers'],\n    'application/vnd.apple.pages': ['pages'],\n    'application/vnd.apple.pkpass': ['pkpass'],\n    'application/vnd.aristanetworks.swi': ['swi'],\n    'application/vnd.astraea-software.iota': ['iota'],\n    'application/vnd.audiograph': ['aep'],\n    'application/vnd.autodesk.fbx': ['fbx'],\n    'application/vnd.balsamiq.bmml+xml': ['bmml'],\n    'application/vnd.blueice.multipass': ['mpm'],\n    'application/vnd.bmi': ['bmi'],\n    'application/vnd.businessobjects': ['rep'],\n    'application/vnd.chemdraw+xml': ['cdxml'],\n    'application/vnd.chipnuts.karaoke-mmd': ['mmd'],\n    'application/vnd.cinderella': ['cdy'],\n    'application/vnd.citationstyles.style+xml': ['csl'],\n    'application/vnd.claymore': ['cla'],\n    'application/vnd.cloanto.rp9': ['rp9'],\n    'application/vnd.clonk.c4group': ['c4g', 'c4d', 'c4f', 'c4p', 'c4u'],\n    'application/vnd.cluetrust.cartomobile-config': ['c11amc'],\n    'application/vnd.cluetrust.cartomobile-config-pkg': ['c11amz'],\n    'application/vnd.commonspace': ['csp'],\n    'application/vnd.contact.cmsg': ['cdbcmsg'],\n    'application/vnd.cosmocaller': ['cmc'],\n    'application/vnd.crick.clicker': ['clkx'],\n    'application/vnd.crick.clicker.keyboard': ['clkk'],\n    'application/vnd.crick.clicker.palette': ['clkp'],\n    'application/vnd.crick.clicker.template': ['clkt'],\n    'application/vnd.crick.clicker.wordbank': ['clkw'],\n    'application/vnd.criticaltools.wbs+xml': ['wbs'],\n    'application/vnd.ctc-posml': ['pml'],\n    'application/vnd.cups-ppd': ['ppd'],\n    'application/vnd.curl.car': ['car'],\n    'application/vnd.curl.pcurl': ['pcurl'],\n    'application/vnd.dart': ['dart'],\n    'application/vnd.data-vision.rdz': ['rdz'],\n    'application/vnd.dbf': ['dbf'],\n    'application/vnd.dcmp+xml': ['dcmp'],\n    'application/vnd.dece.data': ['uvf', 'uvvf', 'uvd', 'uvvd'],\n    'application/vnd.dece.ttml+xml': ['uvt', 'uvvt'],\n    'application/vnd.dece.unspecified': ['uvx', 'uvvx'],\n    'application/vnd.dece.zip': ['uvz', 'uvvz'],\n    'application/vnd.denovo.fcselayout-link': ['fe_launch'],\n    'application/vnd.dna': ['dna'],\n    'application/vnd.dolby.mlp': ['mlp'],\n    'application/vnd.dpgraph': ['dpg'],\n    'application/vnd.dreamfactory': ['dfac'],\n    'application/vnd.ds-keypoint': ['kpxx'],\n    'application/vnd.dvb.ait': ['ait'],\n    'application/vnd.dvb.service': ['svc'],\n    'application/vnd.dynageo': ['geo'],\n    'application/vnd.ecowin.chart': ['mag'],\n    'application/vnd.enliven': ['nml'],\n    'application/vnd.epson.esf': ['esf'],\n    'application/vnd.epson.msf': ['msf'],\n    'application/vnd.epson.quickanime': ['qam'],\n    'application/vnd.epson.salt': ['slt'],\n    'application/vnd.epson.ssf': ['ssf'],\n    'application/vnd.eszigno3+xml': ['es3', 'et3'],\n    'application/vnd.ezpix-album': ['ez2'],\n    'application/vnd.ezpix-package': ['ez3'],\n    'application/vnd.fdf': ['*fdf'],\n    'application/vnd.fdsn.mseed': ['mseed'],\n    'application/vnd.fdsn.seed': ['seed', 'dataless'],\n    'application/vnd.flographit': ['gph'],\n    'application/vnd.fluxtime.clip': ['ftc'],\n    'application/vnd.framemaker': ['fm', 'frame', 'maker', 'book'],\n    'application/vnd.frogans.fnc': ['fnc'],\n    'application/vnd.frogans.ltf': ['ltf'],\n    'application/vnd.fsc.weblaunch': ['fsc'],\n    'application/vnd.fujitsu.oasys': ['oas'],\n    'application/vnd.fujitsu.oasys2': ['oa2'],\n    'application/vnd.fujitsu.oasys3': ['oa3'],\n    'application/vnd.fujitsu.oasysgp': ['fg5'],\n    'application/vnd.fujitsu.oasysprs': ['bh2'],\n    'application/vnd.fujixerox.ddd': ['ddd'],\n    'application/vnd.fujixerox.docuworks': ['xdw'],\n    'application/vnd.fujixerox.docuworks.binder': ['xbd'],\n    'application/vnd.fuzzysheet': ['fzs'],\n    'application/vnd.genomatix.tuxedo': ['txd'],\n    'application/vnd.geogebra.file': ['ggb'],\n    'application/vnd.geogebra.slides': ['ggs'],\n    'application/vnd.geogebra.tool': ['ggt'],\n    'application/vnd.geometry-explorer': ['gex', 'gre'],\n    'application/vnd.geonext': ['gxt'],\n    'application/vnd.geoplan': ['g2w'],\n    'application/vnd.geospace': ['g3w'],\n    'application/vnd.gmx': ['gmx'],\n    'application/vnd.google-apps.document': ['gdoc'],\n    'application/vnd.google-apps.drawing': ['gdraw'],\n    'application/vnd.google-apps.form': ['gform'],\n    'application/vnd.google-apps.jam': ['gjam'],\n    'application/vnd.google-apps.map': ['gmap'],\n    'application/vnd.google-apps.presentation': ['gslides'],\n    'application/vnd.google-apps.script': ['gscript'],\n    'application/vnd.google-apps.site': ['gsite'],\n    'application/vnd.google-apps.spreadsheet': ['gsheet'],\n    'application/vnd.google-earth.kml+xml': ['kml'],\n    'application/vnd.google-earth.kmz': ['kmz'],\n    'application/vnd.gov.sk.xmldatacontainer+xml': ['xdcf'],\n    'application/vnd.grafeq': ['gqf', 'gqs'],\n    'application/vnd.groove-account': ['gac'],\n    'application/vnd.groove-help': ['ghf'],\n    'application/vnd.groove-identity-message': ['gim'],\n    'application/vnd.groove-injector': ['grv'],\n    'application/vnd.groove-tool-message': ['gtm'],\n    'application/vnd.groove-tool-template': ['tpl'],\n    'application/vnd.groove-vcard': ['vcg'],\n    'application/vnd.hal+xml': ['hal'],\n    'application/vnd.handheld-entertainment+xml': ['zmm'],\n    'application/vnd.hbci': ['hbci'],\n    'application/vnd.hhe.lesson-player': ['les'],\n    'application/vnd.hp-hpgl': ['hpgl'],\n    'application/vnd.hp-hpid': ['hpid'],\n    'application/vnd.hp-hps': ['hps'],\n    'application/vnd.hp-jlyt': ['jlt'],\n    'application/vnd.hp-pcl': ['pcl'],\n    'application/vnd.hp-pclxl': ['pclxl'],\n    'application/vnd.hydrostatix.sof-data': ['sfd-hdstx'],\n    'application/vnd.ibm.minipay': ['mpy'],\n    'application/vnd.ibm.modcap': ['afp', 'listafp', 'list3820'],\n    'application/vnd.ibm.rights-management': ['irm'],\n    'application/vnd.ibm.secure-container': ['sc'],\n    'application/vnd.iccprofile': ['icc', 'icm'],\n    'application/vnd.igloader': ['igl'],\n    'application/vnd.immervision-ivp': ['ivp'],\n    'application/vnd.immervision-ivu': ['ivu'],\n    'application/vnd.insors.igm': ['igm'],\n    'application/vnd.intercon.formnet': ['xpw', 'xpx'],\n    'application/vnd.intergeo': ['i2g'],\n    'application/vnd.intu.qbo': ['qbo'],\n    'application/vnd.intu.qfx': ['qfx'],\n    'application/vnd.ipunplugged.rcprofile': ['rcprofile'],\n    'application/vnd.irepository.package+xml': ['irp'],\n    'application/vnd.is-xpr': ['xpr'],\n    'application/vnd.isac.fcs': ['fcs'],\n    'application/vnd.jam': ['jam'],\n    'application/vnd.jcp.javame.midlet-rms': ['rms'],\n    'application/vnd.jisp': ['jisp'],\n    'application/vnd.joost.joda-archive': ['joda'],\n    'application/vnd.kahootz': ['ktz', 'ktr'],\n    'application/vnd.kde.karbon': ['karbon'],\n    'application/vnd.kde.kchart': ['chrt'],\n    'application/vnd.kde.kformula': ['kfo'],\n    'application/vnd.kde.kivio': ['flw'],\n    'application/vnd.kde.kontour': ['kon'],\n    'application/vnd.kde.kpresenter': ['kpr', 'kpt'],\n    'application/vnd.kde.kspread': ['ksp'],\n    'application/vnd.kde.kword': ['kwd', 'kwt'],\n    'application/vnd.kenameaapp': ['htke'],\n    'application/vnd.kidspiration': ['kia'],\n    'application/vnd.kinar': ['kne', 'knp'],\n    'application/vnd.koan': ['skp', 'skd', 'skt', 'skm'],\n    'application/vnd.kodak-descriptor': ['sse'],\n    'application/vnd.las.las+xml': ['lasxml'],\n    'application/vnd.llamagraphics.life-balance.desktop': ['lbd'],\n    'application/vnd.llamagraphics.life-balance.exchange+xml': ['lbe'],\n    'application/vnd.lotus-1-2-3': ['123'],\n    'application/vnd.lotus-approach': ['apr'],\n    'application/vnd.lotus-freelance': ['pre'],\n    'application/vnd.lotus-notes': ['nsf'],\n    'application/vnd.lotus-organizer': ['org'],\n    'application/vnd.lotus-screencam': ['scm'],\n    'application/vnd.lotus-wordpro': ['lwp'],\n    'application/vnd.macports.portpkg': ['portpkg'],\n    'application/vnd.mapbox-vector-tile': ['mvt'],\n    'application/vnd.mcd': ['mcd'],\n    'application/vnd.medcalcdata': ['mc1'],\n    'application/vnd.mediastation.cdkey': ['cdkey'],\n    'application/vnd.mfer': ['mwf'],\n    'application/vnd.mfmp': ['mfm'],\n    'application/vnd.micrografx.flo': ['flo'],\n    'application/vnd.micrografx.igx': ['igx'],\n    'application/vnd.mif': ['mif'],\n    'application/vnd.mobius.daf': ['daf'],\n    'application/vnd.mobius.dis': ['dis'],\n    'application/vnd.mobius.mbk': ['mbk'],\n    'application/vnd.mobius.mqy': ['mqy'],\n    'application/vnd.mobius.msl': ['msl'],\n    'application/vnd.mobius.plc': ['plc'],\n    'application/vnd.mobius.txf': ['txf'],\n    'application/vnd.mophun.application': ['mpn'],\n    'application/vnd.mophun.certificate': ['mpc'],\n    'application/vnd.mozilla.xul+xml': ['xul'],\n    'application/vnd.ms-artgalry': ['cil'],\n    'application/vnd.ms-cab-compressed': ['cab'],\n    'application/vnd.ms-excel': ['xls', 'xlm', 'xla', 'xlc', 'xlt', 'xlw'],\n    'application/vnd.ms-excel.addin.macroenabled.12': ['xlam'],\n    'application/vnd.ms-excel.sheet.binary.macroenabled.12': ['xlsb'],\n    'application/vnd.ms-excel.sheet.macroenabled.12': ['xlsm'],\n    'application/vnd.ms-excel.template.macroenabled.12': ['xltm'],\n    'application/vnd.ms-fontobject': ['eot'],\n    'application/vnd.ms-htmlhelp': ['chm'],\n    'application/vnd.ms-ims': ['ims'],\n    'application/vnd.ms-lrm': ['lrm'],\n    'application/vnd.ms-officetheme': ['thmx'],\n    'application/vnd.ms-outlook': ['msg'],\n    'application/vnd.ms-pki.seccat': ['cat'],\n    'application/vnd.ms-pki.stl': ['*stl'],\n    'application/vnd.ms-powerpoint': ['ppt', 'pps', 'pot'],\n    'application/vnd.ms-powerpoint.addin.macroenabled.12': ['ppam'],\n    'application/vnd.ms-powerpoint.presentation.macroenabled.12': ['pptm'],\n    'application/vnd.ms-powerpoint.slide.macroenabled.12': ['sldm'],\n    'application/vnd.ms-powerpoint.slideshow.macroenabled.12': ['ppsm'],\n    'application/vnd.ms-powerpoint.template.macroenabled.12': ['potm'],\n    'application/vnd.ms-project': ['*mpp', 'mpt'],\n    'application/vnd.ms-visio.viewer': ['vdx'],\n    'application/vnd.ms-word.document.macroenabled.12': ['docm'],\n    'application/vnd.ms-word.template.macroenabled.12': ['dotm'],\n    'application/vnd.ms-works': ['wps', 'wks', 'wcm', 'wdb'],\n    'application/vnd.ms-wpl': ['wpl'],\n    'application/vnd.ms-xpsdocument': ['xps'],\n    'application/vnd.mseq': ['mseq'],\n    'application/vnd.musician': ['mus'],\n    'application/vnd.muvee.style': ['msty'],\n    'application/vnd.mynfc': ['taglet'],\n    'application/vnd.nato.bindingdataobject+xml': ['bdo'],\n    'application/vnd.neurolanguage.nlu': ['nlu'],\n    'application/vnd.nitf': ['ntf', 'nitf'],\n    'application/vnd.noblenet-directory': ['nnd'],\n    'application/vnd.noblenet-sealer': ['nns'],\n    'application/vnd.noblenet-web': ['nnw'],\n    'application/vnd.nokia.n-gage.ac+xml': ['*ac'],\n    'application/vnd.nokia.n-gage.data': ['ngdat'],\n    'application/vnd.nokia.n-gage.symbian.install': ['n-gage'],\n    'application/vnd.nokia.radio-preset': ['rpst'],\n    'application/vnd.nokia.radio-presets': ['rpss'],\n    'application/vnd.novadigm.edm': ['edm'],\n    'application/vnd.novadigm.edx': ['edx'],\n    'application/vnd.novadigm.ext': ['ext'],\n    'application/vnd.oasis.opendocument.chart': ['odc'],\n    'application/vnd.oasis.opendocument.chart-template': ['otc'],\n    'application/vnd.oasis.opendocument.database': ['odb'],\n    'application/vnd.oasis.opendocument.formula': ['odf'],\n    'application/vnd.oasis.opendocument.formula-template': ['odft'],\n    'application/vnd.oasis.opendocument.graphics': ['odg'],\n    'application/vnd.oasis.opendocument.graphics-template': ['otg'],\n    'application/vnd.oasis.opendocument.image': ['odi'],\n    'application/vnd.oasis.opendocument.image-template': ['oti'],\n    'application/vnd.oasis.opendocument.presentation': ['odp'],\n    'application/vnd.oasis.opendocument.presentation-template': ['otp'],\n    'application/vnd.oasis.opendocument.spreadsheet': ['ods'],\n    'application/vnd.oasis.opendocument.spreadsheet-template': ['ots'],\n    'application/vnd.oasis.opendocument.text': ['odt'],\n    'application/vnd.oasis.opendocument.text-master': ['odm'],\n    'application/vnd.oasis.opendocument.text-template': ['ott'],\n    'application/vnd.oasis.opendocument.text-web': ['oth'],\n    'application/vnd.olpc-sugar': ['xo'],\n    'application/vnd.oma.dd2+xml': ['dd2'],\n    'application/vnd.openblox.game+xml': ['obgx'],\n    'application/vnd.openofficeorg.extension': ['oxt'],\n    'application/vnd.openstreetmap.data+xml': ['osm'],\n    'application/vnd.openxmlformats-officedocument.presentationml.presentation': [\n        'pptx',\n    ],\n    'application/vnd.openxmlformats-officedocument.presentationml.slide': [\n        'sldx',\n    ],\n    'application/vnd.openxmlformats-officedocument.presentationml.slideshow': [\n        'ppsx',\n    ],\n    'application/vnd.openxmlformats-officedocument.presentationml.template': [\n        'potx',\n    ],\n    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': ['xlsx'],\n    'application/vnd.openxmlformats-officedocument.spreadsheetml.template': [\n        'xltx',\n    ],\n    'application/vnd.openxmlformats-officedocument.wordprocessingml.document': [\n        'docx',\n    ],\n    'application/vnd.openxmlformats-officedocument.wordprocessingml.template': [\n        'dotx',\n    ],\n    'application/vnd.osgeo.mapguide.package': ['mgp'],\n    'application/vnd.osgi.dp': ['dp'],\n    'application/vnd.osgi.subsystem': ['esa'],\n    'application/vnd.palm': ['pdb', 'pqa', 'oprc'],\n    'application/vnd.pawaafile': ['paw'],\n    'application/vnd.pg.format': ['str'],\n    'application/vnd.pg.osasli': ['ei6'],\n    'application/vnd.picsel': ['efif'],\n    'application/vnd.pmi.widget': ['wg'],\n    'application/vnd.pocketlearn': ['plf'],\n    'application/vnd.powerbuilder6': ['pbd'],\n    'application/vnd.previewsystems.box': ['box'],\n    'application/vnd.procrate.brushset': ['brushset'],\n    'application/vnd.procreate.brush': ['brush'],\n    'application/vnd.procreate.dream': ['drm'],\n    'application/vnd.proteus.magazine': ['mgz'],\n    'application/vnd.publishare-delta-tree': ['qps'],\n    'application/vnd.pvi.ptid1': ['ptid'],\n    'application/vnd.pwg-xhtml-print+xml': ['xhtm'],\n    'application/vnd.quark.quarkxpress': [\n        'qxd',\n        'qxt',\n        'qwd',\n        'qwt',\n        'qxl',\n        'qxb',\n    ],\n    'application/vnd.rar': ['rar'],\n    'application/vnd.realvnc.bed': ['bed'],\n    'application/vnd.recordare.musicxml': ['mxl'],\n    'application/vnd.recordare.musicxml+xml': ['musicxml'],\n    'application/vnd.rig.cryptonote': ['cryptonote'],\n    'application/vnd.rim.cod': ['cod'],\n    'application/vnd.rn-realmedia': ['rm'],\n    'application/vnd.rn-realmedia-vbr': ['rmvb'],\n    'application/vnd.route66.link66+xml': ['link66'],\n    'application/vnd.sailingtracker.track': ['st'],\n    'application/vnd.seemail': ['see'],\n    'application/vnd.sema': ['sema'],\n    'application/vnd.semd': ['semd'],\n    'application/vnd.semf': ['semf'],\n    'application/vnd.shana.informed.formdata': ['ifm'],\n    'application/vnd.shana.informed.formtemplate': ['itp'],\n    'application/vnd.shana.informed.interchange': ['iif'],\n    'application/vnd.shana.informed.package': ['ipk'],\n    'application/vnd.simtech-mindmapper': ['twd', 'twds'],\n    'application/vnd.smaf': ['mmf'],\n    'application/vnd.smart.teacher': ['teacher'],\n    'application/vnd.software602.filler.form+xml': ['fo'],\n    'application/vnd.solent.sdkm+xml': ['sdkm', 'sdkd'],\n    'application/vnd.spotfire.dxp': ['dxp'],\n    'application/vnd.spotfire.sfs': ['sfs'],\n    'application/vnd.stardivision.calc': ['sdc'],\n    'application/vnd.stardivision.draw': ['sda'],\n    'application/vnd.stardivision.impress': ['sdd'],\n    'application/vnd.stardivision.math': ['smf'],\n    'application/vnd.stardivision.writer': ['sdw', 'vor'],\n    'application/vnd.stardivision.writer-global': ['sgl'],\n    'application/vnd.stepmania.package': ['smzip'],\n    'application/vnd.stepmania.stepchart': ['sm'],\n    'application/vnd.sun.wadl+xml': ['wadl'],\n    'application/vnd.sun.xml.calc': ['sxc'],\n    'application/vnd.sun.xml.calc.template': ['stc'],\n    'application/vnd.sun.xml.draw': ['sxd'],\n    'application/vnd.sun.xml.draw.template': ['std'],\n    'application/vnd.sun.xml.impress': ['sxi'],\n    'application/vnd.sun.xml.impress.template': ['sti'],\n    'application/vnd.sun.xml.math': ['sxm'],\n    'application/vnd.sun.xml.writer': ['sxw'],\n    'application/vnd.sun.xml.writer.global': ['sxg'],\n    'application/vnd.sun.xml.writer.template': ['stw'],\n    'application/vnd.sus-calendar': ['sus', 'susp'],\n    'application/vnd.svd': ['svd'],\n    'application/vnd.symbian.install': ['sis', 'sisx'],\n    'application/vnd.syncml+xml': ['xsm'],\n    'application/vnd.syncml.dm+wbxml': ['bdm'],\n    'application/vnd.syncml.dm+xml': ['xdm'],\n    'application/vnd.syncml.dmddf+xml': ['ddf'],\n    'application/vnd.tao.intent-module-archive': ['tao'],\n    'application/vnd.tcpdump.pcap': ['pcap', 'cap', 'dmp'],\n    'application/vnd.tmobile-livetv': ['tmo'],\n    'application/vnd.trid.tpt': ['tpt'],\n    'application/vnd.triscape.mxs': ['mxs'],\n    'application/vnd.trueapp': ['tra'],\n    'application/vnd.ufdl': ['ufd', 'ufdl'],\n    'application/vnd.uiq.theme': ['utz'],\n    'application/vnd.umajin': ['umj'],\n    'application/vnd.unity': ['unityweb'],\n    'application/vnd.uoml+xml': ['uoml', 'uo'],\n    'application/vnd.vcx': ['vcx'],\n    'application/vnd.visio': ['vsd', 'vst', 'vss', 'vsw', 'vsdx', 'vtx'],\n    'application/vnd.visionary': ['vis'],\n    'application/vnd.vsf': ['vsf'],\n    'application/vnd.wap.wbxml': ['wbxml'],\n    'application/vnd.wap.wmlc': ['wmlc'],\n    'application/vnd.wap.wmlscriptc': ['wmlsc'],\n    'application/vnd.webturbo': ['wtb'],\n    'application/vnd.wolfram.player': ['nbp'],\n    'application/vnd.wordperfect': ['wpd'],\n    'application/vnd.wqd': ['wqd'],\n    'application/vnd.wt.stf': ['stf'],\n    'application/vnd.xara': ['xar'],\n    'application/vnd.xfdl': ['xfdl'],\n    'application/vnd.yamaha.hv-dic': ['hvd'],\n    'application/vnd.yamaha.hv-script': ['hvs'],\n    'application/vnd.yamaha.hv-voice': ['hvp'],\n    'application/vnd.yamaha.openscoreformat': ['osf'],\n    'application/vnd.yamaha.openscoreformat.osfpvg+xml': ['osfpvg'],\n    'application/vnd.yamaha.smaf-audio': ['saf'],\n    'application/vnd.yamaha.smaf-phrase': ['spf'],\n    'application/vnd.yellowriver-custom-menu': ['cmp'],\n    'application/vnd.zul': ['zir', 'zirz'],\n    'application/vnd.zzazz.deck+xml': ['zaz'],\n    'application/x-7z-compressed': ['7z'],\n    'application/x-abiword': ['abw'],\n    'application/x-ace-compressed': ['ace'],\n    'application/x-apple-diskimage': ['*dmg'],\n    'application/x-arj': ['arj'],\n    'application/x-authorware-bin': ['aab', 'x32', 'u32', 'vox'],\n    'application/x-authorware-map': ['aam'],\n    'application/x-authorware-seg': ['aas'],\n    'application/x-bcpio': ['bcpio'],\n    'application/x-bdoc': ['*bdoc'],\n    'application/x-bittorrent': ['torrent'],\n    'application/x-blender': ['blend'],\n    'application/x-blorb': ['blb', 'blorb'],\n    'application/x-bzip': ['bz'],\n    'application/x-bzip2': ['bz2', 'boz'],\n    'application/x-cbr': ['cbr', 'cba', 'cbt', 'cbz', 'cb7'],\n    'application/x-cdlink': ['vcd'],\n    'application/x-cfs-compressed': ['cfs'],\n    'application/x-chat': ['chat'],\n    'application/x-chess-pgn': ['pgn'],\n    'application/x-chrome-extension': ['crx'],\n    'application/x-cocoa': ['cco'],\n    'application/x-compressed': ['*rar'],\n    'application/x-conference': ['nsc'],\n    'application/x-cpio': ['cpio'],\n    'application/x-csh': ['csh'],\n    'application/x-debian-package': ['*deb', 'udeb'],\n    'application/x-dgc-compressed': ['dgc'],\n    'application/x-director': [\n        'dir',\n        'dcr',\n        'dxr',\n        'cst',\n        'cct',\n        'cxt',\n        'w3d',\n        'fgd',\n        'swa',\n    ],\n    'application/x-doom': ['wad'],\n    'application/x-dtbncx+xml': ['ncx'],\n    'application/x-dtbook+xml': ['dtb'],\n    'application/x-dtbresource+xml': ['res'],\n    'application/x-dvi': ['dvi'],\n    'application/x-envoy': ['evy'],\n    'application/x-eva': ['eva'],\n    'application/x-font-bdf': ['bdf'],\n    'application/x-font-ghostscript': ['gsf'],\n    'application/x-font-linux-psf': ['psf'],\n    'application/x-font-pcf': ['pcf'],\n    'application/x-font-snf': ['snf'],\n    'application/x-font-type1': ['pfa', 'pfb', 'pfm', 'afm'],\n    'application/x-freearc': ['arc'],\n    'application/x-futuresplash': ['spl'],\n    'application/x-gca-compressed': ['gca'],\n    'application/x-glulx': ['ulx'],\n    'application/x-gnumeric': ['gnumeric'],\n    'application/x-gramps-xml': ['gramps'],\n    'application/x-gtar': ['gtar'],\n    'application/x-hdf': ['hdf'],\n    'application/x-httpd-php': ['php'],\n    'application/x-install-instructions': ['install'],\n    'application/x-ipynb+json': ['ipynb'],\n    'application/x-iso9660-image': ['*iso'],\n    'application/x-iwork-keynote-sffkey': ['*key'],\n    'application/x-iwork-numbers-sffnumbers': ['*numbers'],\n    'application/x-iwork-pages-sffpages': ['*pages'],\n    'application/x-java-archive-diff': ['jardiff'],\n    'application/x-java-jnlp-file': ['jnlp'],\n    'application/x-keepass2': ['kdbx'],\n    'application/x-latex': ['latex'],\n    'application/x-lua-bytecode': ['luac'],\n    'application/x-lzh-compressed': ['lzh', 'lha'],\n    'application/x-makeself': ['run'],\n    'application/x-mie': ['mie'],\n    'application/x-mobipocket-ebook': ['*prc', 'mobi'],\n    'application/x-ms-application': ['application'],\n    'application/x-ms-shortcut': ['lnk'],\n    'application/x-ms-wmd': ['wmd'],\n    'application/x-ms-wmz': ['wmz'],\n    'application/x-ms-xbap': ['xbap'],\n    'application/x-msaccess': ['mdb'],\n    'application/x-msbinder': ['obd'],\n    'application/x-mscardfile': ['crd'],\n    'application/x-msclip': ['clp'],\n    'application/x-msdos-program': ['*exe'],\n    'application/x-msdownload': ['*exe', '*dll', 'com', 'bat', '*msi'],\n    'application/x-msmediaview': ['mvb', 'm13', 'm14'],\n    'application/x-msmetafile': ['*wmf', '*wmz', '*emf', 'emz'],\n    'application/x-msmoney': ['mny'],\n    'application/x-mspublisher': ['pub'],\n    'application/x-msschedule': ['scd'],\n    'application/x-msterminal': ['trm'],\n    'application/x-mswrite': ['wri'],\n    'application/x-netcdf': ['nc', 'cdf'],\n    'application/x-ns-proxy-autoconfig': ['pac'],\n    'application/x-nzb': ['nzb'],\n    'application/x-perl': ['pl', 'pm'],\n    'application/x-pilot': ['*prc', '*pdb'],\n    'application/x-pkcs12': ['p12', 'pfx'],\n    'application/x-pkcs7-certificates': ['p7b', 'spc'],\n    'application/x-pkcs7-certreqresp': ['p7r'],\n    'application/x-rar-compressed': ['*rar'],\n    'application/x-redhat-package-manager': ['rpm'],\n    'application/x-research-info-systems': ['ris'],\n    'application/x-sea': ['sea'],\n    'application/x-sh': ['sh'],\n    'application/x-shar': ['shar'],\n    'application/x-shockwave-flash': ['swf'],\n    'application/x-silverlight-app': ['xap'],\n    'application/x-sql': ['*sql'],\n    'application/x-stuffit': ['sit'],\n    'application/x-stuffitx': ['sitx'],\n    'application/x-subrip': ['srt'],\n    'application/x-sv4cpio': ['sv4cpio'],\n    'application/x-sv4crc': ['sv4crc'],\n    'application/x-t3vm-image': ['t3'],\n    'application/x-tads': ['gam'],\n    'application/x-tar': ['tar'],\n    'application/x-tcl': ['tcl', 'tk'],\n    'application/x-tex': ['tex'],\n    'application/x-tex-tfm': ['tfm'],\n    'application/x-texinfo': ['texinfo', 'texi'],\n    'application/x-tgif': ['*obj'],\n    'application/x-ustar': ['ustar'],\n    'application/x-virtualbox-hdd': ['hdd'],\n    'application/x-virtualbox-ova': ['ova'],\n    'application/x-virtualbox-ovf': ['ovf'],\n    'application/x-virtualbox-vbox': ['vbox'],\n    'application/x-virtualbox-vbox-extpack': ['vbox-extpack'],\n    'application/x-virtualbox-vdi': ['vdi'],\n    'application/x-virtualbox-vhd': ['vhd'],\n    'application/x-virtualbox-vmdk': ['vmdk'],\n    'application/x-wais-source': ['src'],\n    'application/x-web-app-manifest+json': ['webapp'],\n    'application/x-x509-ca-cert': ['der', 'crt', 'pem'],\n    'application/x-xfig': ['fig'],\n    'application/x-xliff+xml': ['*xlf'],\n    'application/x-xpinstall': ['xpi'],\n    'application/x-xz': ['xz'],\n    'application/x-zip-compressed': ['*zip'],\n    'application/x-zmachine': ['z1', 'z2', 'z3', 'z4', 'z5', 'z6', 'z7', 'z8'],\n    'audio/vnd.dece.audio': ['uva', 'uvva'],\n    'audio/vnd.digital-winds': ['eol'],\n    'audio/vnd.dra': ['dra'],\n    'audio/vnd.dts': ['dts'],\n    'audio/vnd.dts.hd': ['dtshd'],\n    'audio/vnd.lucent.voice': ['lvp'],\n    'audio/vnd.ms-playready.media.pya': ['pya'],\n    'audio/vnd.nuera.ecelp4800': ['ecelp4800'],\n    'audio/vnd.nuera.ecelp7470': ['ecelp7470'],\n    'audio/vnd.nuera.ecelp9600': ['ecelp9600'],\n    'audio/vnd.rip': ['rip'],\n    'audio/x-aac': ['*aac'],\n    'audio/x-aiff': ['aif', 'aiff', 'aifc'],\n    'audio/x-caf': ['caf'],\n    'audio/x-flac': ['flac'],\n    'audio/x-m4a': ['*m4a'],\n    'audio/x-matroska': ['mka'],\n    'audio/x-mpegurl': ['m3u'],\n    'audio/x-ms-wax': ['wax'],\n    'audio/x-ms-wma': ['wma'],\n    'audio/x-pn-realaudio': ['ram', 'ra'],\n    'audio/x-pn-realaudio-plugin': ['rmp'],\n    'audio/x-realaudio': ['*ra'],\n    'audio/x-wav': ['*wav'],\n    'chemical/x-cdx': ['cdx'],\n    'chemical/x-cif': ['cif'],\n    'chemical/x-cmdf': ['cmdf'],\n    'chemical/x-cml': ['cml'],\n    'chemical/x-csml': ['csml'],\n    'chemical/x-xyz': ['xyz'],\n    'image/prs.btif': ['btif', 'btf'],\n    'image/prs.pti': ['pti'],\n    'image/vnd.adobe.photoshop': ['psd'],\n    'image/vnd.airzip.accelerator.azv': ['azv'],\n    'image/vnd.blockfact.facti': ['facti'],\n    'image/vnd.dece.graphic': ['uvi', 'uvvi', 'uvg', 'uvvg'],\n    'image/vnd.djvu': ['djvu', 'djv'],\n    'image/vnd.dvb.subtitle': ['*sub'],\n    'image/vnd.dwg': ['dwg'],\n    'image/vnd.dxf': ['dxf'],\n    'image/vnd.fastbidsheet': ['fbs'],\n    'image/vnd.fpx': ['fpx'],\n    'image/vnd.fst': ['fst'],\n    'image/vnd.fujixerox.edmics-mmr': ['mmr'],\n    'image/vnd.fujixerox.edmics-rlc': ['rlc'],\n    'image/vnd.microsoft.icon': ['ico'],\n    'image/vnd.ms-dds': ['dds'],\n    'image/vnd.ms-modi': ['mdi'],\n    'image/vnd.ms-photo': ['wdp'],\n    'image/vnd.net-fpx': ['npx'],\n    'image/vnd.pco.b16': ['b16'],\n    'image/vnd.tencent.tap': ['tap'],\n    'image/vnd.valve.source.texture': ['vtf'],\n    'image/vnd.wap.wbmp': ['wbmp'],\n    'image/vnd.xiff': ['xif'],\n    'image/vnd.zbrush.pcx': ['pcx'],\n    'image/x-3ds': ['3ds'],\n    'image/x-adobe-dng': ['dng'],\n    'image/x-cmu-raster': ['ras'],\n    'image/x-cmx': ['cmx'],\n    'image/x-freehand': ['fh', 'fhc', 'fh4', 'fh5', 'fh7'],\n    'image/x-icon': ['*ico'],\n    'image/x-jng': ['jng'],\n    'image/x-mrsid-image': ['sid'],\n    'image/x-ms-bmp': ['*bmp'],\n    'image/x-pcx': ['*pcx'],\n    'image/x-pict': ['pic', 'pct'],\n    'image/x-portable-anymap': ['pnm'],\n    'image/x-portable-bitmap': ['pbm'],\n    'image/x-portable-graymap': ['pgm'],\n    'image/x-portable-pixmap': ['ppm'],\n    'image/x-rgb': ['rgb'],\n    'image/x-tga': ['tga'],\n    'image/x-xbitmap': ['xbm'],\n    'image/x-xpixmap': ['xpm'],\n    'image/x-xwindowdump': ['xwd'],\n    'message/vnd.wfa.wsc': ['wsc'],\n    'model/vnd.bary': ['bary'],\n    'model/vnd.cld': ['cld'],\n    'model/vnd.collada+xml': ['dae'],\n    'model/vnd.dwf': ['dwf'],\n    'model/vnd.gdl': ['gdl'],\n    'model/vnd.gtw': ['gtw'],\n    'model/vnd.mts': ['*mts'],\n    'model/vnd.opengex': ['ogex'],\n    'model/vnd.parasolid.transmit.binary': ['x_b'],\n    'model/vnd.parasolid.transmit.text': ['x_t'],\n    'model/vnd.pytha.pyox': ['pyo', 'pyox'],\n    'model/vnd.sap.vds': ['vds'],\n    'model/vnd.usda': ['usda'],\n    'model/vnd.usdz+zip': ['usdz'],\n    'model/vnd.valve.source.compiled-map': ['bsp'],\n    'model/vnd.vtu': ['vtu'],\n    'text/prs.lines.tag': ['dsc'],\n    'text/vnd.curl': ['curl'],\n    'text/vnd.curl.dcurl': ['dcurl'],\n    'text/vnd.curl.mcurl': ['mcurl'],\n    'text/vnd.curl.scurl': ['scurl'],\n    'text/vnd.dvb.subtitle': ['sub'],\n    'text/vnd.familysearch.gedcom': ['ged'],\n    'text/vnd.fly': ['fly'],\n    'text/vnd.fmi.flexstor': ['flx'],\n    'text/vnd.graphviz': ['gv'],\n    'text/vnd.in3d.3dml': ['3dml'],\n    'text/vnd.in3d.spot': ['spot'],\n    'text/vnd.sun.j2me.app-descriptor': ['jad'],\n    'text/vnd.wap.wml': ['wml'],\n    'text/vnd.wap.wmlscript': ['wmls'],\n    'text/x-asm': ['s', 'asm'],\n    'text/x-c': ['c', 'cc', 'cxx', 'cpp', 'h', 'hh', 'dic'],\n    'text/x-component': ['htc'],\n    'text/x-fortran': ['f', 'for', 'f77', 'f90'],\n    'text/x-handlebars-template': ['hbs'],\n    'text/x-java-source': ['java'],\n    'text/x-lua': ['lua'],\n    'text/x-markdown': ['mkd'],\n    'text/x-nfo': ['nfo'],\n    'text/x-opml': ['opml'],\n    'text/x-org': ['*org'],\n    'text/x-pascal': ['p', 'pas'],\n    'text/x-processing': ['pde'],\n    'text/x-sass': ['sass'],\n    'text/x-scss': ['scss'],\n    'text/x-setext': ['etx'],\n    'text/x-sfv': ['sfv'],\n    'text/x-suse-ymp': ['ymp'],\n    'text/x-uuencode': ['uu'],\n    'text/x-vcalendar': ['vcs'],\n    'text/x-vcard': ['vcf'],\n    'video/vnd.dece.hd': ['uvh', 'uvvh'],\n    'video/vnd.dece.mobile': ['uvm', 'uvvm'],\n    'video/vnd.dece.pd': ['uvp', 'uvvp'],\n    'video/vnd.dece.sd': ['uvs', 'uvvs'],\n    'video/vnd.dece.video': ['uvv', 'uvvv'],\n    'video/vnd.dvb.file': ['dvb'],\n    'video/vnd.fvt': ['fvt'],\n    'video/vnd.mpegurl': ['mxu', 'm4u'],\n    'video/vnd.ms-playready.media.pyv': ['pyv'],\n    'video/vnd.uvvu.mp4': ['uvu', 'uvvu'],\n    'video/vnd.vivo': ['viv'],\n    'video/x-f4v': ['f4v'],\n    'video/x-fli': ['fli'],\n    'video/x-flv': ['flv'],\n    'video/x-m4v': ['m4v'],\n    'video/x-matroska': ['mkv', 'mk3d', 'mks'],\n    'video/x-mng': ['mng'],\n    'video/x-ms-asf': ['asf', 'asx'],\n    'video/x-ms-vob': ['vob'],\n    'video/x-ms-wm': ['wm'],\n    'video/x-ms-wmv': ['wmv'],\n    'video/x-ms-wmx': ['wmx'],\n    'video/x-ms-wvx': ['wvx'],\n    'video/x-msvideo': ['avi'],\n    'video/x-sgi-movie': ['movie'],\n    'video/x-smv': ['smv'],\n    'x-conference/x-cooltalk': ['ice'],\n};\nObject.freeze(types);\nexport default types;\n","const types = {\n    'application/andrew-inset': ['ez'],\n    'application/appinstaller': ['appinstaller'],\n    'application/applixware': ['aw'],\n    'application/appx': ['appx'],\n    'application/appxbundle': ['appxbundle'],\n    'application/atom+xml': ['atom'],\n    'application/atomcat+xml': ['atomcat'],\n    'application/atomdeleted+xml': ['atomdeleted'],\n    'application/atomsvc+xml': ['atomsvc'],\n    'application/atsc-dwd+xml': ['dwd'],\n    'application/atsc-held+xml': ['held'],\n    'application/atsc-rsat+xml': ['rsat'],\n    'application/automationml-aml+xml': ['aml'],\n    'application/automationml-amlx+zip': ['amlx'],\n    'application/bdoc': ['bdoc'],\n    'application/calendar+xml': ['xcs'],\n    'application/ccxml+xml': ['ccxml'],\n    'application/cdfx+xml': ['cdfx'],\n    'application/cdmi-capability': ['cdmia'],\n    'application/cdmi-container': ['cdmic'],\n    'application/cdmi-domain': ['cdmid'],\n    'application/cdmi-object': ['cdmio'],\n    'application/cdmi-queue': ['cdmiq'],\n    'application/cpl+xml': ['cpl'],\n    'application/cu-seeme': ['cu'],\n    'application/cwl': ['cwl'],\n    'application/dash+xml': ['mpd'],\n    'application/dash-patch+xml': ['mpp'],\n    'application/davmount+xml': ['davmount'],\n    'application/dicom': ['dcm'],\n    'application/docbook+xml': ['dbk'],\n    'application/dssc+der': ['dssc'],\n    'application/dssc+xml': ['xdssc'],\n    'application/ecmascript': ['ecma'],\n    'application/emma+xml': ['emma'],\n    'application/emotionml+xml': ['emotionml'],\n    'application/epub+zip': ['epub'],\n    'application/exi': ['exi'],\n    'application/express': ['exp'],\n    'application/fdf': ['fdf'],\n    'application/fdt+xml': ['fdt'],\n    'application/font-tdpfr': ['pfr'],\n    'application/geo+json': ['geojson'],\n    'application/gml+xml': ['gml'],\n    'application/gpx+xml': ['gpx'],\n    'application/gxf': ['gxf'],\n    'application/gzip': ['gz'],\n    'application/hjson': ['hjson'],\n    'application/hyperstudio': ['stk'],\n    'application/inkml+xml': ['ink', 'inkml'],\n    'application/ipfix': ['ipfix'],\n    'application/its+xml': ['its'],\n    'application/java-archive': ['jar', 'war', 'ear'],\n    'application/java-serialized-object': ['ser'],\n    'application/java-vm': ['class'],\n    'application/javascript': ['*js'],\n    'application/json': ['json', 'map'],\n    'application/json5': ['json5'],\n    'application/jsonml+json': ['jsonml'],\n    'application/ld+json': ['jsonld'],\n    'application/lgr+xml': ['lgr'],\n    'application/lost+xml': ['lostxml'],\n    'application/mac-binhex40': ['hqx'],\n    'application/mac-compactpro': ['cpt'],\n    'application/mads+xml': ['mads'],\n    'application/manifest+json': ['webmanifest'],\n    'application/marc': ['mrc'],\n    'application/marcxml+xml': ['mrcx'],\n    'application/mathematica': ['ma', 'nb', 'mb'],\n    'application/mathml+xml': ['mathml'],\n    'application/mbox': ['mbox'],\n    'application/media-policy-dataset+xml': ['mpf'],\n    'application/mediaservercontrol+xml': ['mscml'],\n    'application/metalink+xml': ['metalink'],\n    'application/metalink4+xml': ['meta4'],\n    'application/mets+xml': ['mets'],\n    'application/mmt-aei+xml': ['maei'],\n    'application/mmt-usd+xml': ['musd'],\n    'application/mods+xml': ['mods'],\n    'application/mp21': ['m21', 'mp21'],\n    'application/mp4': ['*mp4', '*mpg4', 'mp4s', 'm4p'],\n    'application/msix': ['msix'],\n    'application/msixbundle': ['msixbundle'],\n    'application/msword': ['doc', 'dot'],\n    'application/mxf': ['mxf'],\n    'application/n-quads': ['nq'],\n    'application/n-triples': ['nt'],\n    'application/node': ['cjs'],\n    'application/octet-stream': [\n        'bin',\n        'dms',\n        'lrf',\n        'mar',\n        'so',\n        'dist',\n        'distz',\n        'pkg',\n        'bpk',\n        'dump',\n        'elc',\n        'deploy',\n        'exe',\n        'dll',\n        'deb',\n        'dmg',\n        'iso',\n        'img',\n        'msi',\n        'msp',\n        'msm',\n        'buffer',\n    ],\n    'application/oda': ['oda'],\n    'application/oebps-package+xml': ['opf'],\n    'application/ogg': ['ogx'],\n    'application/omdoc+xml': ['omdoc'],\n    'application/onenote': [\n        'onetoc',\n        'onetoc2',\n        'onetmp',\n        'onepkg',\n        'one',\n        'onea',\n    ],\n    'application/oxps': ['oxps'],\n    'application/p2p-overlay+xml': ['relo'],\n    'application/patch-ops-error+xml': ['xer'],\n    'application/pdf': ['pdf'],\n    'application/pgp-encrypted': ['pgp'],\n    'application/pgp-keys': ['asc'],\n    'application/pgp-signature': ['sig', '*asc'],\n    'application/pics-rules': ['prf'],\n    'application/pkcs10': ['p10'],\n    'application/pkcs7-mime': ['p7m', 'p7c'],\n    'application/pkcs7-signature': ['p7s'],\n    'application/pkcs8': ['p8'],\n    'application/pkix-attr-cert': ['ac'],\n    'application/pkix-cert': ['cer'],\n    'application/pkix-crl': ['crl'],\n    'application/pkix-pkipath': ['pkipath'],\n    'application/pkixcmp': ['pki'],\n    'application/pls+xml': ['pls'],\n    'application/postscript': ['ai', 'eps', 'ps'],\n    'application/provenance+xml': ['provx'],\n    'application/pskc+xml': ['pskcxml'],\n    'application/raml+yaml': ['raml'],\n    'application/rdf+xml': ['rdf', 'owl'],\n    'application/reginfo+xml': ['rif'],\n    'application/relax-ng-compact-syntax': ['rnc'],\n    'application/resource-lists+xml': ['rl'],\n    'application/resource-lists-diff+xml': ['rld'],\n    'application/rls-services+xml': ['rs'],\n    'application/route-apd+xml': ['rapd'],\n    'application/route-s-tsid+xml': ['sls'],\n    'application/route-usd+xml': ['rusd'],\n    'application/rpki-ghostbusters': ['gbr'],\n    'application/rpki-manifest': ['mft'],\n    'application/rpki-roa': ['roa'],\n    'application/rsd+xml': ['rsd'],\n    'application/rss+xml': ['rss'],\n    'application/rtf': ['rtf'],\n    'application/sbml+xml': ['sbml'],\n    'application/scvp-cv-request': ['scq'],\n    'application/scvp-cv-response': ['scs'],\n    'application/scvp-vp-request': ['spq'],\n    'application/scvp-vp-response': ['spp'],\n    'application/sdp': ['sdp'],\n    'application/senml+xml': ['senmlx'],\n    'application/sensml+xml': ['sensmlx'],\n    'application/set-payment-initiation': ['setpay'],\n    'application/set-registration-initiation': ['setreg'],\n    'application/shf+xml': ['shf'],\n    'application/sieve': ['siv', 'sieve'],\n    'application/smil+xml': ['smi', 'smil'],\n    'application/sparql-query': ['rq'],\n    'application/sparql-results+xml': ['srx'],\n    'application/sql': ['sql'],\n    'application/srgs': ['gram'],\n    'application/srgs+xml': ['grxml'],\n    'application/sru+xml': ['sru'],\n    'application/ssdl+xml': ['ssdl'],\n    'application/ssml+xml': ['ssml'],\n    'application/swid+xml': ['swidtag'],\n    'application/tei+xml': ['tei', 'teicorpus'],\n    'application/thraud+xml': ['tfi'],\n    'application/timestamped-data': ['tsd'],\n    'application/toml': ['toml'],\n    'application/trig': ['trig'],\n    'application/ttml+xml': ['ttml'],\n    'application/ubjson': ['ubj'],\n    'application/urc-ressheet+xml': ['rsheet'],\n    'application/urc-targetdesc+xml': ['td'],\n    'application/voicexml+xml': ['vxml'],\n    'application/wasm': ['wasm'],\n    'application/watcherinfo+xml': ['wif'],\n    'application/widget': ['wgt'],\n    'application/winhlp': ['hlp'],\n    'application/wsdl+xml': ['wsdl'],\n    'application/wspolicy+xml': ['wspolicy'],\n    'application/xaml+xml': ['xaml'],\n    'application/xcap-att+xml': ['xav'],\n    'application/xcap-caps+xml': ['xca'],\n    'application/xcap-diff+xml': ['xdf'],\n    'application/xcap-el+xml': ['xel'],\n    'application/xcap-ns+xml': ['xns'],\n    'application/xenc+xml': ['xenc'],\n    'application/xfdf': ['xfdf'],\n    'application/xhtml+xml': ['xhtml', 'xht'],\n    'application/xliff+xml': ['xlf'],\n    'application/xml': ['xml', 'xsl', 'xsd', 'rng'],\n    'application/xml-dtd': ['dtd'],\n    'application/xop+xml': ['xop'],\n    'application/xproc+xml': ['xpl'],\n    'application/xslt+xml': ['*xsl', 'xslt'],\n    'application/xspf+xml': ['xspf'],\n    'application/xv+xml': ['mxml', 'xhvml', 'xvml', 'xvm'],\n    'application/yang': ['yang'],\n    'application/yin+xml': ['yin'],\n    'application/zip': ['zip'],\n    'application/zip+dotlottie': ['lottie'],\n    'audio/3gpp': ['*3gpp'],\n    'audio/aac': ['adts', 'aac'],\n    'audio/adpcm': ['adp'],\n    'audio/amr': ['amr'],\n    'audio/basic': ['au', 'snd'],\n    'audio/midi': ['mid', 'midi', 'kar', 'rmi'],\n    'audio/mobile-xmf': ['mxmf'],\n    'audio/mp3': ['*mp3'],\n    'audio/mp4': ['m4a', 'mp4a', 'm4b'],\n    'audio/mpeg': ['mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a'],\n    'audio/ogg': ['oga', 'ogg', 'spx', 'opus'],\n    'audio/s3m': ['s3m'],\n    'audio/silk': ['sil'],\n    'audio/wav': ['wav'],\n    'audio/wave': ['*wav'],\n    'audio/webm': ['weba'],\n    'audio/xm': ['xm'],\n    'font/collection': ['ttc'],\n    'font/otf': ['otf'],\n    'font/ttf': ['ttf'],\n    'font/woff': ['woff'],\n    'font/woff2': ['woff2'],\n    'image/aces': ['exr'],\n    'image/apng': ['apng'],\n    'image/avci': ['avci'],\n    'image/avcs': ['avcs'],\n    'image/avif': ['avif'],\n    'image/bmp': ['bmp', 'dib'],\n    'image/cgm': ['cgm'],\n    'image/dicom-rle': ['drle'],\n    'image/dpx': ['dpx'],\n    'image/emf': ['emf'],\n    'image/fits': ['fits'],\n    'image/g3fax': ['g3'],\n    'image/gif': ['gif'],\n    'image/heic': ['heic'],\n    'image/heic-sequence': ['heics'],\n    'image/heif': ['heif'],\n    'image/heif-sequence': ['heifs'],\n    'image/hej2k': ['hej2'],\n    'image/ief': ['ief'],\n    'image/jaii': ['jaii'],\n    'image/jais': ['jais'],\n    'image/jls': ['jls'],\n    'image/jp2': ['jp2', 'jpg2'],\n    'image/jpeg': ['jpg', 'jpeg', 'jpe'],\n    'image/jph': ['jph'],\n    'image/jphc': ['jhc'],\n    'image/jpm': ['jpm', 'jpgm'],\n    'image/jpx': ['jpx', 'jpf'],\n    'image/jxl': ['jxl'],\n    'image/jxr': ['jxr'],\n    'image/jxra': ['jxra'],\n    'image/jxrs': ['jxrs'],\n    'image/jxs': ['jxs'],\n    'image/jxsc': ['jxsc'],\n    'image/jxsi': ['jxsi'],\n    'image/jxss': ['jxss'],\n    'image/ktx': ['ktx'],\n    'image/ktx2': ['ktx2'],\n    'image/pjpeg': ['jfif'],\n    'image/png': ['png'],\n    'image/sgi': ['sgi'],\n    'image/svg+xml': ['svg', 'svgz'],\n    'image/t38': ['t38'],\n    'image/tiff': ['tif', 'tiff'],\n    'image/tiff-fx': ['tfx'],\n    'image/webp': ['webp'],\n    'image/wmf': ['wmf'],\n    'message/disposition-notification': ['disposition-notification'],\n    'message/global': ['u8msg'],\n    'message/global-delivery-status': ['u8dsn'],\n    'message/global-disposition-notification': ['u8mdn'],\n    'message/global-headers': ['u8hdr'],\n    'message/rfc822': ['eml', 'mime', 'mht', 'mhtml'],\n    'model/3mf': ['3mf'],\n    'model/gltf+json': ['gltf'],\n    'model/gltf-binary': ['glb'],\n    'model/iges': ['igs', 'iges'],\n    'model/jt': ['jt'],\n    'model/mesh': ['msh', 'mesh', 'silo'],\n    'model/mtl': ['mtl'],\n    'model/obj': ['obj'],\n    'model/prc': ['prc'],\n    'model/step': ['step', 'stp', 'stpnc', 'p21', '210'],\n    'model/step+xml': ['stpx'],\n    'model/step+zip': ['stpz'],\n    'model/step-xml+zip': ['stpxz'],\n    'model/stl': ['stl'],\n    'model/u3d': ['u3d'],\n    'model/vrml': ['wrl', 'vrml'],\n    'model/x3d+binary': ['*x3db', 'x3dbz'],\n    'model/x3d+fastinfoset': ['x3db'],\n    'model/x3d+vrml': ['*x3dv', 'x3dvz'],\n    'model/x3d+xml': ['x3d', 'x3dz'],\n    'model/x3d-vrml': ['x3dv'],\n    'text/cache-manifest': ['appcache', 'manifest'],\n    'text/calendar': ['ics', 'ifb'],\n    'text/coffeescript': ['coffee', 'litcoffee'],\n    'text/css': ['css'],\n    'text/csv': ['csv'],\n    'text/html': ['html', 'htm', 'shtml'],\n    'text/jade': ['jade'],\n    'text/javascript': ['js', 'mjs'],\n    'text/jsx': ['jsx'],\n    'text/less': ['less'],\n    'text/markdown': ['md', 'markdown'],\n    'text/mathml': ['mml'],\n    'text/mdx': ['mdx'],\n    'text/n3': ['n3'],\n    'text/plain': ['txt', 'text', 'conf', 'def', 'list', 'log', 'in', 'ini'],\n    'text/richtext': ['rtx'],\n    'text/rtf': ['*rtf'],\n    'text/sgml': ['sgml', 'sgm'],\n    'text/shex': ['shex'],\n    'text/slim': ['slim', 'slm'],\n    'text/spdx': ['spdx'],\n    'text/stylus': ['stylus', 'styl'],\n    'text/tab-separated-values': ['tsv'],\n    'text/troff': ['t', 'tr', 'roff', 'man', 'me', 'ms'],\n    'text/turtle': ['ttl'],\n    'text/uri-list': ['uri', 'uris', 'urls'],\n    'text/vcard': ['vcard'],\n    'text/vtt': ['vtt'],\n    'text/wgsl': ['wgsl'],\n    'text/xml': ['*xml'],\n    'text/yaml': ['yaml', 'yml'],\n    'video/3gpp': ['3gp', '3gpp'],\n    'video/3gpp2': ['3g2'],\n    'video/h261': ['h261'],\n    'video/h263': ['h263'],\n    'video/h264': ['h264'],\n    'video/iso.segment': ['m4s'],\n    'video/jpeg': ['jpgv'],\n    'video/jpm': ['*jpm', '*jpgm'],\n    'video/mj2': ['mj2', 'mjp2'],\n    'video/mp2t': ['ts', 'm2t', 'm2ts', 'mts'],\n    'video/mp4': ['mp4', 'mp4v', 'mpg4'],\n    'video/mpeg': ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v'],\n    'video/ogg': ['ogv'],\n    'video/quicktime': ['qt', 'mov'],\n    'video/webm': ['webm'],\n};\nObject.freeze(types);\nexport default types;\n","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _Mime_extensionToType, _Mime_typeToExtension, _Mime_typeToExtensions;\nclass Mime {\n    constructor(...args) {\n        _Mime_extensionToType.set(this, new Map());\n        _Mime_typeToExtension.set(this, new Map());\n        _Mime_typeToExtensions.set(this, new Map());\n        for (const arg of args) {\n            this.define(arg);\n        }\n    }\n    define(typeMap, force = false) {\n        for (let [type, extensions] of Object.entries(typeMap)) {\n            type = type.toLowerCase();\n            extensions = extensions.map((ext) => ext.toLowerCase());\n            if (!__classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").has(type)) {\n                __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").set(type, new Set());\n            }\n            const allExtensions = __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").get(type);\n            let first = true;\n            for (let extension of extensions) {\n                const starred = extension.startsWith('*');\n                extension = starred ? extension.slice(1) : extension;\n                allExtensions?.add(extension);\n                if (first) {\n                    __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\").set(type, extension);\n                }\n                first = false;\n                if (starred)\n                    continue;\n                const currentType = __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").get(extension);\n                if (currentType && currentType != type && !force) {\n                    throw new Error(`\"${type} -> ${extension}\" conflicts with \"${currentType} -> ${extension}\". Pass \\`force=true\\` to override this definition.`);\n                }\n                __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").set(extension, type);\n            }\n        }\n        return this;\n    }\n    getType(path) {\n        if (typeof path !== 'string')\n            return null;\n        const last = path.replace(/^.*[/\\\\]/s, '').toLowerCase();\n        const ext = last.replace(/^.*\\./s, '').toLowerCase();\n        const hasPath = last.length < path.length;\n        const hasDot = ext.length < last.length - 1;\n        if (!hasDot && hasPath)\n            return null;\n        return __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").get(ext) ?? null;\n    }\n    getExtension(type) {\n        if (typeof type !== 'string')\n            return null;\n        type = type?.split?.(';')[0];\n        return ((type && __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\").get(type.trim().toLowerCase())) ?? null);\n    }\n    getAllExtensions(type) {\n        if (typeof type !== 'string')\n            return null;\n        return __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").get(type.toLowerCase()) ?? null;\n    }\n    _freeze() {\n        this.define = () => {\n            throw new Error('define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances');\n        };\n        Object.freeze(this);\n        for (const extensions of __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").values()) {\n            Object.freeze(extensions);\n        }\n        return this;\n    }\n    _getTestState() {\n        return {\n            types: __classPrivateFieldGet(this, _Mime_extensionToType, \"f\"),\n            extensions: __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\"),\n        };\n    }\n}\n_Mime_extensionToType = new WeakMap(), _Mime_typeToExtension = new WeakMap(), _Mime_typeToExtensions = new WeakMap();\nexport default Mime;\n","import otherTypes from '../types/other.js';\nimport standardTypes from '../types/standard.js';\nimport Mime from './Mime.js';\nexport { default as Mime } from './Mime.js';\nexport default new Mime(standardTypes, otherTypes)._freeze();\n","export let urlAlphabet =\n  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","\n\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\n\nexport { urlAlphabet } from './url-alphabet/index.js'\n\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\n\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n  let safeByteCutoff = 256 - (256 % alphabet.length)\n\n  if (safeByteCutoff === 256) {\n    let mask = alphabet.length - 1\n\n    return (size = defaultSize) => {\n      if (!size) return ''\n      let id = ''\n      while (true) {\n        let bytes = getRandom(size)\n        let j = size\n        while (j--) {\n          id += alphabet[bytes[j] & mask]\n          if (id.length >= size) return id\n        }\n      }\n    }\n  }\n\n  let step = Math.ceil((1.6 * 256 * defaultSize) / safeByteCutoff)\n\n  return (size = defaultSize) => {\n    if (!size) return ''\n    let id = ''\n    while (true) {\n      let bytes = getRandom(step)\n      let j = step\n      while (j--) {\n        if (bytes[j] < safeByteCutoff) {\n          id += alphabet[bytes[j] % alphabet.length]\n          if (id.length >= size) return id\n        }\n      }\n    }\n  }\n}\n\nexport let customAlphabet = (alphabet, size = 21) =>\n  customRandom(alphabet, size | 0, random)\n\nexport let nanoid = (size = 21) => {\n  let id = ''\n  let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n  while (size--) {\n    id += scopedUrlAlphabet[bytes[size] & 63]\n  }\n  return id\n}\n","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\n// NW.js / Electron is a browser context, but copies some Node.js objects; see\n// http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/#access-nodejs-and-nwjs-api-in-browser-context\n// https://www.electronjs.org/docs/api/process#processversionselectron-readonly\n// https://www.electronjs.org/docs/api/process#processtype-readonly\nconst isNodeJS =\n  (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n  typeof process === \"object\" &&\n  process + \"\" === \"[object process]\" &&\n  !process.versions.nw &&\n  !(process.versions.electron && process.type && process.type !== \"browser\");\n\nconst IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\n\nconst MAX_IMAGE_SIZE_TO_CACHE = 10e6; // Ten megabytes.\n\n// Represent the percentage of the height of a single-line field over\n// the font size. Acrobat seems to use this value.\nconst LINE_FACTOR = 1.35;\nconst LINE_DESCENT_FACTOR = 0.35;\nconst BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;\n\n/**\n * Refer to the `WorkerTransport.getRenderingIntent`-method in the API, to see\n * how these flags are being used:\n *  - ANY, DISPLAY, and PRINT are the normal rendering intents, note the\n *    `PDFPageProxy.{render, getOperatorList, getAnnotations}`-methods.\n *  - SAVE is used, on the worker-thread, when saving modified annotations.\n *  - ANNOTATIONS_FORMS, ANNOTATIONS_STORAGE, ANNOTATIONS_DISABLE control which\n *    annotations are rendered onto the canvas (i.e. by being included in the\n *    operatorList), note the `PDFPageProxy.{render, getOperatorList}`-methods\n *    and their `annotationMode`-option.\n *  - IS_EDITING is used when editing is active in the viewer.\n *  - OPLIST is used with the `PDFPageProxy.getOperatorList`-method, note the\n *    `OperatorList`-constructor (on the worker-thread).\n */\nconst RenderingIntentFlag = {\n  ANY: 0x01,\n  DISPLAY: 0x02,\n  PRINT: 0x04,\n  SAVE: 0x08,\n  ANNOTATIONS_FORMS: 0x10,\n  ANNOTATIONS_STORAGE: 0x20,\n  ANNOTATIONS_DISABLE: 0x40,\n  IS_EDITING: 0x80,\n  OPLIST: 0x100,\n};\n\nconst AnnotationMode = {\n  DISABLE: 0,\n  ENABLE: 1,\n  ENABLE_FORMS: 2,\n  ENABLE_STORAGE: 3,\n};\n\nconst AnnotationEditorPrefix = \"pdfjs_internal_editor_\";\n\nconst AnnotationEditorType = {\n  DISABLE: -1,\n  NONE: 0,\n  FREETEXT: 3,\n  HIGHLIGHT: 9,\n  STAMP: 13,\n  INK: 15,\n};\n\nconst AnnotationEditorParamsType = {\n  RESIZE: 1,\n  CREATE: 2,\n  FREETEXT_SIZE: 11,\n  FREETEXT_COLOR: 12,\n  FREETEXT_OPACITY: 13,\n  INK_COLOR: 21,\n  INK_THICKNESS: 22,\n  INK_OPACITY: 23,\n  HIGHLIGHT_COLOR: 31,\n  HIGHLIGHT_DEFAULT_COLOR: 32,\n  HIGHLIGHT_THICKNESS: 33,\n  HIGHLIGHT_FREE: 34,\n  HIGHLIGHT_SHOW_ALL: 35,\n  DRAW_STEP: 41,\n};\n\n// Permission flags from Table 22, Section 7.6.3.2 of the PDF specification.\nconst PermissionFlag = {\n  PRINT: 0x04,\n  MODIFY_CONTENTS: 0x08,\n  COPY: 0x10,\n  MODIFY_ANNOTATIONS: 0x20,\n  FILL_INTERACTIVE_FORMS: 0x100,\n  COPY_FOR_ACCESSIBILITY: 0x200,\n  ASSEMBLE: 0x400,\n  PRINT_HIGH_QUALITY: 0x800,\n};\n\nconst TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4,\n};\n\nconst ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3,\n};\n\nconst AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26,\n};\n\nconst AnnotationReplyType = {\n  GROUP: \"Group\",\n  REPLY: \"R\",\n};\n\nconst AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200,\n};\n\nconst AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000,\n};\n\nconst AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5,\n};\n\nconst AnnotationActionEventType = {\n  E: \"Mouse Enter\",\n  X: \"Mouse Exit\",\n  D: \"Mouse Down\",\n  U: \"Mouse Up\",\n  Fo: \"Focus\",\n  Bl: \"Blur\",\n  PO: \"PageOpen\",\n  PC: \"PageClose\",\n  PV: \"PageVisible\",\n  PI: \"PageInvisible\",\n  K: \"Keystroke\",\n  F: \"Format\",\n  V: \"Validate\",\n  C: \"Calculate\",\n};\n\nconst DocumentActionEventType = {\n  WC: \"WillClose\",\n  WS: \"WillSave\",\n  DS: \"DidSave\",\n  WP: \"WillPrint\",\n  DP: \"DidPrint\",\n};\n\nconst PageActionEventType = {\n  O: \"PageOpen\",\n  C: \"PageClose\",\n};\n\nconst VerbosityLevel = {\n  ERRORS: 0,\n  WARNINGS: 1,\n  INFOS: 5,\n};\n\n// All the possible operations for an operator list.\nconst OPS = {\n  // Intentionally start from 1 so it is easy to spot bad operators that will be\n  // 0's.\n  // PLEASE NOTE: We purposely keep any removed operators commented out, since\n  //              re-numbering the list would risk breaking third-party users.\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  // beginAnnotations: 78,\n  // endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  // paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91,\n  setStrokeTransparent: 92,\n  setFillTransparent: 93,\n};\n\nconst PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2,\n};\n\nlet verbosity = VerbosityLevel.WARNINGS;\n\nfunction setVerbosityLevel(level) {\n  if (Number.isInteger(level)) {\n    verbosity = level;\n  }\n}\n\nfunction getVerbosityLevel() {\n  return verbosity;\n}\n\n// A notice for devs. These are good for things that are helpful to devs, such\n// as warning that Workers were disabled, which is important to devs but not\n// end users.\nfunction info(msg) {\n  if (verbosity >= VerbosityLevel.INFOS) {\n    // eslint-disable-next-line no-console\n    console.log(`Info: ${msg}`);\n  }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n  if (verbosity >= VerbosityLevel.WARNINGS) {\n    // eslint-disable-next-line no-console\n    console.log(`Warning: ${msg}`);\n  }\n}\n\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\n\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\n\n// Checks if URLs use one of the allowed protocols, e.g. to avoid XSS.\nfunction _isValidProtocol(url) {\n  switch (url?.protocol) {\n    case \"http:\":\n    case \"https:\":\n    case \"ftp:\":\n    case \"mailto:\":\n    case \"tel:\":\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Attempts to create a valid absolute URL.\n *\n * @param {URL|string} url - An absolute, or relative, URL.\n * @param {URL|string} [baseUrl] - An absolute URL.\n * @param {Object} [options]\n * @returns Either a valid {URL}, or `null` otherwise.\n */\nfunction createValidAbsoluteUrl(url, baseUrl = null, options = null) {\n  if (!url) {\n    return null;\n  }\n  try {\n    if (options && typeof url === \"string\") {\n      // Let URLs beginning with \"www.\" default to using the \"http://\" protocol.\n      if (options.addDefaultProtocol && url.startsWith(\"www.\")) {\n        const dots = url.match(/\\./g);\n        // Avoid accidentally matching a *relative* URL pointing to a file named\n        // e.g. \"www.pdf\" or similar.\n        if (dots?.length >= 2) {\n          url = `http://${url}`;\n        }\n      }\n\n      // According to ISO 32000-1:2008, section 12.6.4.7, URIs should be encoded\n      // in 7-bit ASCII. Some bad PDFs use UTF-8 encoding; see bug 1122280.\n      if (options.tryConvertEncoding) {\n        try {\n          url = stringToUTF8String(url);\n        } catch {}\n      }\n    }\n\n    const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n    if (_isValidProtocol(absoluteUrl)) {\n      return absoluteUrl;\n    }\n  } catch {\n    /* `new URL()` will throw on incorrect data. */\n  }\n  return null;\n}\n\nfunction shadow(obj, prop, value, nonSerializable = false) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    assert(\n      prop in obj,\n      `shadow: Property \"${prop && prop.toString()}\" not found in object.`\n    );\n  }\n  Object.defineProperty(obj, prop, {\n    value,\n    enumerable: !nonSerializable,\n    configurable: true,\n    writable: false,\n  });\n  return value;\n}\n\n/**\n * @type {any}\n */\nconst BaseException = (function BaseExceptionClosure() {\n  // eslint-disable-next-line no-shadow\n  function BaseException(message, name) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseException\n    ) {\n      unreachable(\"Cannot initialize BaseException.\");\n    }\n    this.message = message;\n    this.name = name;\n  }\n  BaseException.prototype = new Error();\n  BaseException.constructor = BaseException;\n\n  return BaseException;\n})();\n\nclass PasswordException extends BaseException {\n  constructor(msg, code) {\n    super(msg, \"PasswordException\");\n    this.code = code;\n  }\n}\n\nclass UnknownErrorException extends BaseException {\n  constructor(msg, details) {\n    super(msg, \"UnknownErrorException\");\n    this.details = details;\n  }\n}\n\nclass InvalidPDFException extends BaseException {\n  constructor(msg) {\n    super(msg, \"InvalidPDFException\");\n  }\n}\n\nclass MissingPDFException extends BaseException {\n  constructor(msg) {\n    super(msg, \"MissingPDFException\");\n  }\n}\n\nclass UnexpectedResponseException extends BaseException {\n  constructor(msg, status) {\n    super(msg, \"UnexpectedResponseException\");\n    this.status = status;\n  }\n}\n\n/**\n * Error caused during parsing PDF data.\n */\nclass FormatError extends BaseException {\n  constructor(msg) {\n    super(msg, \"FormatError\");\n  }\n}\n\n/**\n * Error used to indicate task cancellation.\n */\nclass AbortException extends BaseException {\n  constructor(msg) {\n    super(msg, \"AbortException\");\n  }\n}\n\nfunction bytesToString(bytes) {\n  if (typeof bytes !== \"object\" || bytes?.length === undefined) {\n    unreachable(\"Invalid argument for bytesToString\");\n  }\n  const length = bytes.length;\n  const MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  const strBuf = [];\n  for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    const chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join(\"\");\n}\n\nfunction stringToBytes(str) {\n  if (typeof str !== \"string\") {\n    unreachable(\"Invalid argument for stringToBytes\");\n  }\n  const length = str.length;\n  const bytes = new Uint8Array(length);\n  for (let i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xff;\n  }\n  return bytes;\n}\n\nfunction string32(value) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    assert(\n      typeof value === \"number\" && Math.abs(value) < 2 ** 32,\n      `string32: Unexpected input \"${value}\".`\n    );\n  }\n  return String.fromCharCode(\n    (value >> 24) & 0xff,\n    (value >> 16) & 0xff,\n    (value >> 8) & 0xff,\n    value & 0xff\n  );\n}\n\nfunction objectSize(obj) {\n  return Object.keys(obj).length;\n}\n\n// Ensure that the returned Object has a `null` prototype; hence why\n// `Object.fromEntries(...)` is not used.\nfunction objectFromMap(map) {\n  const obj = Object.create(null);\n  for (const [key, value] of map) {\n    obj[key] = value;\n  }\n  return obj;\n}\n\n// Checks the endianness of the platform.\nfunction isLittleEndian() {\n  const buffer8 = new Uint8Array(4);\n  buffer8[0] = 1;\n  const view32 = new Uint32Array(buffer8.buffer, 0, 1);\n  return view32[0] === 1;\n}\n\n// Checks if it's possible to eval JS expressions.\nfunction isEvalSupported() {\n  try {\n    new Function(\"\"); // eslint-disable-line no-new, no-new-func\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nclass FeatureTest {\n  static get isLittleEndian() {\n    return shadow(this, \"isLittleEndian\", isLittleEndian());\n  }\n\n  static get isEvalSupported() {\n    return shadow(this, \"isEvalSupported\", isEvalSupported());\n  }\n\n  static get isOffscreenCanvasSupported() {\n    return shadow(\n      this,\n      \"isOffscreenCanvasSupported\",\n      typeof OffscreenCanvas !== \"undefined\"\n    );\n  }\n\n  static get isImageDecoderSupported() {\n    return shadow(\n      this,\n      \"isImageDecoderSupported\",\n      typeof ImageDecoder !== \"undefined\"\n    );\n  }\n\n  static get platform() {\n    if (\n      (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n      (typeof navigator !== \"undefined\" &&\n        typeof navigator?.platform === \"string\")\n    ) {\n      return shadow(this, \"platform\", {\n        isMac: navigator.platform.includes(\"Mac\"),\n        isWindows: navigator.platform.includes(\"Win\"),\n        isFirefox:\n          (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n          (typeof navigator?.userAgent === \"string\" &&\n            navigator.userAgent.includes(\"Firefox\")),\n      });\n    }\n    return shadow(this, \"platform\", {\n      isMac: false,\n      isWindows: false,\n      isFirefox: false,\n    });\n  }\n\n  static get isCSSRoundSupported() {\n    return shadow(\n      this,\n      \"isCSSRoundSupported\",\n      globalThis.CSS?.supports?.(\"width: round(1.5px, 1px)\")\n    );\n  }\n}\n\nconst hexNumbers = Array.from(Array(256).keys(), n =>\n  n.toString(16).padStart(2, \"0\")\n);\n\nclass Util {\n  static makeHexColor(r, g, b) {\n    return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;\n  }\n\n  // Apply a scaling matrix to some min/max values.\n  // If a scaling factor is negative then min and max must be\n  // swapped.\n  static scaleMinMax(transform, minMax) {\n    let temp;\n    if (transform[0]) {\n      if (transform[0] < 0) {\n        temp = minMax[0];\n        minMax[0] = minMax[2];\n        minMax[2] = temp;\n      }\n      minMax[0] *= transform[0];\n      minMax[2] *= transform[0];\n\n      if (transform[3] < 0) {\n        temp = minMax[1];\n        minMax[1] = minMax[3];\n        minMax[3] = temp;\n      }\n      minMax[1] *= transform[3];\n      minMax[3] *= transform[3];\n    } else {\n      temp = minMax[0];\n      minMax[0] = minMax[1];\n      minMax[1] = temp;\n      temp = minMax[2];\n      minMax[2] = minMax[3];\n      minMax[3] = temp;\n\n      if (transform[1] < 0) {\n        temp = minMax[1];\n        minMax[1] = minMax[3];\n        minMax[3] = temp;\n      }\n      minMax[1] *= transform[1];\n      minMax[3] *= transform[1];\n\n      if (transform[2] < 0) {\n        temp = minMax[0];\n        minMax[0] = minMax[2];\n        minMax[2] = temp;\n      }\n      minMax[0] *= transform[2];\n      minMax[2] *= transform[2];\n    }\n    minMax[0] += transform[4];\n    minMax[1] += transform[5];\n    minMax[2] += transform[4];\n    minMax[3] += transform[5];\n  }\n\n  // Concatenates two transformation matrices together and returns the result.\n  static transform(m1, m2) {\n    return [\n      m1[0] * m2[0] + m1[2] * m2[1],\n      m1[1] * m2[0] + m1[3] * m2[1],\n      m1[0] * m2[2] + m1[2] * m2[3],\n      m1[1] * m2[2] + m1[3] * m2[3],\n      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n      m1[1] * m2[4] + m1[3] * m2[5] + m1[5],\n    ];\n  }\n\n  // For 2d affine transforms\n  static applyTransform(p, m) {\n    const xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    const yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  }\n\n  static applyInverseTransform(p, m) {\n    const d = m[0] * m[3] - m[1] * m[2];\n    const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  }\n\n  // Applies the transform to the rectangle and finds the minimum axially\n  // aligned bounding box.\n  static getAxialAlignedBoundingBox(r, m) {\n    const p1 = this.applyTransform(r, m);\n    const p2 = this.applyTransform(r.slice(2, 4), m);\n    const p3 = this.applyTransform([r[0], r[3]], m);\n    const p4 = this.applyTransform([r[2], r[1]], m);\n    return [\n      Math.min(p1[0], p2[0], p3[0], p4[0]),\n      Math.min(p1[1], p2[1], p3[1], p4[1]),\n      Math.max(p1[0], p2[0], p3[0], p4[0]),\n      Math.max(p1[1], p2[1], p3[1], p4[1]),\n    ];\n  }\n\n  static inverseTransform(m) {\n    const d = m[0] * m[3] - m[1] * m[2];\n    return [\n      m[3] / d,\n      -m[1] / d,\n      -m[2] / d,\n      m[0] / d,\n      (m[2] * m[5] - m[4] * m[3]) / d,\n      (m[4] * m[1] - m[5] * m[0]) / d,\n    ];\n  }\n\n  // This calculation uses Singular Value Decomposition.\n  // The SVD can be represented with formula A = USV. We are interested in the\n  // matrix S here because it represents the scale values.\n  static singularValueDecompose2dScale(m) {\n    const transpose = [m[0], m[2], m[1], m[3]];\n\n    // Multiply matrix m with its transpose.\n    const a = m[0] * transpose[0] + m[1] * transpose[2];\n    const b = m[0] * transpose[1] + m[1] * transpose[3];\n    const c = m[2] * transpose[0] + m[3] * transpose[2];\n    const d = m[2] * transpose[1] + m[3] * transpose[3];\n\n    // Solve the second degree polynomial to get roots.\n    const first = (a + d) / 2;\n    const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2;\n    const sx = first + second || 1;\n    const sy = first - second || 1;\n\n    // Scale values are the square roots of the eigenvalues.\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  }\n\n  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n  // For coordinate systems whose origin lies in the bottom-left, this\n  // means normalization to (BL,TR) ordering. For systems with origin in the\n  // top-left, this means (TL,BR) ordering.\n  static normalizeRect(rect) {\n    const r = rect.slice(0); // clone rect\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  }\n\n  // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n  // intersection of rect1 and rect2. If no intersection, returns 'null'\n  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n  static intersect(rect1, rect2) {\n    const xLow = Math.max(\n      Math.min(rect1[0], rect1[2]),\n      Math.min(rect2[0], rect2[2])\n    );\n    const xHigh = Math.min(\n      Math.max(rect1[0], rect1[2]),\n      Math.max(rect2[0], rect2[2])\n    );\n    if (xLow > xHigh) {\n      return null;\n    }\n    const yLow = Math.max(\n      Math.min(rect1[1], rect1[3]),\n      Math.min(rect2[1], rect2[3])\n    );\n    const yHigh = Math.min(\n      Math.max(rect1[1], rect1[3]),\n      Math.max(rect2[1], rect2[3])\n    );\n    if (yLow > yHigh) {\n      return null;\n    }\n\n    return [xLow, yLow, xHigh, yHigh];\n  }\n\n  static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {\n    if (t <= 0 || t >= 1) {\n      return;\n    }\n    const mt = 1 - t;\n    const tt = t * t;\n    const ttt = tt * t;\n    const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;\n    const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;\n    minMax[0] = Math.min(minMax[0], x);\n    minMax[1] = Math.min(minMax[1], y);\n    minMax[2] = Math.max(minMax[2], x);\n    minMax[3] = Math.max(minMax[3], y);\n  }\n\n  static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {\n    if (Math.abs(a) < 1e-12) {\n      if (Math.abs(b) >= 1e-12) {\n        this.#getExtremumOnCurve(\n          x0,\n          x1,\n          x2,\n          x3,\n          y0,\n          y1,\n          y2,\n          y3,\n          -c / b,\n          minMax\n        );\n      }\n      return;\n    }\n\n    const delta = b ** 2 - 4 * c * a;\n    if (delta < 0) {\n      return;\n    }\n    const sqrtDelta = Math.sqrt(delta);\n    const a2 = 2 * a;\n    this.#getExtremumOnCurve(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      (-b + sqrtDelta) / a2,\n      minMax\n    );\n    this.#getExtremumOnCurve(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      (-b - sqrtDelta) / a2,\n      minMax\n    );\n  }\n\n  // From https://github.com/adobe-webplatform/Snap.svg/blob/b365287722a72526000ac4bfcf0ce4cac2faa015/src/path.js#L852\n  static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) {\n    if (minMax) {\n      minMax[0] = Math.min(minMax[0], x0, x3);\n      minMax[1] = Math.min(minMax[1], y0, y3);\n      minMax[2] = Math.max(minMax[2], x0, x3);\n      minMax[3] = Math.max(minMax[3], y0, y3);\n    } else {\n      minMax = [\n        Math.min(x0, x3),\n        Math.min(y0, y3),\n        Math.max(x0, x3),\n        Math.max(y0, y3),\n      ];\n    }\n    this.#getExtremum(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      3 * (-x0 + 3 * (x1 - x2) + x3),\n      6 * (x0 - 2 * x1 + x2),\n      3 * (x1 - x0),\n      minMax\n    );\n    this.#getExtremum(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      3 * (-y0 + 3 * (y1 - y2) + y3),\n      6 * (y0 - 2 * y1 + y2),\n      3 * (y1 - y0),\n      minMax\n    );\n    return minMax;\n  }\n}\n\nconst PDFStringTranslateTable = [\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8,\n  0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192,\n  0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,\n  0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d,\n  0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac,\n];\n\nfunction stringToPDFString(str) {\n  // See section 7.9.2.2 Text String Type.\n  // The string can contain some language codes bracketed with 0x0b,\n  // so we must remove them.\n  if (str[0] >= \"\\xEF\") {\n    let encoding;\n    if (str[0] === \"\\xFE\" && str[1] === \"\\xFF\") {\n      encoding = \"utf-16be\";\n      if (str.length % 2 === 1) {\n        str = str.slice(0, -1);\n      }\n    } else if (str[0] === \"\\xFF\" && str[1] === \"\\xFE\") {\n      encoding = \"utf-16le\";\n      if (str.length % 2 === 1) {\n        str = str.slice(0, -1);\n      }\n    } else if (str[0] === \"\\xEF\" && str[1] === \"\\xBB\" && str[2] === \"\\xBF\") {\n      encoding = \"utf-8\";\n    }\n\n    if (encoding) {\n      try {\n        const decoder = new TextDecoder(encoding, { fatal: true });\n        const buffer = stringToBytes(str);\n        const decoded = decoder.decode(buffer);\n        if (!decoded.includes(\"\\x1b\")) {\n          return decoded;\n        }\n        return decoded.replaceAll(/\\x1b[^\\x1b]*(?:\\x1b|$)/g, \"\");\n      } catch (ex) {\n        warn(`stringToPDFString: \"${ex}\".`);\n      }\n    }\n  }\n  // ISO Latin 1\n  const strBuf = [];\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const charCode = str.charCodeAt(i);\n    if (charCode === 0x1b) {\n      // eslint-disable-next-line no-empty\n      while (++i < ii && str.charCodeAt(i) !== 0x1b) {}\n      continue;\n    }\n    const code = PDFStringTranslateTable[charCode];\n    strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n  }\n  return strBuf.join(\"\");\n}\n\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\n\nfunction isArrayEqual(arr1, arr2) {\n  if (arr1.length !== arr2.length) {\n    return false;\n  }\n  for (let i = 0, ii = arr1.length; i < ii; i++) {\n    if (arr1[i] !== arr2[i]) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction getModificationDate(date = new Date()) {\n  const buffer = [\n    date.getUTCFullYear().toString(),\n    (date.getUTCMonth() + 1).toString().padStart(2, \"0\"),\n    date.getUTCDate().toString().padStart(2, \"0\"),\n    date.getUTCHours().toString().padStart(2, \"0\"),\n    date.getUTCMinutes().toString().padStart(2, \"0\"),\n    date.getUTCSeconds().toString().padStart(2, \"0\"),\n  ];\n\n  return buffer.join(\"\");\n}\n\nlet NormalizeRegex = null;\nlet NormalizationMap = null;\nfunction normalizeUnicode(str) {\n  if (!NormalizeRegex) {\n    // In order to generate the following regex:\n    //  - create a PDF containing all the chars in the range 0000-FFFF with\n    //    a NFKC which is different of the char.\n    //  - copy and paste all those chars and get the ones where NFKC is\n    //    required.\n    // It appears that most the chars here contain some ligatures.\n    NormalizeRegex =\n      /([\\u00a0\\u00b5\\u037e\\u0eb3\\u2000-\\u200a\\u202f\\u2126\\ufb00-\\ufb04\\ufb06\\ufb20-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufba1\\ufba4-\\ufba9\\ufbae-\\ufbb1\\ufbd3-\\ufbdc\\ufbde-\\ufbe7\\ufbea-\\ufbf8\\ufbfc-\\ufbfd\\ufc00-\\ufc5d\\ufc64-\\ufcf1\\ufcf5-\\ufd3d\\ufd88\\ufdf4\\ufdfa-\\ufdfb\\ufe71\\ufe77\\ufe79\\ufe7b\\ufe7d]+)|(\\ufb05+)/gu;\n    NormalizationMap = new Map([[\"ﬅ\", \"ſt\"]]);\n  }\n  return str.replaceAll(NormalizeRegex, (_, p1, p2) =>\n    p1 ? p1.normalize(\"NFKC\") : NormalizationMap.get(p2)\n  );\n}\n\nfunction getUuid() {\n  if (\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n    typeof crypto.randomUUID === \"function\"\n  ) {\n    return crypto.randomUUID();\n  }\n  const buf = new Uint8Array(32);\n  crypto.getRandomValues(buf);\n  return bytesToString(buf);\n}\n\nconst AnnotationPrefix = \"pdfjs_internal_id_\";\n\n// TODO: Remove this once `Uint8Array.prototype.toHex` is generally available.\nfunction toHexUtil(arr) {\n  if (Uint8Array.prototype.toHex) {\n    return arr.toHex();\n  }\n  return Array.from(arr, num => hexNumbers[num]).join(\"\");\n}\n\n// TODO: Remove this once `Uint8Array.prototype.toBase64` is generally\n//       available.\nfunction toBase64Util(arr) {\n  if (Uint8Array.prototype.toBase64) {\n    return arr.toBase64();\n  }\n  return btoa(bytesToString(arr));\n}\n\n// TODO: Remove this once `Uint8Array.fromBase64` is generally available.\nfunction fromBase64Util(str) {\n  if (Uint8Array.fromBase64) {\n    return Uint8Array.fromBase64(str);\n  }\n  return stringToBytes(atob(str));\n}\n\n// TODO: Remove this once https://bugzilla.mozilla.org/show_bug.cgi?id=1928493\n//       is fixed.\nif (\n  (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"SKIP_BABEL\")) &&\n  typeof Promise.try !== \"function\"\n) {\n  Promise.try = function (fn, ...args) {\n    return new Promise(resolve => {\n      resolve(fn(...args));\n    });\n  };\n}\n\nexport {\n  AbortException,\n  AnnotationActionEventType,\n  AnnotationBorderStyleType,\n  AnnotationEditorParamsType,\n  AnnotationEditorPrefix,\n  AnnotationEditorType,\n  AnnotationFieldFlag,\n  AnnotationFlag,\n  AnnotationMode,\n  AnnotationPrefix,\n  AnnotationReplyType,\n  AnnotationType,\n  assert,\n  BaseException,\n  BASELINE_FACTOR,\n  bytesToString,\n  createValidAbsoluteUrl,\n  DocumentActionEventType,\n  FeatureTest,\n  FONT_IDENTITY_MATRIX,\n  FormatError,\n  fromBase64Util,\n  getModificationDate,\n  getUuid,\n  getVerbosityLevel,\n  hexNumbers,\n  IDENTITY_MATRIX,\n  ImageKind,\n  info,\n  InvalidPDFException,\n  isArrayEqual,\n  isNodeJS,\n  LINE_DESCENT_FACTOR,\n  LINE_FACTOR,\n  MAX_IMAGE_SIZE_TO_CACHE,\n  MissingPDFException,\n  normalizeUnicode,\n  objectFromMap,\n  objectSize,\n  OPS,\n  PageActionEventType,\n  PasswordException,\n  PasswordResponses,\n  PermissionFlag,\n  RenderingIntentFlag,\n  setVerbosityLevel,\n  shadow,\n  string32,\n  stringToBytes,\n  stringToPDFString,\n  stringToUTF8String,\n  TextRenderingMode,\n  toBase64Util,\n  toHexUtil,\n  UnexpectedResponseException,\n  UnknownErrorException,\n  unreachable,\n  utf8StringToString,\n  Util,\n  VerbosityLevel,\n  warn,\n};\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  BaseException,\n  FeatureTest,\n  shadow,\n  Util,\n  warn,\n} from \"../shared/util.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nclass PixelsPerInch {\n  static CSS = 96.0;\n\n  static PDF = 72.0;\n\n  static PDF_TO_CSS_UNITS = this.CSS / this.PDF;\n}\n\nasync function fetchData(url, type = \"text\") {\n  if (\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n    isValidFetchUrl(url, document.baseURI)\n  ) {\n    const response = await fetch(url);\n    if (!response.ok) {\n      throw new Error(response.statusText);\n    }\n    switch (type) {\n      case \"arraybuffer\":\n        return response.arrayBuffer();\n      case \"blob\":\n        return response.blob();\n      case \"json\":\n        return response.json();\n    }\n    return response.text();\n  }\n\n  // The Fetch API is not supported.\n  return new Promise((resolve, reject) => {\n    const request = new XMLHttpRequest();\n    request.open(\"GET\", url, /* async = */ true);\n    request.responseType = type;\n\n    request.onreadystatechange = () => {\n      if (request.readyState !== XMLHttpRequest.DONE) {\n        return;\n      }\n      if (request.status === 200 || request.status === 0) {\n        switch (type) {\n          case \"arraybuffer\":\n          case \"blob\":\n          case \"json\":\n            resolve(request.response);\n            return;\n        }\n        resolve(request.responseText);\n        return;\n      }\n      reject(new Error(request.statusText));\n    };\n\n    request.send(null);\n  });\n}\n\n/**\n * @typedef {Object} PageViewportParameters\n * @property {Array<number>} viewBox - The xMin, yMin, xMax and\n *   yMax coordinates.\n * @property {number} userUnit - The size of units.\n * @property {number} scale - The scale of the viewport.\n * @property {number} rotation - The rotation, in degrees, of the viewport.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset. The\n *   default value is `0`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset. The\n *   default value is `0`.\n * @property {boolean} [dontFlip] - If true, the y-axis will not be flipped.\n *   The default value is `false`.\n */\n\n/**\n * @typedef {Object} PageViewportCloneParameters\n * @property {number} [scale] - The scale, overriding the one in the cloned\n *   viewport. The default value is `this.scale`.\n * @property {number} [rotation] - The rotation, in degrees, overriding the one\n *   in the cloned viewport. The default value is `this.rotation`.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset.\n *   The default value is `this.offsetX`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset.\n *   The default value is `this.offsetY`.\n * @property {boolean} [dontFlip] - If true, the x-axis will not be flipped.\n *   The default value is `false`.\n */\n\n/**\n * PDF page viewport created based on scale, rotation and offset.\n */\nclass PageViewport {\n  /**\n   * @param {PageViewportParameters}\n   */\n  constructor({\n    viewBox,\n    userUnit,\n    scale,\n    rotation,\n    offsetX = 0,\n    offsetY = 0,\n    dontFlip = false,\n  }) {\n    this.viewBox = viewBox;\n    this.userUnit = userUnit;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n\n    scale *= userUnit; // Take the userUnit into account.\n\n    // creating transform to convert pdf coordinate system to the normal\n    // canvas like coordinates taking in account scale and rotation\n    const centerX = (viewBox[2] + viewBox[0]) / 2;\n    const centerY = (viewBox[3] + viewBox[1]) / 2;\n    let rotateA, rotateB, rotateC, rotateD;\n    // Normalize the rotation, by clamping it to the [0, 360) range.\n    rotation %= 360;\n    if (rotation < 0) {\n      rotation += 360;\n    }\n    switch (rotation) {\n      case 180:\n        rotateA = -1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0;\n        rotateB = 1;\n        rotateC = 1;\n        rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0;\n        rotateB = -1;\n        rotateC = -1;\n        rotateD = 0;\n        break;\n      case 0:\n        rotateA = 1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = -1;\n        break;\n      default:\n        throw new Error(\n          \"PageViewport: Invalid rotation, must be a multiple of 90 degrees.\"\n        );\n    }\n\n    if (dontFlip) {\n      rotateC = -rotateC;\n      rotateD = -rotateD;\n    }\n\n    let offsetCanvasX, offsetCanvasY;\n    let width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = (viewBox[3] - viewBox[1]) * scale;\n      height = (viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = (viewBox[2] - viewBox[0]) * scale;\n      height = (viewBox[3] - viewBox[1]) * scale;\n    }\n    // creating transform for the following operations:\n    // translate(-centerX, -centerY), rotate and flip vertically,\n    // scale, and translate(offsetCanvasX, offsetCanvasY)\n    this.transform = [\n      rotateA * scale,\n      rotateB * scale,\n      rotateC * scale,\n      rotateD * scale,\n      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,\n      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY,\n    ];\n\n    this.width = width;\n    this.height = height;\n  }\n\n  /**\n   * The original, un-scaled, viewport dimensions.\n   * @type {Object}\n   */\n  get rawDims() {\n    const { userUnit, viewBox } = this;\n    const dims = viewBox.map(x => x * userUnit);\n\n    return shadow(this, \"rawDims\", {\n      pageWidth: dims[2] - dims[0],\n      pageHeight: dims[3] - dims[1],\n      pageX: dims[0],\n      pageY: dims[1],\n    });\n  }\n\n  /**\n   * Clones viewport, with optional additional properties.\n   * @param {PageViewportCloneParameters} [params]\n   * @returns {PageViewport} Cloned viewport.\n   */\n  clone({\n    scale = this.scale,\n    rotation = this.rotation,\n    offsetX = this.offsetX,\n    offsetY = this.offsetY,\n    dontFlip = false,\n  } = {}) {\n    return new PageViewport({\n      viewBox: this.viewBox.slice(),\n      userUnit: this.userUnit,\n      scale,\n      rotation,\n      offsetX,\n      offsetY,\n      dontFlip,\n    });\n  }\n\n  /**\n   * Converts PDF point to the viewport coordinates. For examples, useful for\n   * converting PDF location into canvas pixel coordinates.\n   * @param {number} x - The x-coordinate.\n   * @param {number} y - The y-coordinate.\n   * @returns {Array} Array containing `x`- and `y`-coordinates of the\n   *   point in the viewport coordinate space.\n   * @see {@link convertToPdfPoint}\n   * @see {@link convertToViewportRectangle}\n   */\n  convertToViewportPoint(x, y) {\n    return Util.applyTransform([x, y], this.transform);\n  }\n\n  /**\n   * Converts PDF rectangle to the viewport coordinates.\n   * @param {Array} rect - The xMin, yMin, xMax and yMax coordinates.\n   * @returns {Array} Array containing corresponding coordinates of the\n   *   rectangle in the viewport coordinate space.\n   * @see {@link convertToViewportPoint}\n   */\n  convertToViewportRectangle(rect) {\n    const topLeft = Util.applyTransform([rect[0], rect[1]], this.transform);\n    const bottomRight = Util.applyTransform([rect[2], rect[3]], this.transform);\n    return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];\n  }\n\n  /**\n   * Converts viewport coordinates to the PDF location. For examples, useful\n   * for converting canvas pixel location into PDF one.\n   * @param {number} x - The x-coordinate.\n   * @param {number} y - The y-coordinate.\n   * @returns {Array} Array containing `x`- and `y`-coordinates of the\n   *   point in the PDF coordinate space.\n   * @see {@link convertToViewportPoint}\n   */\n  convertToPdfPoint(x, y) {\n    return Util.applyInverseTransform([x, y], this.transform);\n  }\n}\n\nclass RenderingCancelledException extends BaseException {\n  constructor(msg, extraDelay = 0) {\n    super(msg, \"RenderingCancelledException\");\n    this.extraDelay = extraDelay;\n  }\n}\n\nfunction isDataScheme(url) {\n  const ii = url.length;\n  let i = 0;\n  while (i < ii && url[i].trim() === \"\") {\n    i++;\n  }\n  return url.substring(i, i + 5).toLowerCase() === \"data:\";\n}\n\nfunction isPdfFile(filename) {\n  return typeof filename === \"string\" && /\\.pdf$/i.test(filename);\n}\n\n/**\n * Gets the filename from a given URL.\n * @param {string} url\n * @returns {string}\n */\nfunction getFilenameFromUrl(url) {\n  [url] = url.split(/[#?]/, 1);\n  return url.substring(url.lastIndexOf(\"/\") + 1);\n}\n\n/**\n * Returns the filename or guessed filename from the url (see issue 3455).\n * @param {string} url - The original PDF location.\n * @param {string} defaultFilename - The value returned if the filename is\n *   unknown, or the protocol is unsupported.\n * @returns {string} Guessed PDF filename.\n */\nfunction getPdfFilenameFromUrl(url, defaultFilename = \"document.pdf\") {\n  if (typeof url !== \"string\") {\n    return defaultFilename;\n  }\n  if (isDataScheme(url)) {\n    warn('getPdfFilenameFromUrl: ignore \"data:\"-URL for performance reasons.');\n    return defaultFilename;\n  }\n  const reURI = /^(?:(?:[^:]+:)?\\/\\/[^/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n  //              SCHEME        HOST        1.PATH  2.QUERY   3.REF\n  // Pattern to get last matching NAME.pdf\n  const reFilename = /[^/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n  const splitURI = reURI.exec(url);\n  let suggestedFilename =\n    reFilename.exec(splitURI[1]) ||\n    reFilename.exec(splitURI[2]) ||\n    reFilename.exec(splitURI[3]);\n  if (suggestedFilename) {\n    suggestedFilename = suggestedFilename[0];\n    if (suggestedFilename.includes(\"%\")) {\n      // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf\n      try {\n        suggestedFilename = reFilename.exec(\n          decodeURIComponent(suggestedFilename)\n        )[0];\n      } catch {\n        // Possible (extremely rare) errors:\n        // URIError \"Malformed URI\", e.g. for \"%AA.pdf\"\n        // TypeError \"null has no properties\", e.g. for \"%2F.pdf\"\n      }\n    }\n  }\n  return suggestedFilename || defaultFilename;\n}\n\nclass StatTimer {\n  started = Object.create(null);\n\n  times = [];\n\n  time(name) {\n    if (name in this.started) {\n      warn(`Timer is already running for ${name}`);\n    }\n    this.started[name] = Date.now();\n  }\n\n  timeEnd(name) {\n    if (!(name in this.started)) {\n      warn(`Timer has not been started for ${name}`);\n    }\n    this.times.push({\n      name,\n      start: this.started[name],\n      end: Date.now(),\n    });\n    // Remove timer from started so it can be called again.\n    delete this.started[name];\n  }\n\n  toString() {\n    // Find the longest name for padding purposes.\n    const outBuf = [];\n    let longest = 0;\n    for (const { name } of this.times) {\n      longest = Math.max(name.length, longest);\n    }\n    for (const { name, start, end } of this.times) {\n      outBuf.push(`${name.padEnd(longest)} ${end - start}ms\\n`);\n    }\n    return outBuf.join(\"\");\n  }\n}\n\nfunction isValidFetchUrl(url, baseUrl) {\n  if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n    throw new Error(\"Not implemented: isValidFetchUrl\");\n  }\n  try {\n    const { protocol } = baseUrl ? new URL(url, baseUrl) : new URL(url);\n    // The Fetch API only supports the http/https protocols, and not file/ftp.\n    return protocol === \"http:\" || protocol === \"https:\";\n  } catch {\n    return false; // `new URL()` will throw on incorrect data.\n  }\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenu(e) {\n  e.preventDefault();\n}\n\nfunction stopEvent(e) {\n  e.preventDefault();\n  e.stopPropagation();\n}\n\n// Deprecated API function -- display regardless of the `verbosity` setting.\nfunction deprecated(details) {\n  // eslint-disable-next-line no-console\n  console.log(\"Deprecated API usage: \" + details);\n}\n\nclass PDFDateString {\n  static #regex;\n\n  /**\n   * Convert a PDF date string to a JavaScript `Date` object.\n   *\n   * The PDF date string format is described in section 7.9.4 of the official\n   * PDF 32000-1:2008 specification. However, in the PDF 1.7 reference (sixth\n   * edition) Adobe describes the same format including a trailing apostrophe.\n   * This syntax in incorrect, but Adobe Acrobat creates PDF files that contain\n   * them. We ignore all apostrophes as they are not necessary for date parsing.\n   *\n   * Moreover, Adobe Acrobat doesn't handle changing the date to universal time\n   * and doesn't use the user's time zone (effectively ignoring the HH' and mm'\n   * parts of the date string).\n   *\n   * @param {string} input\n   * @returns {Date|null}\n   */\n  static toDateObject(input) {\n    if (!input || typeof input !== \"string\") {\n      return null;\n    }\n\n    // Lazily initialize the regular expression.\n    this.#regex ||= new RegExp(\n      \"^D:\" + // Prefix (required)\n        \"(\\\\d{4})\" + // Year (required)\n        \"(\\\\d{2})?\" + // Month (optional)\n        \"(\\\\d{2})?\" + // Day (optional)\n        \"(\\\\d{2})?\" + // Hour (optional)\n        \"(\\\\d{2})?\" + // Minute (optional)\n        \"(\\\\d{2})?\" + // Second (optional)\n        \"([Z|+|-])?\" + // Universal time relation (optional)\n        \"(\\\\d{2})?\" + // Offset hour (optional)\n        \"'?\" + // Splitting apostrophe (optional)\n        \"(\\\\d{2})?\" + // Offset minute (optional)\n        \"'?\" // Trailing apostrophe (optional)\n    );\n\n    // Optional fields that don't satisfy the requirements from the regular\n    // expression (such as incorrect digit counts or numbers that are out of\n    // range) will fall back the defaults from the specification.\n    const matches = this.#regex.exec(input);\n    if (!matches) {\n      return null;\n    }\n\n    // JavaScript's `Date` object expects the month to be between 0 and 11\n    // instead of 1 and 12, so we have to correct for that.\n    const year = parseInt(matches[1], 10);\n    let month = parseInt(matches[2], 10);\n    month = month >= 1 && month <= 12 ? month - 1 : 0;\n    let day = parseInt(matches[3], 10);\n    day = day >= 1 && day <= 31 ? day : 1;\n    let hour = parseInt(matches[4], 10);\n    hour = hour >= 0 && hour <= 23 ? hour : 0;\n    let minute = parseInt(matches[5], 10);\n    minute = minute >= 0 && minute <= 59 ? minute : 0;\n    let second = parseInt(matches[6], 10);\n    second = second >= 0 && second <= 59 ? second : 0;\n    const universalTimeRelation = matches[7] || \"Z\";\n    let offsetHour = parseInt(matches[8], 10);\n    offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;\n    let offsetMinute = parseInt(matches[9], 10) || 0;\n    offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;\n\n    // Universal time relation 'Z' means that the local time is equal to the\n    // universal time, whereas the relations '+'/'-' indicate that the local\n    // time is later respectively earlier than the universal time. Every date\n    // is normalized to universal time.\n    if (universalTimeRelation === \"-\") {\n      hour += offsetHour;\n      minute += offsetMinute;\n    } else if (universalTimeRelation === \"+\") {\n      hour -= offsetHour;\n      minute -= offsetMinute;\n    }\n\n    return new Date(Date.UTC(year, month, day, hour, minute, second));\n  }\n}\n\n/**\n * NOTE: This is (mostly) intended to support printing of XFA forms.\n */\nfunction getXfaPageViewport(xfaPage, { scale = 1, rotation = 0 }) {\n  const { width, height } = xfaPage.attributes.style;\n  const viewBox = [0, 0, parseInt(width), parseInt(height)];\n\n  return new PageViewport({\n    viewBox,\n    userUnit: 1,\n    scale,\n    rotation,\n  });\n}\n\nfunction getRGB(color) {\n  if (color.startsWith(\"#\")) {\n    const colorRGB = parseInt(color.slice(1), 16);\n    return [\n      (colorRGB & 0xff0000) >> 16,\n      (colorRGB & 0x00ff00) >> 8,\n      colorRGB & 0x0000ff,\n    ];\n  }\n\n  if (color.startsWith(\"rgb(\")) {\n    // getComputedStyle(...).color returns a `rgb(R, G, B)` color.\n    return color\n      .slice(/* \"rgb(\".length */ 4, -1) // Strip out \"rgb(\" and \")\".\n      .split(\",\")\n      .map(x => parseInt(x));\n  }\n\n  if (color.startsWith(\"rgba(\")) {\n    return color\n      .slice(/* \"rgba(\".length */ 5, -1) // Strip out \"rgba(\" and \")\".\n      .split(\",\")\n      .map(x => parseInt(x))\n      .slice(0, 3);\n  }\n\n  warn(`Not a valid color format: \"${color}\"`);\n  return [0, 0, 0];\n}\n\nfunction getColorValues(colors) {\n  const span = document.createElement(\"span\");\n  span.style.visibility = \"hidden\";\n  document.body.append(span);\n  for (const name of colors.keys()) {\n    span.style.color = name;\n    const computedColor = window.getComputedStyle(span).color;\n    colors.set(name, getRGB(computedColor));\n  }\n  span.remove();\n}\n\nfunction getCurrentTransform(ctx) {\n  const { a, b, c, d, e, f } = ctx.getTransform();\n  return [a, b, c, d, e, f];\n}\n\nfunction getCurrentTransformInverse(ctx) {\n  const { a, b, c, d, e, f } = ctx.getTransform().invertSelf();\n  return [a, b, c, d, e, f];\n}\n\n/**\n * @param {HTMLDivElement} div\n * @param {PageViewport} viewport\n * @param {boolean} mustFlip\n * @param {boolean} mustRotate\n */\nfunction setLayerDimensions(\n  div,\n  viewport,\n  mustFlip = false,\n  mustRotate = true\n) {\n  if (viewport instanceof PageViewport) {\n    const { pageWidth, pageHeight } = viewport.rawDims;\n    const { style } = div;\n    const useRound = FeatureTest.isCSSRoundSupported;\n\n    const w = `var(--scale-factor) * ${pageWidth}px`,\n      h = `var(--scale-factor) * ${pageHeight}px`;\n    const widthStr = useRound\n        ? `round(down, ${w}, var(--scale-round-x, 1px))`\n        : `calc(${w})`,\n      heightStr = useRound\n        ? `round(down, ${h}, var(--scale-round-y, 1px))`\n        : `calc(${h})`;\n\n    if (!mustFlip || viewport.rotation % 180 === 0) {\n      style.width = widthStr;\n      style.height = heightStr;\n    } else {\n      style.width = heightStr;\n      style.height = widthStr;\n    }\n  }\n\n  if (mustRotate) {\n    div.setAttribute(\"data-main-rotation\", viewport.rotation);\n  }\n}\n\n/**\n * Scale factors for the canvas, necessary with HiDPI displays.\n */\nclass OutputScale {\n  constructor() {\n    const pixelRatio = window.devicePixelRatio || 1;\n\n    /**\n     * @type {number} Horizontal scale.\n     */\n    this.sx = pixelRatio;\n\n    /**\n     * @type {number} Vertical scale.\n     */\n    this.sy = pixelRatio;\n  }\n\n  /**\n   * @type {boolean} Returns `true` when scaling is required, `false` otherwise.\n   */\n  get scaled() {\n    return this.sx !== 1 || this.sy !== 1;\n  }\n\n  get symmetric() {\n    return this.sx === this.sy;\n  }\n}\n\nexport {\n  deprecated,\n  fetchData,\n  getColorValues,\n  getCurrentTransform,\n  getCurrentTransformInverse,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getRGB,\n  getXfaPageViewport,\n  isDataScheme,\n  isPdfFile,\n  isValidFetchUrl,\n  noContextMenu,\n  OutputScale,\n  PageViewport,\n  PDFDateString,\n  PixelsPerInch,\n  RenderingCancelledException,\n  setLayerDimensions,\n  StatTimer,\n  stopEvent,\n  SVG_NS,\n};\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\n\nclass EditorToolbar {\n  #toolbar = null;\n\n  #colorPicker = null;\n\n  #editor;\n\n  #buttons = null;\n\n  #altText = null;\n\n  static #l10nRemove = null;\n\n  constructor(editor) {\n    this.#editor = editor;\n\n    EditorToolbar.#l10nRemove ||= Object.freeze({\n      freetext: \"pdfjs-editor-remove-freetext-button\",\n      highlight: \"pdfjs-editor-remove-highlight-button\",\n      ink: \"pdfjs-editor-remove-ink-button\",\n      stamp: \"pdfjs-editor-remove-stamp-button\",\n    });\n  }\n\n  render() {\n    const editToolbar = (this.#toolbar = document.createElement(\"div\"));\n    editToolbar.classList.add(\"editToolbar\", \"hidden\");\n    editToolbar.setAttribute(\"role\", \"toolbar\");\n    const signal = this.#editor._uiManager._signal;\n    editToolbar.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    editToolbar.addEventListener(\"pointerdown\", EditorToolbar.#pointerDown, {\n      signal,\n    });\n\n    const buttons = (this.#buttons = document.createElement(\"div\"));\n    buttons.className = \"buttons\";\n    editToolbar.append(buttons);\n\n    const position = this.#editor.toolbarPosition;\n    if (position) {\n      const { style } = editToolbar;\n      const x =\n        this.#editor._uiManager.direction === \"ltr\"\n          ? 1 - position[0]\n          : position[0];\n      style.insetInlineEnd = `${100 * x}%`;\n      style.top = `calc(${\n        100 * position[1]\n      }% + var(--editor-toolbar-vert-offset))`;\n    }\n\n    this.#addDeleteButton();\n\n    return editToolbar;\n  }\n\n  get div() {\n    return this.#toolbar;\n  }\n\n  static #pointerDown(e) {\n    e.stopPropagation();\n  }\n\n  #focusIn(e) {\n    this.#editor._focusEventsAllowed = false;\n    stopEvent(e);\n  }\n\n  #focusOut(e) {\n    this.#editor._focusEventsAllowed = true;\n    stopEvent(e);\n  }\n\n  #addListenersToElement(element) {\n    // If we're clicking on a button with the keyboard or with\n    // the mouse, we don't want to trigger any focus events on\n    // the editor.\n    const signal = this.#editor._uiManager._signal;\n    element.addEventListener(\"focusin\", this.#focusIn.bind(this), {\n      capture: true,\n      signal,\n    });\n    element.addEventListener(\"focusout\", this.#focusOut.bind(this), {\n      capture: true,\n      signal,\n    });\n    element.addEventListener(\"contextmenu\", noContextMenu, { signal });\n  }\n\n  hide() {\n    this.#toolbar.classList.add(\"hidden\");\n    this.#colorPicker?.hideDropdown();\n  }\n\n  show() {\n    this.#toolbar.classList.remove(\"hidden\");\n    this.#altText?.shown();\n  }\n\n  #addDeleteButton() {\n    const { editorType, _uiManager } = this.#editor;\n\n    const button = document.createElement(\"button\");\n    button.className = \"delete\";\n    button.tabIndex = 0;\n    button.setAttribute(\"data-l10n-id\", EditorToolbar.#l10nRemove[editorType]);\n    this.#addListenersToElement(button);\n    button.addEventListener(\n      \"click\",\n      e => {\n        _uiManager.delete();\n      },\n      { signal: _uiManager._signal }\n    );\n    this.#buttons.append(button);\n  }\n\n  get #divider() {\n    const divider = document.createElement(\"div\");\n    divider.className = \"divider\";\n    return divider;\n  }\n\n  async addAltText(altText) {\n    const button = await altText.render();\n    this.#addListenersToElement(button);\n    this.#buttons.prepend(button, this.#divider);\n    this.#altText = altText;\n  }\n\n  addColorPicker(colorPicker) {\n    this.#colorPicker = colorPicker;\n    const button = colorPicker.renderButton();\n    this.#addListenersToElement(button);\n    this.#buttons.prepend(button, this.#divider);\n  }\n\n  remove() {\n    this.#toolbar.remove();\n    this.#colorPicker?.destroy();\n    this.#colorPicker = null;\n  }\n}\n\nclass HighlightToolbar {\n  #buttons = null;\n\n  #toolbar = null;\n\n  #uiManager;\n\n  constructor(uiManager) {\n    this.#uiManager = uiManager;\n  }\n\n  #render() {\n    const editToolbar = (this.#toolbar = document.createElement(\"div\"));\n    editToolbar.className = \"editToolbar\";\n    editToolbar.setAttribute(\"role\", \"toolbar\");\n    editToolbar.addEventListener(\"contextmenu\", noContextMenu, {\n      signal: this.#uiManager._signal,\n    });\n\n    const buttons = (this.#buttons = document.createElement(\"div\"));\n    buttons.className = \"buttons\";\n    editToolbar.append(buttons);\n\n    this.#addHighlightButton();\n\n    return editToolbar;\n  }\n\n  #getLastPoint(boxes, isLTR) {\n    let lastY = 0;\n    let lastX = 0;\n    for (const box of boxes) {\n      const y = box.y + box.height;\n      if (y < lastY) {\n        continue;\n      }\n      const x = box.x + (isLTR ? box.width : 0);\n      if (y > lastY) {\n        lastX = x;\n        lastY = y;\n        continue;\n      }\n      if (isLTR) {\n        if (x > lastX) {\n          lastX = x;\n        }\n      } else if (x < lastX) {\n        lastX = x;\n      }\n    }\n    return [isLTR ? 1 - lastX : lastX, lastY];\n  }\n\n  show(parent, boxes, isLTR) {\n    const [x, y] = this.#getLastPoint(boxes, isLTR);\n    const { style } = (this.#toolbar ||= this.#render());\n    parent.append(this.#toolbar);\n    style.insetInlineEnd = `${100 * x}%`;\n    style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`;\n  }\n\n  hide() {\n    this.#toolbar.remove();\n  }\n\n  #addHighlightButton() {\n    const button = document.createElement(\"button\");\n    button.className = \"highlightButton\";\n    button.tabIndex = 0;\n    button.setAttribute(\"data-l10n-id\", `pdfjs-highlight-floating-button1`);\n    const span = document.createElement(\"span\");\n    button.append(span);\n    span.className = \"visuallyHidden\";\n    span.setAttribute(\"data-l10n-id\", \"pdfjs-highlight-floating-button-label\");\n    const signal = this.#uiManager._signal;\n    button.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    button.addEventListener(\n      \"click\",\n      () => {\n        this.#uiManager.highlightSelection(\"floating_button\");\n      },\n      { signal }\n    );\n    this.#buttons.append(button);\n  }\n}\n\nexport { EditorToolbar, HighlightToolbar };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./editor.js\").AnnotationEditor} AnnotationEditor */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n  AnnotationEditorParamsType,\n  AnnotationEditorPrefix,\n  AnnotationEditorType,\n  FeatureTest,\n  getUuid,\n  shadow,\n  Util,\n  warn,\n} from \"../../shared/util.js\";\nimport {\n  fetchData,\n  getColorValues,\n  getRGB,\n  PixelsPerInch,\n  stopEvent,\n} from \"../display_utils.js\";\nimport { HighlightToolbar } from \"./toolbar.js\";\n\nfunction bindEvents(obj, element, names) {\n  for (const name of names) {\n    element.addEventListener(name, obj[name].bind(obj));\n  }\n}\n\n/**\n * Convert a number between 0 and 100 into an hex number between 0 and 255.\n * @param {number} opacity\n * @return {string}\n */\nfunction opacityToHex(opacity) {\n  return Math.round(Math.min(255, Math.max(1, 255 * opacity)))\n    .toString(16)\n    .padStart(2, \"0\");\n}\n\n/**\n * Class to create some unique ids for the different editors.\n */\nclass IdManager {\n  #id = 0;\n\n  constructor() {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      Object.defineProperty(this, \"reset\", {\n        value: () => (this.#id = 0),\n      });\n    }\n  }\n\n  /**\n   * Get a unique id.\n   * @returns {string}\n   */\n  get id() {\n    return `${AnnotationEditorPrefix}${this.#id++}`;\n  }\n}\n\n/**\n * Class to manage the images used by the editors.\n * The main idea is to try to minimize the memory used by the images.\n * The images are cached and reused when possible\n * We use a refCounter to know when an image is not used anymore but we need to\n * be able to restore an image after a remove+undo, so we keep a file reference\n * or an url one.\n */\nclass ImageManager {\n  #baseId = getUuid();\n\n  #id = 0;\n\n  #cache = null;\n\n  static get _isSVGFittingCanvas() {\n    // By default, Firefox doesn't rescale without preserving the aspect ratio\n    // when drawing an SVG image on a canvas, see https://bugzilla.mozilla.org/1547776.\n    // The \"workaround\" is to append \"svgView(preserveAspectRatio(none))\" to the\n    // url, but according to comment #15, it seems that it leads to unexpected\n    // behavior in Safari.\n    const svg = `data:image/svg+xml;charset=UTF-8,<svg viewBox=\"0 0 1 1\" width=\"1\" height=\"1\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"1\" height=\"1\" style=\"fill:red;\"/></svg>`;\n    const canvas = new OffscreenCanvas(1, 3);\n    const ctx = canvas.getContext(\"2d\", { willReadFrequently: true });\n    const image = new Image();\n    image.src = svg;\n    const promise = image.decode().then(() => {\n      ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3);\n      return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0;\n    });\n\n    return shadow(this, \"_isSVGFittingCanvas\", promise);\n  }\n\n  async #get(key, rawData) {\n    this.#cache ||= new Map();\n    let data = this.#cache.get(key);\n    if (data === null) {\n      // We already tried to load the image but it failed.\n      return null;\n    }\n    if (data?.bitmap) {\n      data.refCounter += 1;\n      return data;\n    }\n    try {\n      data ||= {\n        bitmap: null,\n        id: `image_${this.#baseId}_${this.#id++}`,\n        refCounter: 0,\n        isSvg: false,\n      };\n      let image;\n      if (typeof rawData === \"string\") {\n        data.url = rawData;\n        image = await fetchData(rawData, \"blob\");\n      } else if (rawData instanceof File) {\n        image = data.file = rawData;\n      } else if (rawData instanceof Blob) {\n        image = rawData;\n      }\n\n      if (image.type === \"image/svg+xml\") {\n        // Unfortunately, createImageBitmap doesn't work with SVG images.\n        // (see https://bugzilla.mozilla.org/1841972).\n        const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas;\n        const fileReader = new FileReader();\n        const imageElement = new Image();\n        const imagePromise = new Promise((resolve, reject) => {\n          imageElement.onload = () => {\n            data.bitmap = imageElement;\n            data.isSvg = true;\n            resolve();\n          };\n          fileReader.onload = async () => {\n            const url = (data.svgUrl = fileReader.result);\n            // We need to set the preserveAspectRatio to none in order to let\n            // the image fits the canvas when resizing.\n            imageElement.src = (await mustRemoveAspectRatioPromise)\n              ? `${url}#svgView(preserveAspectRatio(none))`\n              : url;\n          };\n          imageElement.onerror = fileReader.onerror = reject;\n        });\n        fileReader.readAsDataURL(image);\n        await imagePromise;\n      } else {\n        data.bitmap = await createImageBitmap(image);\n      }\n      data.refCounter = 1;\n    } catch (e) {\n      warn(e);\n      data = null;\n    }\n    this.#cache.set(key, data);\n    if (data) {\n      this.#cache.set(data.id, data);\n    }\n    return data;\n  }\n\n  async getFromFile(file) {\n    const { lastModified, name, size, type } = file;\n    return this.#get(`${lastModified}_${name}_${size}_${type}`, file);\n  }\n\n  async getFromUrl(url) {\n    return this.#get(url, url);\n  }\n\n  async getFromBlob(id, blobPromise) {\n    const blob = await blobPromise;\n    return this.#get(id, blob);\n  }\n\n  async getFromId(id) {\n    this.#cache ||= new Map();\n    const data = this.#cache.get(id);\n    if (!data) {\n      return null;\n    }\n    if (data.bitmap) {\n      data.refCounter += 1;\n      return data;\n    }\n\n    if (data.file) {\n      return this.getFromFile(data.file);\n    }\n    if (data.blobPromise) {\n      const { blobPromise } = data;\n      delete data.blobPromise;\n      return this.getFromBlob(data.id, blobPromise);\n    }\n    return this.getFromUrl(data.url);\n  }\n\n  getFromCanvas(id, canvas) {\n    this.#cache ||= new Map();\n    let data = this.#cache.get(id);\n    if (data?.bitmap) {\n      data.refCounter += 1;\n      return data;\n    }\n    const offscreen = new OffscreenCanvas(canvas.width, canvas.height);\n    const ctx = offscreen.getContext(\"2d\");\n    ctx.drawImage(canvas, 0, 0);\n    data = {\n      bitmap: offscreen.transferToImageBitmap(),\n      id: `image_${this.#baseId}_${this.#id++}`,\n      refCounter: 1,\n      isSvg: false,\n    };\n    this.#cache.set(id, data);\n    this.#cache.set(data.id, data);\n    return data;\n  }\n\n  getSvgUrl(id) {\n    const data = this.#cache.get(id);\n    if (!data?.isSvg) {\n      return null;\n    }\n    return data.svgUrl;\n  }\n\n  deleteId(id) {\n    this.#cache ||= new Map();\n    const data = this.#cache.get(id);\n    if (!data) {\n      return;\n    }\n    data.refCounter -= 1;\n    if (data.refCounter !== 0) {\n      return;\n    }\n    const { bitmap } = data;\n    if (!data.url && !data.file) {\n      // The image has no way to be restored (ctrl+z) so we must fix that.\n      const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n      const ctx = canvas.getContext(\"bitmaprenderer\");\n      ctx.transferFromImageBitmap(bitmap);\n      data.blobPromise = canvas.convertToBlob();\n    }\n\n    bitmap.close?.();\n    data.bitmap = null;\n  }\n\n  // We can use the id only if it belongs this manager.\n  // We must take care of having the right manager because we can copy/paste\n  // some images from other documents, hence it'd be a pity to use an id from an\n  // other manager.\n  isValidId(id) {\n    return id.startsWith(`image_${this.#baseId}_`);\n  }\n}\n\n/**\n * Class to handle undo/redo.\n * Commands are just saved in a buffer.\n * If we hit some memory issues we could likely use a circular buffer.\n * It has to be used as a singleton.\n */\nclass CommandManager {\n  #commands = [];\n\n  #locked = false;\n\n  #maxSize;\n\n  #position = -1;\n\n  constructor(maxSize = 128) {\n    this.#maxSize = maxSize;\n  }\n\n  /**\n   * @typedef {Object} addOptions\n   * @property {function} cmd\n   * @property {function} undo\n   * @property {function} [post]\n   * @property {boolean} mustExec\n   * @property {number} type\n   * @property {boolean} overwriteIfSameType\n   * @property {boolean} keepUndo\n   */\n\n  /**\n   * Add a new couple of commands to be used in case of redo/undo.\n   * @param {addOptions} options\n   */\n  add({\n    cmd,\n    undo,\n    post,\n    mustExec,\n    type = NaN,\n    overwriteIfSameType = false,\n    keepUndo = false,\n  }) {\n    if (mustExec) {\n      cmd();\n    }\n\n    if (this.#locked) {\n      return;\n    }\n\n    const save = { cmd, undo, post, type };\n    if (this.#position === -1) {\n      if (this.#commands.length > 0) {\n        // All the commands have been undone and then a new one is added\n        // hence we clear the queue.\n        this.#commands.length = 0;\n      }\n      this.#position = 0;\n      this.#commands.push(save);\n      return;\n    }\n\n    if (overwriteIfSameType && this.#commands[this.#position].type === type) {\n      // For example when we change a color we don't want to\n      // be able to undo all the steps, hence we only want to\n      // keep the last undoable action in this sequence of actions.\n      if (keepUndo) {\n        save.undo = this.#commands[this.#position].undo;\n      }\n      this.#commands[this.#position] = save;\n      return;\n    }\n\n    const next = this.#position + 1;\n    if (next === this.#maxSize) {\n      this.#commands.splice(0, 1);\n    } else {\n      this.#position = next;\n      if (next < this.#commands.length) {\n        this.#commands.splice(next);\n      }\n    }\n\n    this.#commands.push(save);\n  }\n\n  /**\n   * Undo the last command.\n   */\n  undo() {\n    if (this.#position === -1) {\n      // Nothing to undo.\n      return;\n    }\n\n    // Avoid to insert something during the undo execution.\n    this.#locked = true;\n    const { undo, post } = this.#commands[this.#position];\n    undo();\n    post?.();\n    this.#locked = false;\n\n    this.#position -= 1;\n  }\n\n  /**\n   * Redo the last command.\n   */\n  redo() {\n    if (this.#position < this.#commands.length - 1) {\n      this.#position += 1;\n\n      // Avoid to insert something during the redo execution.\n      this.#locked = true;\n      const { cmd, post } = this.#commands[this.#position];\n      cmd();\n      post?.();\n      this.#locked = false;\n    }\n  }\n\n  /**\n   * Check if there is something to undo.\n   * @returns {boolean}\n   */\n  hasSomethingToUndo() {\n    return this.#position !== -1;\n  }\n\n  /**\n   * Check if there is something to redo.\n   * @returns {boolean}\n   */\n  hasSomethingToRedo() {\n    return this.#position < this.#commands.length - 1;\n  }\n\n  cleanType(type) {\n    if (this.#position === -1) {\n      return;\n    }\n    for (let i = this.#position; i >= 0; i--) {\n      if (this.#commands[i].type !== type) {\n        this.#commands.splice(i + 1, this.#position - i);\n        this.#position = i;\n        return;\n      }\n    }\n    this.#commands.length = 0;\n    this.#position = -1;\n  }\n\n  destroy() {\n    this.#commands = null;\n  }\n}\n\n/**\n * Class to handle the different keyboards shortcuts we can have on mac or\n * non-mac OSes.\n */\nclass KeyboardManager {\n  /**\n   * Create a new keyboard manager class.\n   * @param {Array<Array>} callbacks - an array containing an array of shortcuts\n   * and a callback to call.\n   * A shortcut is a string like `ctrl+c` or `mac+ctrl+c` for mac OS.\n   */\n  constructor(callbacks) {\n    this.buffer = [];\n    this.callbacks = new Map();\n    this.allKeys = new Set();\n\n    const { isMac } = FeatureTest.platform;\n    for (const [keys, callback, options = {}] of callbacks) {\n      for (const key of keys) {\n        const isMacKey = key.startsWith(\"mac+\");\n        if (isMac && isMacKey) {\n          this.callbacks.set(key.slice(4), { callback, options });\n          this.allKeys.add(key.split(\"+\").at(-1));\n        } else if (!isMac && !isMacKey) {\n          this.callbacks.set(key, { callback, options });\n          this.allKeys.add(key.split(\"+\").at(-1));\n        }\n      }\n    }\n  }\n\n  /**\n   * Serialize an event into a string in order to match a\n   * potential key for a callback.\n   * @param {KeyboardEvent} event\n   * @returns {string}\n   */\n  #serialize(event) {\n    if (event.altKey) {\n      this.buffer.push(\"alt\");\n    }\n    if (event.ctrlKey) {\n      this.buffer.push(\"ctrl\");\n    }\n    if (event.metaKey) {\n      this.buffer.push(\"meta\");\n    }\n    if (event.shiftKey) {\n      this.buffer.push(\"shift\");\n    }\n    this.buffer.push(event.key);\n    const str = this.buffer.join(\"+\");\n    this.buffer.length = 0;\n\n    return str;\n  }\n\n  /**\n   * Execute a callback, if any, for a given keyboard event.\n   * The self is used as `this` in the callback.\n   * @param {Object} self\n   * @param {KeyboardEvent} event\n   * @returns\n   */\n  exec(self, event) {\n    if (!this.allKeys.has(event.key)) {\n      return;\n    }\n    const info = this.callbacks.get(this.#serialize(event));\n    if (!info) {\n      return;\n    }\n    const {\n      callback,\n      options: { bubbles = false, args = [], checker = null },\n    } = info;\n\n    if (checker && !checker(self, event)) {\n      return;\n    }\n    callback.bind(self, ...args, event)();\n\n    // For example, ctrl+s in a FreeText must be handled by the viewer, hence\n    // the event must bubble.\n    if (!bubbles) {\n      stopEvent(event);\n    }\n  }\n}\n\nclass ColorManager {\n  static _colorsMapping = new Map([\n    [\"CanvasText\", [0, 0, 0]],\n    [\"Canvas\", [255, 255, 255]],\n  ]);\n\n  get _colors() {\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"LIB\") &&\n      typeof document === \"undefined\"\n    ) {\n      return shadow(this, \"_colors\", ColorManager._colorsMapping);\n    }\n\n    const colors = new Map([\n      [\"CanvasText\", null],\n      [\"Canvas\", null],\n    ]);\n    getColorValues(colors);\n    return shadow(this, \"_colors\", colors);\n  }\n\n  /**\n   * In High Contrast Mode, the color on the screen is not always the\n   * real color used in the pdf.\n   * For example in some cases white can appear to be black but when saving\n   * we want to have white.\n   * @param {string} color\n   * @returns {Array<number>}\n   */\n  convert(color) {\n    const rgb = getRGB(color);\n    if (!window.matchMedia(\"(forced-colors: active)\").matches) {\n      return rgb;\n    }\n\n    for (const [name, RGB] of this._colors) {\n      if (RGB.every((x, i) => x === rgb[i])) {\n        return ColorManager._colorsMapping.get(name);\n      }\n    }\n    return rgb;\n  }\n\n  /**\n   * An input element must have its color value as a hex string\n   * and not as color name.\n   * So this function converts a name into an hex string.\n   * @param {string} name\n   * @returns {string}\n   */\n  getHexCode(name) {\n    const rgb = this._colors.get(name);\n    if (!rgb) {\n      return name;\n    }\n    return Util.makeHexColor(...rgb);\n  }\n}\n\n/**\n * A pdf has several pages and each of them when it will rendered\n * will have an AnnotationEditorLayer which will contain the some\n * new Annotations associated to an editor in order to modify them.\n *\n * This class is used to manage all the different layers, editors and\n * some action like copy/paste, undo/redo, ...\n */\nclass AnnotationEditorUIManager {\n  #abortController = new AbortController();\n\n  #activeEditor = null;\n\n  #allEditors = new Map();\n\n  #allLayers = new Map();\n\n  #altTextManager = null;\n\n  #annotationStorage = null;\n\n  #changedExistingAnnotations = null;\n\n  #commandManager = new CommandManager();\n\n  #copyPasteAC = null;\n\n  #currentDrawingSession = null;\n\n  #currentPageIndex = 0;\n\n  #deletedAnnotationsElementIds = new Set();\n\n  #draggingEditors = null;\n\n  #editorTypes = null;\n\n  #editorsToRescale = new Set();\n\n  _editorUndoBar = null;\n\n  #enableHighlightFloatingButton = false;\n\n  #enableUpdatedAddImage = false;\n\n  #enableNewAltTextWhenAddingImage = false;\n\n  #filterFactory = null;\n\n  #focusMainContainerTimeoutId = null;\n\n  #focusManagerAC = null;\n\n  #highlightColors = null;\n\n  #highlightWhenShiftUp = false;\n\n  #highlightToolbar = null;\n\n  #idManager = new IdManager();\n\n  #isEnabled = false;\n\n  #isWaiting = false;\n\n  #keyboardManagerAC = null;\n\n  #lastActiveElement = null;\n\n  #mainHighlightColorPicker = null;\n\n  #mlManager = null;\n\n  #mode = AnnotationEditorType.NONE;\n\n  #selectedEditors = new Set();\n\n  #selectedTextNode = null;\n\n  #pageColors = null;\n\n  #showAllStates = null;\n\n  #previousStates = {\n    isEditing: false,\n    isEmpty: true,\n    hasSomethingToUndo: false,\n    hasSomethingToRedo: false,\n    hasSelectedEditor: false,\n    hasSelectedText: false,\n  };\n\n  #translation = [0, 0];\n\n  #translationTimeoutId = null;\n\n  #container = null;\n\n  #viewer = null;\n\n  #updateModeCapability = null;\n\n  static TRANSLATE_SMALL = 1; // page units.\n\n  static TRANSLATE_BIG = 10; // page units.\n\n  static get _keyboardManager() {\n    const proto = AnnotationEditorUIManager.prototype;\n\n    /**\n     * If the focused element is an input, we don't want to handle the arrow.\n     * For example, sliders can be controlled with the arrow keys.\n     */\n    const arrowChecker = self =>\n      self.#container.contains(document.activeElement) &&\n      document.activeElement.tagName !== \"BUTTON\" &&\n      self.hasSomethingToControl();\n\n    const textInputChecker = (_self, { target: el }) => {\n      if (el instanceof HTMLInputElement) {\n        const { type } = el;\n        return type !== \"text\" && type !== \"number\";\n      }\n      return true;\n    };\n\n    const small = this.TRANSLATE_SMALL;\n    const big = this.TRANSLATE_BIG;\n\n    return shadow(\n      this,\n      \"_keyboardManager\",\n      new KeyboardManager([\n        [\n          [\"ctrl+a\", \"mac+meta+a\"],\n          proto.selectAll,\n          { checker: textInputChecker },\n        ],\n        [[\"ctrl+z\", \"mac+meta+z\"], proto.undo, { checker: textInputChecker }],\n        [\n          // On mac, depending of the OS version, the event.key is either \"z\" or\n          // \"Z\" when the user presses \"meta+shift+z\".\n          [\n            \"ctrl+y\",\n            \"ctrl+shift+z\",\n            \"mac+meta+shift+z\",\n            \"ctrl+shift+Z\",\n            \"mac+meta+shift+Z\",\n          ],\n          proto.redo,\n          { checker: textInputChecker },\n        ],\n        [\n          [\n            \"Backspace\",\n            \"alt+Backspace\",\n            \"ctrl+Backspace\",\n            \"shift+Backspace\",\n            \"mac+Backspace\",\n            \"mac+alt+Backspace\",\n            \"mac+ctrl+Backspace\",\n            \"Delete\",\n            \"ctrl+Delete\",\n            \"shift+Delete\",\n            \"mac+Delete\",\n          ],\n          proto.delete,\n          { checker: textInputChecker },\n        ],\n        [\n          [\"Enter\", \"mac+Enter\"],\n          proto.addNewEditorFromKeyboard,\n          {\n            // Those shortcuts can be used in the toolbar for some other actions\n            // like zooming, hence we need to check if the container has the\n            // focus.\n            checker: (self, { target: el }) =>\n              !(el instanceof HTMLButtonElement) &&\n              self.#container.contains(el) &&\n              !self.isEnterHandled,\n          },\n        ],\n        [\n          [\" \", \"mac+ \"],\n          proto.addNewEditorFromKeyboard,\n          {\n            // Those shortcuts can be used in the toolbar for some other actions\n            // like zooming, hence we need to check if the container has the\n            // focus.\n            checker: (self, { target: el }) =>\n              !(el instanceof HTMLButtonElement) &&\n              self.#container.contains(document.activeElement),\n          },\n        ],\n        [[\"Escape\", \"mac+Escape\"], proto.unselectAll],\n        [\n          [\"ArrowLeft\", \"mac+ArrowLeft\"],\n          proto.translateSelectedEditors,\n          { args: [-small, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n          proto.translateSelectedEditors,\n          { args: [-big, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowRight\", \"mac+ArrowRight\"],\n          proto.translateSelectedEditors,\n          { args: [small, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n          proto.translateSelectedEditors,\n          { args: [big, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowUp\", \"mac+ArrowUp\"],\n          proto.translateSelectedEditors,\n          { args: [0, -small], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"],\n          proto.translateSelectedEditors,\n          { args: [0, -big], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowDown\", \"mac+ArrowDown\"],\n          proto.translateSelectedEditors,\n          { args: [0, small], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"],\n          proto.translateSelectedEditors,\n          { args: [0, big], checker: arrowChecker },\n        ],\n      ])\n    );\n  }\n\n  constructor(\n    container,\n    viewer,\n    altTextManager,\n    eventBus,\n    pdfDocument,\n    pageColors,\n    highlightColors,\n    enableHighlightFloatingButton,\n    enableUpdatedAddImage,\n    enableNewAltTextWhenAddingImage,\n    mlManager,\n    editorUndoBar,\n    supportsPinchToZoom\n  ) {\n    const signal = (this._signal = this.#abortController.signal);\n    this.#container = container;\n    this.#viewer = viewer;\n    this.#altTextManager = altTextManager;\n    this._eventBus = eventBus;\n    eventBus._on(\"editingaction\", this.onEditingAction.bind(this), { signal });\n    eventBus._on(\"pagechanging\", this.onPageChanging.bind(this), { signal });\n    eventBus._on(\"scalechanging\", this.onScaleChanging.bind(this), { signal });\n    eventBus._on(\"rotationchanging\", this.onRotationChanging.bind(this), {\n      signal,\n    });\n    eventBus._on(\"setpreference\", this.onSetPreference.bind(this), { signal });\n    eventBus._on(\n      \"switchannotationeditorparams\",\n      evt => this.updateParams(evt.type, evt.value),\n      { signal }\n    );\n    this.#addSelectionListener();\n    this.#addDragAndDropListeners();\n    this.#addKeyboardManager();\n    this.#annotationStorage = pdfDocument.annotationStorage;\n    this.#filterFactory = pdfDocument.filterFactory;\n    this.#pageColors = pageColors;\n    this.#highlightColors = highlightColors || null;\n    this.#enableHighlightFloatingButton = enableHighlightFloatingButton;\n    this.#enableUpdatedAddImage = enableUpdatedAddImage;\n    this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage;\n    this.#mlManager = mlManager || null;\n    this.viewParameters = {\n      realScale: PixelsPerInch.PDF_TO_CSS_UNITS,\n      rotation: 0,\n    };\n    this.isShiftKeyDown = false;\n    this._editorUndoBar = editorUndoBar || null;\n    this._supportsPinchToZoom = supportsPinchToZoom !== false;\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      Object.defineProperty(this, \"reset\", {\n        value: () => {\n          this.selectAll();\n          this.delete();\n          this.#idManager.reset();\n        },\n      });\n    }\n  }\n\n  destroy() {\n    this.#updateModeCapability?.resolve();\n    this.#updateModeCapability = null;\n\n    this.#abortController?.abort();\n    this.#abortController = null;\n    this._signal = null;\n\n    for (const layer of this.#allLayers.values()) {\n      layer.destroy();\n    }\n    this.#allLayers.clear();\n    this.#allEditors.clear();\n    this.#editorsToRescale.clear();\n    this.#activeEditor = null;\n    this.#selectedEditors.clear();\n    this.#commandManager.destroy();\n    this.#altTextManager?.destroy();\n    this.#highlightToolbar?.hide();\n    this.#highlightToolbar = null;\n    if (this.#focusMainContainerTimeoutId) {\n      clearTimeout(this.#focusMainContainerTimeoutId);\n      this.#focusMainContainerTimeoutId = null;\n    }\n    if (this.#translationTimeoutId) {\n      clearTimeout(this.#translationTimeoutId);\n      this.#translationTimeoutId = null;\n    }\n    this._editorUndoBar?.destroy();\n  }\n\n  combinedSignal(ac) {\n    return AbortSignal.any([this._signal, ac.signal]);\n  }\n\n  get mlManager() {\n    return this.#mlManager;\n  }\n\n  get useNewAltTextFlow() {\n    return this.#enableUpdatedAddImage;\n  }\n\n  get useNewAltTextWhenAddingImage() {\n    return this.#enableNewAltTextWhenAddingImage;\n  }\n\n  get hcmFilter() {\n    return shadow(\n      this,\n      \"hcmFilter\",\n      this.#pageColors\n        ? this.#filterFactory.addHCMFilter(\n            this.#pageColors.foreground,\n            this.#pageColors.background\n          )\n        : \"none\"\n    );\n  }\n\n  get direction() {\n    return shadow(\n      this,\n      \"direction\",\n      getComputedStyle(this.#container).direction\n    );\n  }\n\n  get highlightColors() {\n    return shadow(\n      this,\n      \"highlightColors\",\n      this.#highlightColors\n        ? new Map(\n            this.#highlightColors\n              .split(\",\")\n              .map(pair => pair.split(\"=\").map(x => x.trim()))\n          )\n        : null\n    );\n  }\n\n  get highlightColorNames() {\n    return shadow(\n      this,\n      \"highlightColorNames\",\n      this.highlightColors\n        ? new Map(Array.from(this.highlightColors, e => e.reverse()))\n        : null\n    );\n  }\n\n  /**\n   * Set the current drawing session.\n   * @param {AnnotationEditorLayer} layer\n   */\n  setCurrentDrawingSession(layer) {\n    if (layer) {\n      this.unselectAll();\n      this.disableUserSelect(true);\n    } else {\n      this.disableUserSelect(false);\n    }\n    this.#currentDrawingSession = layer;\n  }\n\n  setMainHighlightColorPicker(colorPicker) {\n    this.#mainHighlightColorPicker = colorPicker;\n  }\n\n  editAltText(editor, firstTime = false) {\n    this.#altTextManager?.editAltText(this, editor, firstTime);\n  }\n\n  switchToMode(mode, callback) {\n    // Switching to a mode can be asynchronous.\n    this._eventBus.on(\"annotationeditormodechanged\", callback, {\n      once: true,\n      signal: this._signal,\n    });\n    this._eventBus.dispatch(\"showannotationeditorui\", {\n      source: this,\n      mode,\n    });\n  }\n\n  setPreference(name, value) {\n    this._eventBus.dispatch(\"setpreference\", {\n      source: this,\n      name,\n      value,\n    });\n  }\n\n  onSetPreference({ name, value }) {\n    switch (name) {\n      case \"enableNewAltTextWhenAddingImage\":\n        this.#enableNewAltTextWhenAddingImage = value;\n        break;\n    }\n  }\n\n  onPageChanging({ pageNumber }) {\n    this.#currentPageIndex = pageNumber - 1;\n  }\n\n  focusMainContainer() {\n    this.#container.focus();\n  }\n\n  findParent(x, y) {\n    for (const layer of this.#allLayers.values()) {\n      const {\n        x: layerX,\n        y: layerY,\n        width,\n        height,\n      } = layer.div.getBoundingClientRect();\n      if (\n        x >= layerX &&\n        x <= layerX + width &&\n        y >= layerY &&\n        y <= layerY + height\n      ) {\n        return layer;\n      }\n    }\n    return null;\n  }\n\n  disableUserSelect(value = false) {\n    this.#viewer.classList.toggle(\"noUserSelect\", value);\n  }\n\n  addShouldRescale(editor) {\n    this.#editorsToRescale.add(editor);\n  }\n\n  removeShouldRescale(editor) {\n    this.#editorsToRescale.delete(editor);\n  }\n\n  onScaleChanging({ scale }) {\n    this.commitOrRemove();\n    this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS;\n    for (const editor of this.#editorsToRescale) {\n      editor.onScaleChanging();\n    }\n    this.#currentDrawingSession?.onScaleChanging();\n  }\n\n  onRotationChanging({ pagesRotation }) {\n    this.commitOrRemove();\n    this.viewParameters.rotation = pagesRotation;\n  }\n\n  #getAnchorElementForSelection({ anchorNode }) {\n    return anchorNode.nodeType === Node.TEXT_NODE\n      ? anchorNode.parentElement\n      : anchorNode;\n  }\n\n  #getLayerForTextLayer(textLayer) {\n    const { currentLayer } = this;\n    if (currentLayer.hasTextLayer(textLayer)) {\n      return currentLayer;\n    }\n    for (const layer of this.#allLayers.values()) {\n      if (layer.hasTextLayer(textLayer)) {\n        return layer;\n      }\n    }\n    return null;\n  }\n\n  highlightSelection(methodOfCreation = \"\") {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      return;\n    }\n    const { anchorNode, anchorOffset, focusNode, focusOffset } = selection;\n    const text = selection.toString();\n    const anchorElement = this.#getAnchorElementForSelection(selection);\n    const textLayer = anchorElement.closest(\".textLayer\");\n    const boxes = this.getSelectionBoxes(textLayer);\n    if (!boxes) {\n      return;\n    }\n    selection.empty();\n\n    const layer = this.#getLayerForTextLayer(textLayer);\n    const isNoneMode = this.#mode === AnnotationEditorType.NONE;\n    const callback = () => {\n      layer?.createAndAddNewEditor({ x: 0, y: 0 }, false, {\n        methodOfCreation,\n        boxes,\n        anchorNode,\n        anchorOffset,\n        focusNode,\n        focusOffset,\n        text,\n      });\n      if (isNoneMode) {\n        this.showAllEditors(\"highlight\", true, /* updateButton = */ true);\n      }\n    };\n    if (isNoneMode) {\n      this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback);\n      return;\n    }\n    callback();\n  }\n\n  #displayHighlightToolbar() {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      return;\n    }\n    const anchorElement = this.#getAnchorElementForSelection(selection);\n    const textLayer = anchorElement.closest(\".textLayer\");\n    const boxes = this.getSelectionBoxes(textLayer);\n    if (!boxes) {\n      return;\n    }\n    this.#highlightToolbar ||= new HighlightToolbar(this);\n    this.#highlightToolbar.show(textLayer, boxes, this.direction === \"ltr\");\n  }\n\n  /**\n   * Add an editor in the annotation storage.\n   * @param {AnnotationEditor} editor\n   */\n  addToAnnotationStorage(editor) {\n    if (\n      !editor.isEmpty() &&\n      this.#annotationStorage &&\n      !this.#annotationStorage.has(editor.id)\n    ) {\n      this.#annotationStorage.setValue(editor.id, editor);\n    }\n  }\n\n  #selectionChange() {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      if (this.#selectedTextNode) {\n        this.#highlightToolbar?.hide();\n        this.#selectedTextNode = null;\n        this.#dispatchUpdateStates({\n          hasSelectedText: false,\n        });\n      }\n      return;\n    }\n    const { anchorNode } = selection;\n    if (anchorNode === this.#selectedTextNode) {\n      return;\n    }\n\n    const anchorElement = this.#getAnchorElementForSelection(selection);\n    const textLayer = anchorElement.closest(\".textLayer\");\n    if (!textLayer) {\n      if (this.#selectedTextNode) {\n        this.#highlightToolbar?.hide();\n        this.#selectedTextNode = null;\n        this.#dispatchUpdateStates({\n          hasSelectedText: false,\n        });\n      }\n      return;\n    }\n\n    this.#highlightToolbar?.hide();\n    this.#selectedTextNode = anchorNode;\n    this.#dispatchUpdateStates({\n      hasSelectedText: true,\n    });\n\n    if (\n      this.#mode !== AnnotationEditorType.HIGHLIGHT &&\n      this.#mode !== AnnotationEditorType.NONE\n    ) {\n      return;\n    }\n\n    if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n      this.showAllEditors(\"highlight\", true, /* updateButton = */ true);\n    }\n\n    this.#highlightWhenShiftUp = this.isShiftKeyDown;\n    if (!this.isShiftKeyDown) {\n      const activeLayer =\n        this.#mode === AnnotationEditorType.HIGHLIGHT\n          ? this.#getLayerForTextLayer(textLayer)\n          : null;\n      activeLayer?.toggleDrawing();\n\n      const ac = new AbortController();\n      const signal = this.combinedSignal(ac);\n\n      const pointerup = e => {\n        if (e.type === \"pointerup\" && e.button !== 0) {\n          // Do nothing on right click.\n          return;\n        }\n        ac.abort();\n        activeLayer?.toggleDrawing(true);\n        if (e.type === \"pointerup\") {\n          this.#onSelectEnd(\"main_toolbar\");\n        }\n      };\n      window.addEventListener(\"pointerup\", pointerup, { signal });\n      window.addEventListener(\"blur\", pointerup, { signal });\n    }\n  }\n\n  #onSelectEnd(methodOfCreation = \"\") {\n    if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n      this.highlightSelection(methodOfCreation);\n    } else if (this.#enableHighlightFloatingButton) {\n      this.#displayHighlightToolbar();\n    }\n  }\n\n  #addSelectionListener() {\n    document.addEventListener(\n      \"selectionchange\",\n      this.#selectionChange.bind(this),\n      { signal: this._signal }\n    );\n  }\n\n  #addFocusManager() {\n    if (this.#focusManagerAC) {\n      return;\n    }\n    this.#focusManagerAC = new AbortController();\n    const signal = this.combinedSignal(this.#focusManagerAC);\n\n    window.addEventListener(\"focus\", this.focus.bind(this), { signal });\n    window.addEventListener(\"blur\", this.blur.bind(this), { signal });\n  }\n\n  #removeFocusManager() {\n    this.#focusManagerAC?.abort();\n    this.#focusManagerAC = null;\n  }\n\n  blur() {\n    this.isShiftKeyDown = false;\n    if (this.#highlightWhenShiftUp) {\n      this.#highlightWhenShiftUp = false;\n      this.#onSelectEnd(\"main_toolbar\");\n    }\n    if (!this.hasSelection) {\n      return;\n    }\n    // When several editors are selected and the window loses focus, we want to\n    // keep the last active element in order to be able to focus it again when\n    // the window gets the focus back but we don't want to trigger any focus\n    // callbacks else only one editor will be selected.\n    const { activeElement } = document;\n    for (const editor of this.#selectedEditors) {\n      if (editor.div.contains(activeElement)) {\n        this.#lastActiveElement = [editor, activeElement];\n        editor._focusEventsAllowed = false;\n        break;\n      }\n    }\n  }\n\n  focus() {\n    if (!this.#lastActiveElement) {\n      return;\n    }\n    const [lastEditor, lastActiveElement] = this.#lastActiveElement;\n    this.#lastActiveElement = null;\n    lastActiveElement.addEventListener(\n      \"focusin\",\n      () => {\n        lastEditor._focusEventsAllowed = true;\n      },\n      { once: true, signal: this._signal }\n    );\n    lastActiveElement.focus();\n  }\n\n  #addKeyboardManager() {\n    if (this.#keyboardManagerAC) {\n      return;\n    }\n    this.#keyboardManagerAC = new AbortController();\n    const signal = this.combinedSignal(this.#keyboardManagerAC);\n\n    // The keyboard events are caught at the container level in order to be able\n    // to execute some callbacks even if the current page doesn't have focus.\n    window.addEventListener(\"keydown\", this.keydown.bind(this), { signal });\n    window.addEventListener(\"keyup\", this.keyup.bind(this), { signal });\n  }\n\n  #removeKeyboardManager() {\n    this.#keyboardManagerAC?.abort();\n    this.#keyboardManagerAC = null;\n  }\n\n  #addCopyPasteListeners() {\n    if (this.#copyPasteAC) {\n      return;\n    }\n    this.#copyPasteAC = new AbortController();\n    const signal = this.combinedSignal(this.#copyPasteAC);\n\n    document.addEventListener(\"copy\", this.copy.bind(this), { signal });\n    document.addEventListener(\"cut\", this.cut.bind(this), { signal });\n    document.addEventListener(\"paste\", this.paste.bind(this), { signal });\n  }\n\n  #removeCopyPasteListeners() {\n    this.#copyPasteAC?.abort();\n    this.#copyPasteAC = null;\n  }\n\n  #addDragAndDropListeners() {\n    const signal = this._signal;\n    document.addEventListener(\"dragover\", this.dragOver.bind(this), { signal });\n    document.addEventListener(\"drop\", this.drop.bind(this), { signal });\n  }\n\n  addEditListeners() {\n    this.#addKeyboardManager();\n    this.#addCopyPasteListeners();\n  }\n\n  removeEditListeners() {\n    this.#removeKeyboardManager();\n    this.#removeCopyPasteListeners();\n  }\n\n  dragOver(event) {\n    for (const { type } of event.dataTransfer.items) {\n      for (const editorType of this.#editorTypes) {\n        if (editorType.isHandlingMimeForPasting(type)) {\n          event.dataTransfer.dropEffect = \"copy\";\n          event.preventDefault();\n          return;\n        }\n      }\n    }\n  }\n\n  /**\n   * Drop callback.\n   * @param {DragEvent} event\n   */\n  drop(event) {\n    for (const item of event.dataTransfer.items) {\n      for (const editorType of this.#editorTypes) {\n        if (editorType.isHandlingMimeForPasting(item.type)) {\n          editorType.paste(item, this.currentLayer);\n          event.preventDefault();\n          return;\n        }\n      }\n    }\n  }\n\n  /**\n   * Copy callback.\n   * @param {ClipboardEvent} event\n   */\n  copy(event) {\n    event.preventDefault();\n\n    // An editor is being edited so just commit it.\n    this.#activeEditor?.commitOrRemove();\n\n    if (!this.hasSelection) {\n      return;\n    }\n\n    const editors = [];\n    for (const editor of this.#selectedEditors) {\n      const serialized = editor.serialize(/* isForCopying = */ true);\n      if (serialized) {\n        editors.push(serialized);\n      }\n    }\n    if (editors.length === 0) {\n      return;\n    }\n\n    event.clipboardData.setData(\"application/pdfjs\", JSON.stringify(editors));\n  }\n\n  /**\n   * Cut callback.\n   * @param {ClipboardEvent} event\n   */\n  cut(event) {\n    this.copy(event);\n    this.delete();\n  }\n\n  /**\n   * Paste callback.\n   * @param {ClipboardEvent} event\n   */\n  async paste(event) {\n    event.preventDefault();\n    const { clipboardData } = event;\n    for (const item of clipboardData.items) {\n      for (const editorType of this.#editorTypes) {\n        if (editorType.isHandlingMimeForPasting(item.type)) {\n          editorType.paste(item, this.currentLayer);\n          return;\n        }\n      }\n    }\n\n    let data = clipboardData.getData(\"application/pdfjs\");\n    if (!data) {\n      return;\n    }\n\n    try {\n      data = JSON.parse(data);\n    } catch (ex) {\n      warn(`paste: \"${ex.message}\".`);\n      return;\n    }\n\n    if (!Array.isArray(data)) {\n      return;\n    }\n\n    this.unselectAll();\n    const layer = this.currentLayer;\n\n    try {\n      const newEditors = [];\n      for (const editor of data) {\n        const deserializedEditor = await layer.deserialize(editor);\n        if (!deserializedEditor) {\n          return;\n        }\n        newEditors.push(deserializedEditor);\n      }\n\n      const cmd = () => {\n        for (const editor of newEditors) {\n          this.#addEditorToLayer(editor);\n        }\n        this.#selectEditors(newEditors);\n      };\n      const undo = () => {\n        for (const editor of newEditors) {\n          editor.remove();\n        }\n      };\n      this.addCommands({ cmd, undo, mustExec: true });\n    } catch (ex) {\n      warn(`paste: \"${ex.message}\".`);\n    }\n  }\n\n  /**\n   * Keydown callback.\n   * @param {KeyboardEvent} event\n   */\n  keydown(event) {\n    if (!this.isShiftKeyDown && event.key === \"Shift\") {\n      this.isShiftKeyDown = true;\n    }\n    if (\n      this.#mode !== AnnotationEditorType.NONE &&\n      !this.isEditorHandlingKeyboard\n    ) {\n      AnnotationEditorUIManager._keyboardManager.exec(this, event);\n    }\n  }\n\n  /**\n   * Keyup callback.\n   * @param {KeyboardEvent} event\n   */\n  keyup(event) {\n    if (this.isShiftKeyDown && event.key === \"Shift\") {\n      this.isShiftKeyDown = false;\n      if (this.#highlightWhenShiftUp) {\n        this.#highlightWhenShiftUp = false;\n        this.#onSelectEnd(\"main_toolbar\");\n      }\n    }\n  }\n\n  /**\n   * Execute an action for a given name.\n   * For example, the user can click on the \"Undo\" entry in the context menu\n   * and it'll trigger the undo action.\n   */\n  onEditingAction({ name }) {\n    switch (name) {\n      case \"undo\":\n      case \"redo\":\n      case \"delete\":\n      case \"selectAll\":\n        this[name]();\n        break;\n      case \"highlightSelection\":\n        this.highlightSelection(\"context_menu\");\n        break;\n    }\n  }\n\n  /**\n   * Update the different possible states of this manager, e.g. is there\n   * something to undo, redo, ...\n   * @param {Object} details\n   */\n  #dispatchUpdateStates(details) {\n    const hasChanged = Object.entries(details).some(\n      ([key, value]) => this.#previousStates[key] !== value\n    );\n\n    if (hasChanged) {\n      this._eventBus.dispatch(\"annotationeditorstateschanged\", {\n        source: this,\n        details: Object.assign(this.#previousStates, details),\n      });\n      // We could listen on our own event but it sounds like a bit weird and\n      // it's a way to simpler to handle that stuff here instead of having to\n      // add something in every place where an editor can be unselected.\n      if (\n        this.#mode === AnnotationEditorType.HIGHLIGHT &&\n        details.hasSelectedEditor === false\n      ) {\n        this.#dispatchUpdateUI([\n          [AnnotationEditorParamsType.HIGHLIGHT_FREE, true],\n        ]);\n      }\n    }\n  }\n\n  #dispatchUpdateUI(details) {\n    this._eventBus.dispatch(\"annotationeditorparamschanged\", {\n      source: this,\n      details,\n    });\n  }\n\n  /**\n   * Set the editing state.\n   * It can be useful to temporarily disable it when the user is editing a\n   * FreeText annotation.\n   * @param {boolean} isEditing\n   */\n  setEditingState(isEditing) {\n    if (isEditing) {\n      this.#addFocusManager();\n      this.#addCopyPasteListeners();\n      this.#dispatchUpdateStates({\n        isEditing: this.#mode !== AnnotationEditorType.NONE,\n        isEmpty: this.#isEmpty(),\n        hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n        hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n        hasSelectedEditor: false,\n      });\n    } else {\n      this.#removeFocusManager();\n      this.#removeCopyPasteListeners();\n      this.#dispatchUpdateStates({\n        isEditing: false,\n      });\n      this.disableUserSelect(false);\n    }\n  }\n\n  registerEditorTypes(types) {\n    if (this.#editorTypes) {\n      return;\n    }\n    this.#editorTypes = types;\n    for (const editorType of this.#editorTypes) {\n      this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n    }\n  }\n\n  /**\n   * Get an id.\n   * @returns {string}\n   */\n  getId() {\n    return this.#idManager.id;\n  }\n\n  get currentLayer() {\n    return this.#allLayers.get(this.#currentPageIndex);\n  }\n\n  getLayer(pageIndex) {\n    return this.#allLayers.get(pageIndex);\n  }\n\n  get currentPageIndex() {\n    return this.#currentPageIndex;\n  }\n\n  /**\n   * Add a new layer for a page which will contains the editors.\n   * @param {AnnotationEditorLayer} layer\n   */\n  addLayer(layer) {\n    this.#allLayers.set(layer.pageIndex, layer);\n    if (this.#isEnabled) {\n      layer.enable();\n    } else {\n      layer.disable();\n    }\n  }\n\n  /**\n   * Remove a layer.\n   * @param {AnnotationEditorLayer} layer\n   */\n  removeLayer(layer) {\n    this.#allLayers.delete(layer.pageIndex);\n  }\n\n  /**\n   * Change the editor mode (None, FreeText, Ink, ...)\n   * @param {number} mode\n   * @param {string|null} editId\n   * @param {boolean} [isFromKeyboard] - true if the mode change is due to a\n   *   keyboard action.\n   */\n  async updateMode(mode, editId = null, isFromKeyboard = false) {\n    if (this.#mode === mode) {\n      return;\n    }\n\n    if (this.#updateModeCapability) {\n      await this.#updateModeCapability.promise;\n      if (!this.#updateModeCapability) {\n        // This ui manager has been destroyed.\n        return;\n      }\n    }\n\n    this.#updateModeCapability = Promise.withResolvers();\n\n    this.#mode = mode;\n    if (mode === AnnotationEditorType.NONE) {\n      this.setEditingState(false);\n      this.#disableAll();\n\n      this._editorUndoBar?.hide();\n\n      this.#updateModeCapability.resolve();\n      return;\n    }\n    this.setEditingState(true);\n    await this.#enableAll();\n    this.unselectAll();\n    for (const layer of this.#allLayers.values()) {\n      layer.updateMode(mode);\n    }\n    if (!editId) {\n      if (isFromKeyboard) {\n        this.addNewEditorFromKeyboard();\n      }\n\n      this.#updateModeCapability.resolve();\n      return;\n    }\n\n    for (const editor of this.#allEditors.values()) {\n      if (editor.annotationElementId === editId) {\n        this.setSelected(editor);\n        editor.enterInEditMode();\n      } else {\n        editor.unselect();\n      }\n    }\n\n    this.#updateModeCapability.resolve();\n  }\n\n  addNewEditorFromKeyboard() {\n    if (this.currentLayer.canCreateNewEmptyEditor()) {\n      this.currentLayer.addNewEditor();\n    }\n  }\n\n  /**\n   * Update the toolbar if it's required to reflect the tool currently used.\n   * @param {number} mode\n   * @returns {undefined}\n   */\n  updateToolbar(mode) {\n    if (mode === this.#mode) {\n      return;\n    }\n    this._eventBus.dispatch(\"switchannotationeditormode\", {\n      source: this,\n      mode,\n    });\n  }\n\n  /**\n   * Update a parameter in the current editor or globally.\n   * @param {number} type\n   * @param {*} value\n   */\n  updateParams(type, value) {\n    if (!this.#editorTypes) {\n      return;\n    }\n\n    switch (type) {\n      case AnnotationEditorParamsType.CREATE:\n        this.currentLayer.addNewEditor();\n        return;\n      case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR:\n        this.#mainHighlightColorPicker?.updateColor(value);\n        break;\n      case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:\n        this._eventBus.dispatch(\"reporttelemetry\", {\n          source: this,\n          details: {\n            type: \"editing\",\n            data: {\n              type: \"highlight\",\n              action: \"toggle_visibility\",\n            },\n          },\n        });\n        (this.#showAllStates ||= new Map()).set(type, value);\n        this.showAllEditors(\"highlight\", value);\n        break;\n    }\n\n    for (const editor of this.#selectedEditors) {\n      editor.updateParams(type, value);\n    }\n\n    for (const editorType of this.#editorTypes) {\n      editorType.updateDefaultParams(type, value);\n    }\n  }\n\n  showAllEditors(type, visible, updateButton = false) {\n    for (const editor of this.#allEditors.values()) {\n      if (editor.editorType === type) {\n        editor.show(visible);\n      }\n    }\n    const state =\n      this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ??\n      true;\n    if (state !== visible) {\n      this.#dispatchUpdateUI([\n        [AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible],\n      ]);\n    }\n  }\n\n  enableWaiting(mustWait = false) {\n    if (this.#isWaiting === mustWait) {\n      return;\n    }\n    this.#isWaiting = mustWait;\n    for (const layer of this.#allLayers.values()) {\n      if (mustWait) {\n        layer.disableClick();\n      } else {\n        layer.enableClick();\n      }\n      layer.div.classList.toggle(\"waiting\", mustWait);\n    }\n  }\n\n  /**\n   * Enable all the layers.\n   */\n  async #enableAll() {\n    if (!this.#isEnabled) {\n      this.#isEnabled = true;\n      const promises = [];\n      for (const layer of this.#allLayers.values()) {\n        promises.push(layer.enable());\n      }\n      await Promise.all(promises);\n      for (const editor of this.#allEditors.values()) {\n        editor.enable();\n      }\n    }\n  }\n\n  /**\n   * Disable all the layers.\n   */\n  #disableAll() {\n    this.unselectAll();\n    if (this.#isEnabled) {\n      this.#isEnabled = false;\n      for (const layer of this.#allLayers.values()) {\n        layer.disable();\n      }\n      for (const editor of this.#allEditors.values()) {\n        editor.disable();\n      }\n    }\n  }\n\n  /**\n   * Get all the editors belonging to a given page.\n   * @param {number} pageIndex\n   * @returns {Array<AnnotationEditor>}\n   */\n  getEditors(pageIndex) {\n    const editors = [];\n    for (const editor of this.#allEditors.values()) {\n      if (editor.pageIndex === pageIndex) {\n        editors.push(editor);\n      }\n    }\n    return editors;\n  }\n\n  /**\n   * Get an editor with the given id.\n   * @param {string} id\n   * @returns {AnnotationEditor}\n   */\n  getEditor(id) {\n    return this.#allEditors.get(id);\n  }\n\n  /**\n   * Add a new editor.\n   * @param {AnnotationEditor} editor\n   */\n  addEditor(editor) {\n    this.#allEditors.set(editor.id, editor);\n  }\n\n  /**\n   * Remove an editor.\n   * @param {AnnotationEditor} editor\n   */\n  removeEditor(editor) {\n    if (editor.div.contains(document.activeElement)) {\n      if (this.#focusMainContainerTimeoutId) {\n        clearTimeout(this.#focusMainContainerTimeoutId);\n      }\n      this.#focusMainContainerTimeoutId = setTimeout(() => {\n        // When the div is removed from DOM the focus can move on the\n        // document.body, so we need to move it back to the main container.\n        this.focusMainContainer();\n        this.#focusMainContainerTimeoutId = null;\n      }, 0);\n    }\n    this.#allEditors.delete(editor.id);\n    this.unselect(editor);\n    if (\n      !editor.annotationElementId ||\n      !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)\n    ) {\n      this.#annotationStorage?.remove(editor.id);\n    }\n  }\n\n  /**\n   * The annotation element with the given id has been deleted.\n   * @param {AnnotationEditor} editor\n   */\n  addDeletedAnnotationElement(editor) {\n    this.#deletedAnnotationsElementIds.add(editor.annotationElementId);\n    this.addChangedExistingAnnotation(editor);\n    editor.deleted = true;\n  }\n\n  /**\n   * Check if the annotation element with the given id has been deleted.\n   * @param {string} annotationElementId\n   * @returns {boolean}\n   */\n  isDeletedAnnotationElement(annotationElementId) {\n    return this.#deletedAnnotationsElementIds.has(annotationElementId);\n  }\n\n  /**\n   * The annotation element with the given id have been restored.\n   * @param {AnnotationEditor} editor\n   */\n  removeDeletedAnnotationElement(editor) {\n    this.#deletedAnnotationsElementIds.delete(editor.annotationElementId);\n    this.removeChangedExistingAnnotation(editor);\n    editor.deleted = false;\n  }\n\n  /**\n   * Add an editor to the layer it belongs to or add it to the global map.\n   * @param {AnnotationEditor} editor\n   */\n  #addEditorToLayer(editor) {\n    const layer = this.#allLayers.get(editor.pageIndex);\n    if (layer) {\n      layer.addOrRebuild(editor);\n    } else {\n      this.addEditor(editor);\n      this.addToAnnotationStorage(editor);\n    }\n  }\n\n  /**\n   * Set the given editor as the active one.\n   * @param {AnnotationEditor} editor\n   */\n  setActiveEditor(editor) {\n    if (this.#activeEditor === editor) {\n      return;\n    }\n\n    this.#activeEditor = editor;\n    if (editor) {\n      this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    }\n  }\n\n  get #lastSelectedEditor() {\n    let ed = null;\n    for (ed of this.#selectedEditors) {\n      // Iterate to get the last element.\n    }\n    return ed;\n  }\n\n  /**\n   * Update the UI of the active editor.\n   * @param {AnnotationEditor} editor\n   */\n  updateUI(editor) {\n    if (this.#lastSelectedEditor === editor) {\n      this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    }\n  }\n\n  updateUIForDefaultProperties(editorType) {\n    this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n  }\n\n  /**\n   * Add or remove an editor the current selection.\n   * @param {AnnotationEditor} editor\n   */\n  toggleSelected(editor) {\n    if (this.#selectedEditors.has(editor)) {\n      this.#selectedEditors.delete(editor);\n      editor.unselect();\n      this.#dispatchUpdateStates({\n        hasSelectedEditor: this.hasSelection,\n      });\n      return;\n    }\n    this.#selectedEditors.add(editor);\n    editor.select();\n    this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: true,\n    });\n  }\n\n  /**\n   * Set the last selected editor.\n   * @param {AnnotationEditor} editor\n   */\n  setSelected(editor) {\n    this.#currentDrawingSession?.commitOrRemove();\n    for (const ed of this.#selectedEditors) {\n      if (ed !== editor) {\n        ed.unselect();\n      }\n    }\n    this.#selectedEditors.clear();\n\n    this.#selectedEditors.add(editor);\n    editor.select();\n    this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: true,\n    });\n  }\n\n  /**\n   * Check if the editor is selected.\n   * @param {AnnotationEditor} editor\n   */\n  isSelected(editor) {\n    return this.#selectedEditors.has(editor);\n  }\n\n  get firstSelectedEditor() {\n    return this.#selectedEditors.values().next().value;\n  }\n\n  /**\n   * Unselect an editor.\n   * @param {AnnotationEditor} editor\n   */\n  unselect(editor) {\n    editor.unselect();\n    this.#selectedEditors.delete(editor);\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: this.hasSelection,\n    });\n  }\n\n  get hasSelection() {\n    return this.#selectedEditors.size !== 0;\n  }\n\n  get isEnterHandled() {\n    return (\n      this.#selectedEditors.size === 1 &&\n      this.firstSelectedEditor.isEnterHandled\n    );\n  }\n\n  /**\n   * Undo the last command.\n   */\n  undo() {\n    this.#commandManager.undo();\n    this.#dispatchUpdateStates({\n      hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n      hasSomethingToRedo: true,\n      isEmpty: this.#isEmpty(),\n    });\n    this._editorUndoBar?.hide();\n  }\n\n  /**\n   * Redo the last undoed command.\n   */\n  redo() {\n    this.#commandManager.redo();\n    this.#dispatchUpdateStates({\n      hasSomethingToUndo: true,\n      hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n      isEmpty: this.#isEmpty(),\n    });\n  }\n\n  /**\n   * Add a command to execute (cmd) and another one to undo it.\n   * @param {Object} params\n   */\n  addCommands(params) {\n    this.#commandManager.add(params);\n    this.#dispatchUpdateStates({\n      hasSomethingToUndo: true,\n      hasSomethingToRedo: false,\n      isEmpty: this.#isEmpty(),\n    });\n  }\n\n  cleanUndoStack(type) {\n    this.#commandManager.cleanType(type);\n  }\n\n  #isEmpty() {\n    if (this.#allEditors.size === 0) {\n      return true;\n    }\n\n    if (this.#allEditors.size === 1) {\n      for (const editor of this.#allEditors.values()) {\n        return editor.isEmpty();\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Delete the current editor or all.\n   */\n  delete() {\n    this.commitOrRemove();\n    const drawingEditor = this.currentLayer?.endDrawingSession(\n      /* isAborted = */ true\n    );\n    if (!this.hasSelection && !drawingEditor) {\n      return;\n    }\n\n    const editors = drawingEditor\n      ? [drawingEditor]\n      : [...this.#selectedEditors];\n    const cmd = () => {\n      this._editorUndoBar?.show(\n        undo,\n        editors.length === 1 ? editors[0].editorType : editors.length\n      );\n      for (const editor of editors) {\n        editor.remove();\n      }\n    };\n    const undo = () => {\n      for (const editor of editors) {\n        this.#addEditorToLayer(editor);\n      }\n    };\n\n    this.addCommands({ cmd, undo, mustExec: true });\n  }\n\n  commitOrRemove() {\n    // An editor is being edited so just commit it.\n    this.#activeEditor?.commitOrRemove();\n  }\n\n  hasSomethingToControl() {\n    return this.#activeEditor || this.hasSelection;\n  }\n\n  /**\n   * Select the editors.\n   * @param {Array<AnnotationEditor>} editors\n   */\n  #selectEditors(editors) {\n    for (const editor of this.#selectedEditors) {\n      editor.unselect();\n    }\n    this.#selectedEditors.clear();\n    for (const editor of editors) {\n      if (editor.isEmpty()) {\n        continue;\n      }\n      this.#selectedEditors.add(editor);\n      editor.select();\n    }\n    this.#dispatchUpdateStates({ hasSelectedEditor: this.hasSelection });\n  }\n\n  /**\n   * Select all the editors.\n   */\n  selectAll() {\n    for (const editor of this.#selectedEditors) {\n      editor.commit();\n    }\n    this.#selectEditors(this.#allEditors.values());\n  }\n\n  /**\n   * Unselect all the selected editors.\n   */\n  unselectAll() {\n    if (this.#activeEditor) {\n      // An editor is being edited so just commit it.\n      this.#activeEditor.commitOrRemove();\n      if (this.#mode !== AnnotationEditorType.NONE) {\n        // If the mode is NONE, we want to really unselect the editor, hence we\n        // mustn't return here.\n        return;\n      }\n    }\n\n    if (this.#currentDrawingSession?.commitOrRemove()) {\n      return;\n    }\n\n    if (!this.hasSelection) {\n      return;\n    }\n    for (const editor of this.#selectedEditors) {\n      editor.unselect();\n    }\n    this.#selectedEditors.clear();\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: false,\n    });\n  }\n\n  translateSelectedEditors(x, y, noCommit = false) {\n    if (!noCommit) {\n      this.commitOrRemove();\n    }\n    if (!this.hasSelection) {\n      return;\n    }\n\n    this.#translation[0] += x;\n    this.#translation[1] += y;\n    const [totalX, totalY] = this.#translation;\n    const editors = [...this.#selectedEditors];\n\n    // We don't want to have an undo/redo for each translation so we wait a bit\n    // before adding the command to the command manager.\n    const TIME_TO_WAIT = 1000;\n\n    if (this.#translationTimeoutId) {\n      clearTimeout(this.#translationTimeoutId);\n    }\n\n    this.#translationTimeoutId = setTimeout(() => {\n      this.#translationTimeoutId = null;\n      this.#translation[0] = this.#translation[1] = 0;\n\n      this.addCommands({\n        cmd: () => {\n          for (const editor of editors) {\n            if (this.#allEditors.has(editor.id)) {\n              editor.translateInPage(totalX, totalY);\n            }\n          }\n        },\n        undo: () => {\n          for (const editor of editors) {\n            if (this.#allEditors.has(editor.id)) {\n              editor.translateInPage(-totalX, -totalY);\n            }\n          }\n        },\n        mustExec: false,\n      });\n    }, TIME_TO_WAIT);\n\n    for (const editor of editors) {\n      editor.translateInPage(x, y);\n    }\n  }\n\n  /**\n   * Set up the drag session for moving the selected editors.\n   */\n  setUpDragSession() {\n    // Note: don't use any references to the editor's parent which can be null\n    // if the editor belongs to a destroyed page.\n    if (!this.hasSelection) {\n      return;\n    }\n    // Avoid to have spurious text selection in the text layer when dragging.\n    this.disableUserSelect(true);\n    this.#draggingEditors = new Map();\n    for (const editor of this.#selectedEditors) {\n      this.#draggingEditors.set(editor, {\n        savedX: editor.x,\n        savedY: editor.y,\n        savedPageIndex: editor.pageIndex,\n        newX: 0,\n        newY: 0,\n        newPageIndex: -1,\n      });\n    }\n  }\n\n  /**\n   * Ends the drag session.\n   * @returns {boolean} true if at least one editor has been moved.\n   */\n  endDragSession() {\n    if (!this.#draggingEditors) {\n      return false;\n    }\n    this.disableUserSelect(false);\n    const map = this.#draggingEditors;\n    this.#draggingEditors = null;\n    let mustBeAddedInUndoStack = false;\n\n    for (const [{ x, y, pageIndex }, value] of map) {\n      value.newX = x;\n      value.newY = y;\n      value.newPageIndex = pageIndex;\n      mustBeAddedInUndoStack ||=\n        x !== value.savedX ||\n        y !== value.savedY ||\n        pageIndex !== value.savedPageIndex;\n    }\n\n    if (!mustBeAddedInUndoStack) {\n      return false;\n    }\n\n    const move = (editor, x, y, pageIndex) => {\n      if (this.#allEditors.has(editor.id)) {\n        // The editor can be undone/redone on a page which is not visible (and\n        // which potentially has no annotation editor layer), hence we need to\n        // use the pageIndex instead of the parent.\n        const parent = this.#allLayers.get(pageIndex);\n        if (parent) {\n          editor._setParentAndPosition(parent, x, y);\n        } else {\n          editor.pageIndex = pageIndex;\n          editor.x = x;\n          editor.y = y;\n        }\n      }\n    };\n\n    this.addCommands({\n      cmd: () => {\n        for (const [editor, { newX, newY, newPageIndex }] of map) {\n          move(editor, newX, newY, newPageIndex);\n        }\n      },\n      undo: () => {\n        for (const [editor, { savedX, savedY, savedPageIndex }] of map) {\n          move(editor, savedX, savedY, savedPageIndex);\n        }\n      },\n      mustExec: true,\n    });\n\n    return true;\n  }\n\n  /**\n   * Drag the set of selected editors.\n   * @param {number} tx\n   * @param {number} ty\n   */\n  dragSelectedEditors(tx, ty) {\n    if (!this.#draggingEditors) {\n      return;\n    }\n    for (const editor of this.#draggingEditors.keys()) {\n      editor.drag(tx, ty);\n    }\n  }\n\n  /**\n   * Rebuild the editor (usually on undo/redo actions) on a potentially\n   * non-rendered page.\n   * @param {AnnotationEditor} editor\n   */\n  rebuild(editor) {\n    if (editor.parent === null) {\n      const parent = this.getLayer(editor.pageIndex);\n      if (parent) {\n        parent.changeParent(editor);\n        parent.addOrRebuild(editor);\n      } else {\n        this.addEditor(editor);\n        this.addToAnnotationStorage(editor);\n        editor.rebuild();\n      }\n    } else {\n      editor.parent.addOrRebuild(editor);\n    }\n  }\n\n  get isEditorHandlingKeyboard() {\n    return (\n      this.getActive()?.shouldGetKeyboardEvents() ||\n      (this.#selectedEditors.size === 1 &&\n        this.firstSelectedEditor.shouldGetKeyboardEvents())\n    );\n  }\n\n  /**\n   * Is the current editor the one passed as argument?\n   * @param {AnnotationEditor} editor\n   * @returns\n   */\n  isActive(editor) {\n    return this.#activeEditor === editor;\n  }\n\n  /**\n   * Get the current active editor.\n   * @returns {AnnotationEditor|null}\n   */\n  getActive() {\n    return this.#activeEditor;\n  }\n\n  /**\n   * Get the current editor mode.\n   * @returns {number}\n   */\n  getMode() {\n    return this.#mode;\n  }\n\n  get imageManager() {\n    return shadow(this, \"imageManager\", new ImageManager());\n  }\n\n  getSelectionBoxes(textLayer) {\n    if (!textLayer) {\n      return null;\n    }\n    const selection = document.getSelection();\n    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n      if (\n        !textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)\n      ) {\n        return null;\n      }\n    }\n\n    const {\n      x: layerX,\n      y: layerY,\n      width: parentWidth,\n      height: parentHeight,\n    } = textLayer.getBoundingClientRect();\n\n    // We must rotate the boxes because we want to have them in the non-rotated\n    // page coordinates.\n    let rotator;\n    switch (textLayer.getAttribute(\"data-main-rotation\")) {\n      case \"90\":\n        rotator = (x, y, w, h) => ({\n          x: (y - layerY) / parentHeight,\n          y: 1 - (x + w - layerX) / parentWidth,\n          width: h / parentHeight,\n          height: w / parentWidth,\n        });\n        break;\n      case \"180\":\n        rotator = (x, y, w, h) => ({\n          x: 1 - (x + w - layerX) / parentWidth,\n          y: 1 - (y + h - layerY) / parentHeight,\n          width: w / parentWidth,\n          height: h / parentHeight,\n        });\n        break;\n      case \"270\":\n        rotator = (x, y, w, h) => ({\n          x: 1 - (y + h - layerY) / parentHeight,\n          y: (x - layerX) / parentWidth,\n          width: h / parentHeight,\n          height: w / parentWidth,\n        });\n        break;\n      default:\n        rotator = (x, y, w, h) => ({\n          x: (x - layerX) / parentWidth,\n          y: (y - layerY) / parentHeight,\n          width: w / parentWidth,\n          height: h / parentHeight,\n        });\n        break;\n    }\n\n    const boxes = [];\n    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n      const range = selection.getRangeAt(i);\n      if (range.collapsed) {\n        continue;\n      }\n      for (const { x, y, width, height } of range.getClientRects()) {\n        if (width === 0 || height === 0) {\n          continue;\n        }\n        boxes.push(rotator(x, y, width, height));\n      }\n    }\n    return boxes.length === 0 ? null : boxes;\n  }\n\n  addChangedExistingAnnotation({ annotationElementId, id }) {\n    (this.#changedExistingAnnotations ||= new Map()).set(\n      annotationElementId,\n      id\n    );\n  }\n\n  removeChangedExistingAnnotation({ annotationElementId }) {\n    this.#changedExistingAnnotations?.delete(annotationElementId);\n  }\n\n  renderAnnotationElement(annotation) {\n    const editorId = this.#changedExistingAnnotations?.get(annotation.data.id);\n    if (!editorId) {\n      return;\n    }\n    const editor = this.#annotationStorage.getRawValue(editorId);\n    if (!editor) {\n      return;\n    }\n    if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) {\n      return;\n    }\n    editor.renderAnnotationElement(annotation);\n  }\n}\n\nexport {\n  AnnotationEditorUIManager,\n  bindEvents,\n  ColorManager,\n  CommandManager,\n  KeyboardManager,\n  opacityToHex,\n};\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu } from \"../display_utils.js\";\n\nclass AltText {\n  #altText = null;\n\n  #altTextDecorative = false;\n\n  #altTextButton = null;\n\n  #altTextButtonLabel = null;\n\n  #altTextTooltip = null;\n\n  #altTextTooltipTimeout = null;\n\n  #altTextWasFromKeyBoard = false;\n\n  #badge = null;\n\n  #editor = null;\n\n  #guessedText = null;\n\n  #textWithDisclaimer = null;\n\n  #useNewAltTextFlow = false;\n\n  static #l10nNewButton = null;\n\n  static _l10n = null;\n\n  constructor(editor) {\n    this.#editor = editor;\n    this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow;\n\n    AltText.#l10nNewButton ||= Object.freeze({\n      added: \"pdfjs-editor-new-alt-text-added-button\",\n      \"added-label\": \"pdfjs-editor-new-alt-text-added-button-label\",\n      missing: \"pdfjs-editor-new-alt-text-missing-button\",\n      \"missing-label\": \"pdfjs-editor-new-alt-text-missing-button-label\",\n      review: \"pdfjs-editor-new-alt-text-to-review-button\",\n      \"review-label\": \"pdfjs-editor-new-alt-text-to-review-button-label\",\n    });\n  }\n\n  static initialize(l10n) {\n    AltText._l10n ??= l10n;\n  }\n\n  async render() {\n    const altText = (this.#altTextButton = document.createElement(\"button\"));\n    altText.className = \"altText\";\n    altText.tabIndex = \"0\";\n\n    const label = (this.#altTextButtonLabel = document.createElement(\"span\"));\n    altText.append(label);\n\n    if (this.#useNewAltTextFlow) {\n      altText.classList.add(\"new\");\n      altText.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton.missing);\n      label.setAttribute(\n        \"data-l10n-id\",\n        AltText.#l10nNewButton[\"missing-label\"]\n      );\n    } else {\n      altText.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-button\");\n      label.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-button-label\");\n    }\n\n    const signal = this.#editor._uiManager._signal;\n    altText.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    altText.addEventListener(\"pointerdown\", event => event.stopPropagation(), {\n      signal,\n    });\n\n    const onClick = event => {\n      event.preventDefault();\n      this.#editor._uiManager.editAltText(this.#editor);\n      if (this.#useNewAltTextFlow) {\n        this.#editor._reportTelemetry({\n          action: \"pdfjs.image.alt_text.image_status_label_clicked\",\n          data: { label: this.#label },\n        });\n      }\n    };\n    altText.addEventListener(\"click\", onClick, { capture: true, signal });\n    altText.addEventListener(\n      \"keydown\",\n      event => {\n        if (event.target === altText && event.key === \"Enter\") {\n          this.#altTextWasFromKeyBoard = true;\n          onClick(event);\n        }\n      },\n      { signal }\n    );\n    await this.#setState();\n\n    return altText;\n  }\n\n  get #label() {\n    return (\n      (this.#altText && \"added\") ||\n      (this.#altText === null && this.guessedText && \"review\") ||\n      \"missing\"\n    );\n  }\n\n  finish() {\n    if (!this.#altTextButton) {\n      return;\n    }\n    this.#altTextButton.focus({ focusVisible: this.#altTextWasFromKeyBoard });\n    this.#altTextWasFromKeyBoard = false;\n  }\n\n  isEmpty() {\n    if (this.#useNewAltTextFlow) {\n      return this.#altText === null;\n    }\n    return !this.#altText && !this.#altTextDecorative;\n  }\n\n  hasData() {\n    if (this.#useNewAltTextFlow) {\n      return this.#altText !== null || !!this.#guessedText;\n    }\n    return this.isEmpty();\n  }\n\n  get guessedText() {\n    return this.#guessedText;\n  }\n\n  async setGuessedText(guessedText) {\n    if (this.#altText !== null) {\n      // The user provided their own alt text, so we don't want to overwrite it.\n      return;\n    }\n    this.#guessedText = guessedText;\n    this.#textWithDisclaimer = await AltText._l10n.get(\n      \"pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer\",\n      { generatedAltText: guessedText }\n    );\n    this.#setState();\n  }\n\n  toggleAltTextBadge(visibility = false) {\n    if (!this.#useNewAltTextFlow || this.#altText) {\n      this.#badge?.remove();\n      this.#badge = null;\n      return;\n    }\n    if (!this.#badge) {\n      const badge = (this.#badge = document.createElement(\"div\"));\n      badge.className = \"noAltTextBadge\";\n      this.#editor.div.append(badge);\n    }\n    this.#badge.classList.toggle(\"hidden\", !visibility);\n  }\n\n  serialize(isForCopying) {\n    let altText = this.#altText;\n    if (!isForCopying && this.#guessedText === altText) {\n      altText = this.#textWithDisclaimer;\n    }\n    return {\n      altText,\n      decorative: this.#altTextDecorative,\n      guessedText: this.#guessedText,\n      textWithDisclaimer: this.#textWithDisclaimer,\n    };\n  }\n\n  get data() {\n    return {\n      altText: this.#altText,\n      decorative: this.#altTextDecorative,\n    };\n  }\n\n  /**\n   * Set the alt text data.\n   */\n  set data({\n    altText,\n    decorative,\n    guessedText,\n    textWithDisclaimer,\n    cancel = false,\n  }) {\n    if (guessedText) {\n      this.#guessedText = guessedText;\n      this.#textWithDisclaimer = textWithDisclaimer;\n    }\n    if (this.#altText === altText && this.#altTextDecorative === decorative) {\n      return;\n    }\n    if (!cancel) {\n      this.#altText = altText;\n      this.#altTextDecorative = decorative;\n    }\n    this.#setState();\n  }\n\n  toggle(enabled = false) {\n    if (!this.#altTextButton) {\n      return;\n    }\n    if (!enabled && this.#altTextTooltipTimeout) {\n      clearTimeout(this.#altTextTooltipTimeout);\n      this.#altTextTooltipTimeout = null;\n    }\n    this.#altTextButton.disabled = !enabled;\n  }\n\n  shown() {\n    this.#editor._reportTelemetry({\n      action: \"pdfjs.image.alt_text.image_status_label_displayed\",\n      data: { label: this.#label },\n    });\n  }\n\n  destroy() {\n    this.#altTextButton?.remove();\n    this.#altTextButton = null;\n    this.#altTextButtonLabel = null;\n    this.#altTextTooltip = null;\n    this.#badge?.remove();\n    this.#badge = null;\n  }\n\n  async #setState() {\n    const button = this.#altTextButton;\n    if (!button) {\n      return;\n    }\n\n    if (this.#useNewAltTextFlow) {\n      button.classList.toggle(\"done\", !!this.#altText);\n      button.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton[this.#label]);\n\n      this.#altTextButtonLabel?.setAttribute(\n        \"data-l10n-id\",\n        AltText.#l10nNewButton[`${this.#label}-label`]\n      );\n      if (!this.#altText) {\n        this.#altTextTooltip?.remove();\n        return;\n      }\n    } else {\n      if (!this.#altText && !this.#altTextDecorative) {\n        button.classList.remove(\"done\");\n        this.#altTextTooltip?.remove();\n        return;\n      }\n      button.classList.add(\"done\");\n      button.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-edit-button\");\n    }\n\n    let tooltip = this.#altTextTooltip;\n    if (!tooltip) {\n      this.#altTextTooltip = tooltip = document.createElement(\"span\");\n      tooltip.className = \"tooltip\";\n      tooltip.setAttribute(\"role\", \"tooltip\");\n      tooltip.id = `alt-text-tooltip-${this.#editor.id}`;\n\n      const DELAY_TO_SHOW_TOOLTIP = 100;\n      const signal = this.#editor._uiManager._signal;\n      signal.addEventListener(\n        \"abort\",\n        () => {\n          clearTimeout(this.#altTextTooltipTimeout);\n          this.#altTextTooltipTimeout = null;\n        },\n        { once: true }\n      );\n      button.addEventListener(\n        \"mouseenter\",\n        () => {\n          this.#altTextTooltipTimeout = setTimeout(() => {\n            this.#altTextTooltipTimeout = null;\n            this.#altTextTooltip.classList.add(\"show\");\n            this.#editor._reportTelemetry({\n              action: \"alt_text_tooltip\",\n            });\n          }, DELAY_TO_SHOW_TOOLTIP);\n        },\n        { signal }\n      );\n      button.addEventListener(\n        \"mouseleave\",\n        () => {\n          if (this.#altTextTooltipTimeout) {\n            clearTimeout(this.#altTextTooltipTimeout);\n            this.#altTextTooltipTimeout = null;\n          }\n          this.#altTextTooltip?.classList.remove(\"show\");\n        },\n        { signal }\n      );\n    }\n    if (this.#altTextDecorative) {\n      tooltip.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-editor-alt-text-decorative-tooltip\"\n      );\n    } else {\n      tooltip.removeAttribute(\"data-l10n-id\");\n      tooltip.textContent = this.#altText;\n    }\n\n    if (!tooltip.parentNode) {\n      button.append(tooltip);\n    }\n\n    const element = this.#editor.getImageForAltText();\n    element?.setAttribute(\"aria-describedby\", tooltip.id);\n  }\n}\n\nexport { AltText };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { shadow } from \"../shared/util.js\";\nimport { stopEvent } from \"./display_utils.js\";\n\nclass TouchManager {\n  #container;\n\n  #isPinching = false;\n\n  #isPinchingStopped = null;\n\n  #isPinchingDisabled;\n\n  #onPinchStart;\n\n  #onPinching;\n\n  #onPinchEnd;\n\n  #signal;\n\n  #touchInfo = null;\n\n  #touchManagerAC;\n\n  #touchMoveAC = null;\n\n  constructor({\n    container,\n    isPinchingDisabled = null,\n    isPinchingStopped = null,\n    onPinchStart = null,\n    onPinching = null,\n    onPinchEnd = null,\n    signal,\n  }) {\n    this.#container = container;\n    this.#isPinchingStopped = isPinchingStopped;\n    this.#isPinchingDisabled = isPinchingDisabled;\n    this.#onPinchStart = onPinchStart;\n    this.#onPinching = onPinching;\n    this.#onPinchEnd = onPinchEnd;\n    this.#touchManagerAC = new AbortController();\n    this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]);\n\n    container.addEventListener(\"touchstart\", this.#onTouchStart.bind(this), {\n      passive: false,\n      signal: this.#signal,\n    });\n  }\n\n  get MIN_TOUCH_DISTANCE_TO_PINCH() {\n    // The 35 is coming from:\n    //  https://searchfox.org/mozilla-central/source/gfx/layers/apz/src/GestureEventListener.cpp#36\n    //\n    // The properties TouchEvent::screenX/Y are in screen CSS pixels:\n    //  https://developer.mozilla.org/en-US/docs/Web/API/Touch/screenX#examples\n    // MIN_TOUCH_DISTANCE_TO_PINCH is in CSS pixels.\n    return shadow(\n      this,\n      \"MIN_TOUCH_DISTANCE_TO_PINCH\",\n      35 / (window.devicePixelRatio || 1)\n    );\n  }\n\n  #onTouchStart(evt) {\n    if (this.#isPinchingDisabled?.() || evt.touches.length < 2) {\n      return;\n    }\n\n    if (!this.#touchMoveAC) {\n      this.#touchMoveAC = new AbortController();\n      const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]);\n      const container = this.#container;\n      const opt = { signal, passive: false };\n      container.addEventListener(\n        \"touchmove\",\n        this.#onTouchMove.bind(this),\n        opt\n      );\n      container.addEventListener(\"touchend\", this.#onTouchEnd.bind(this), opt);\n      container.addEventListener(\n        \"touchcancel\",\n        this.#onTouchEnd.bind(this),\n        opt\n      );\n      this.#onPinchStart?.();\n    }\n\n    stopEvent(evt);\n\n    if (evt.touches.length !== 2 || this.#isPinchingStopped?.()) {\n      this.#touchInfo = null;\n      return;\n    }\n\n    let [touch0, touch1] = evt.touches;\n    if (touch0.identifier > touch1.identifier) {\n      [touch0, touch1] = [touch1, touch0];\n    }\n    this.#touchInfo = {\n      touch0X: touch0.screenX,\n      touch0Y: touch0.screenY,\n      touch1X: touch1.screenX,\n      touch1Y: touch1.screenY,\n    };\n  }\n\n  #onTouchMove(evt) {\n    if (!this.#touchInfo || evt.touches.length !== 2) {\n      return;\n    }\n\n    let [touch0, touch1] = evt.touches;\n    if (touch0.identifier > touch1.identifier) {\n      [touch0, touch1] = [touch1, touch0];\n    }\n    const { screenX: screen0X, screenY: screen0Y } = touch0;\n    const { screenX: screen1X, screenY: screen1Y } = touch1;\n    const touchInfo = this.#touchInfo;\n    const {\n      touch0X: pTouch0X,\n      touch0Y: pTouch0Y,\n      touch1X: pTouch1X,\n      touch1Y: pTouch1Y,\n    } = touchInfo;\n\n    const prevGapX = pTouch1X - pTouch0X;\n    const prevGapY = pTouch1Y - pTouch0Y;\n    const currGapX = screen1X - screen0X;\n    const currGapY = screen1Y - screen0Y;\n\n    const distance = Math.hypot(currGapX, currGapY) || 1;\n    const pDistance = Math.hypot(prevGapX, prevGapY) || 1;\n    if (\n      !this.#isPinching &&\n      Math.abs(pDistance - distance) <= TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH\n    ) {\n      return;\n    }\n\n    touchInfo.touch0X = screen0X;\n    touchInfo.touch0Y = screen0Y;\n    touchInfo.touch1X = screen1X;\n    touchInfo.touch1Y = screen1Y;\n\n    evt.preventDefault();\n\n    if (!this.#isPinching) {\n      // Start pinching.\n      this.#isPinching = true;\n\n      // We return here else the first pinch is a bit too much\n      return;\n    }\n\n    const origin = [(screen0X + screen1X) / 2, (screen0Y + screen1Y) / 2];\n    this.#onPinching?.(origin, pDistance, distance);\n  }\n\n  #onTouchEnd(evt) {\n    this.#touchMoveAC.abort();\n    this.#touchMoveAC = null;\n    this.#onPinchEnd?.();\n\n    if (!this.#touchInfo) {\n      return;\n    }\n\n    evt.preventDefault();\n    this.#touchInfo = null;\n    this.#isPinching = false;\n  }\n\n  destroy() {\n    this.#touchManagerAC?.abort();\n    this.#touchManagerAC = null;\n  }\n}\n\nexport { TouchManager };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n  AnnotationEditorUIManager,\n  bindEvents,\n  ColorManager,\n  KeyboardManager,\n} from \"./tools.js\";\nimport { FeatureTest, shadow, unreachable } from \"../../shared/util.js\";\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\nimport { AltText } from \"./alt_text.js\";\nimport { EditorToolbar } from \"./toolbar.js\";\nimport { TouchManager } from \"../touch_manager.js\";\n\n/**\n * @typedef {Object} AnnotationEditorParameters\n * @property {AnnotationEditorUIManager} uiManager - the global manager\n * @property {AnnotationEditorLayer} parent - the layer containing this editor\n * @property {string} id - editor id\n * @property {number} x - x-coordinate\n * @property {number} y - y-coordinate\n */\n\n/**\n * Base class for editors.\n */\nclass AnnotationEditor {\n  #accessibilityData = null;\n\n  #allResizerDivs = null;\n\n  #altText = null;\n\n  #disabled = false;\n\n  #dragPointerId = null;\n\n  #dragPointerType = \"\";\n\n  #keepAspectRatio = false;\n\n  #resizersDiv = null;\n\n  #lastPointerCoords = null;\n\n  #savedDimensions = null;\n\n  #focusAC = null;\n\n  #focusedResizerName = \"\";\n\n  #hasBeenClicked = false;\n\n  #initialRect = null;\n\n  #isEditing = false;\n\n  #isInEditMode = false;\n\n  #isResizerEnabledForKeyboard = false;\n\n  #moveInDOMTimeout = null;\n\n  #prevDragX = 0;\n\n  #prevDragY = 0;\n\n  #telemetryTimeouts = null;\n\n  #touchManager = null;\n\n  _editToolbar = null;\n\n  _initialOptions = Object.create(null);\n\n  _initialData = null;\n\n  _isVisible = true;\n\n  _uiManager = null;\n\n  _focusEventsAllowed = true;\n\n  static _l10n = null;\n\n  static _l10nResizer = null;\n\n  #isDraggable = false;\n\n  #zIndex = AnnotationEditor._zIndex++;\n\n  static _borderLineWidth = -1;\n\n  static _colorManager = new ColorManager();\n\n  static _zIndex = 1;\n\n  // Time to wait (in ms) before sending the telemetry data.\n  // We wait a bit to avoid sending too many requests when changing something\n  // like the thickness of a line.\n  static _telemetryTimeout = 1000;\n\n  static get _resizerKeyboardManager() {\n    const resize = AnnotationEditor.prototype._resizeWithKeyboard;\n    const small = AnnotationEditorUIManager.TRANSLATE_SMALL;\n    const big = AnnotationEditorUIManager.TRANSLATE_BIG;\n\n    return shadow(\n      this,\n      \"_resizerKeyboardManager\",\n      new KeyboardManager([\n        [[\"ArrowLeft\", \"mac+ArrowLeft\"], resize, { args: [-small, 0] }],\n        [\n          [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n          resize,\n          { args: [-big, 0] },\n        ],\n        [[\"ArrowRight\", \"mac+ArrowRight\"], resize, { args: [small, 0] }],\n        [\n          [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n          resize,\n          { args: [big, 0] },\n        ],\n        [[\"ArrowUp\", \"mac+ArrowUp\"], resize, { args: [0, -small] }],\n        [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], resize, { args: [0, -big] }],\n        [[\"ArrowDown\", \"mac+ArrowDown\"], resize, { args: [0, small] }],\n        [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], resize, { args: [0, big] }],\n        [\n          [\"Escape\", \"mac+Escape\"],\n          AnnotationEditor.prototype._stopResizingWithKeyboard,\n        ],\n      ])\n    );\n  }\n\n  /**\n   * @param {AnnotationEditorParameters} parameters\n   */\n  constructor(parameters) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === AnnotationEditor\n    ) {\n      unreachable(\"Cannot initialize AnnotationEditor.\");\n    }\n\n    this.parent = parameters.parent;\n    this.id = parameters.id;\n    this.width = this.height = null;\n    this.pageIndex = parameters.parent.pageIndex;\n    this.name = parameters.name;\n    this.div = null;\n    this._uiManager = parameters.uiManager;\n    this.annotationElementId = null;\n    this._willKeepAspectRatio = false;\n    this._initialOptions.isCentered = parameters.isCentered;\n    this._structTreeParentId = null;\n\n    const {\n      rotation,\n      rawDims: { pageWidth, pageHeight, pageX, pageY },\n    } = this.parent.viewport;\n\n    this.rotation = rotation;\n    this.pageRotation =\n      (360 + rotation - this._uiManager.viewParameters.rotation) % 360;\n    this.pageDimensions = [pageWidth, pageHeight];\n    this.pageTranslation = [pageX, pageY];\n\n    const [width, height] = this.parentDimensions;\n    this.x = parameters.x / width;\n    this.y = parameters.y / height;\n\n    this.isAttachedToDOM = false;\n    this.deleted = false;\n  }\n\n  get editorType() {\n    return Object.getPrototypeOf(this).constructor._type;\n  }\n\n  static get isDrawer() {\n    return false;\n  }\n\n  static get _defaultLineColor() {\n    return shadow(\n      this,\n      \"_defaultLineColor\",\n      this._colorManager.getHexCode(\"CanvasText\")\n    );\n  }\n\n  static deleteAnnotationElement(editor) {\n    const fakeEditor = new FakeEditor({\n      id: editor.parent.getNextId(),\n      parent: editor.parent,\n      uiManager: editor._uiManager,\n    });\n    fakeEditor.annotationElementId = editor.annotationElementId;\n    fakeEditor.deleted = true;\n    fakeEditor._uiManager.addToAnnotationStorage(fakeEditor);\n  }\n\n  /**\n   * Initialize the l10n stuff for this type of editor.\n   * @param {Object} l10n\n   */\n  static initialize(l10n, _uiManager) {\n    AnnotationEditor._l10n ??= l10n;\n\n    AnnotationEditor._l10nResizer ||= Object.freeze({\n      topLeft: \"pdfjs-editor-resizer-top-left\",\n      topMiddle: \"pdfjs-editor-resizer-top-middle\",\n      topRight: \"pdfjs-editor-resizer-top-right\",\n      middleRight: \"pdfjs-editor-resizer-middle-right\",\n      bottomRight: \"pdfjs-editor-resizer-bottom-right\",\n      bottomMiddle: \"pdfjs-editor-resizer-bottom-middle\",\n      bottomLeft: \"pdfjs-editor-resizer-bottom-left\",\n      middleLeft: \"pdfjs-editor-resizer-middle-left\",\n    });\n\n    if (AnnotationEditor._borderLineWidth !== -1) {\n      return;\n    }\n    const style = getComputedStyle(document.documentElement);\n    AnnotationEditor._borderLineWidth =\n      parseFloat(style.getPropertyValue(\"--outline-width\")) || 0;\n  }\n\n  /**\n   * Update the default parameters for this type of editor.\n   * @param {number} _type\n   * @param {*} _value\n   */\n  static updateDefaultParams(_type, _value) {}\n\n  /**\n   * Get the default properties to set in the UI for this type of editor.\n   * @returns {Array}\n   */\n  static get defaultPropertiesToUpdate() {\n    return [];\n  }\n\n  /**\n   * Check if this kind of editor is able to handle the given mime type for\n   * pasting.\n   * @param {string} mime\n   * @returns {boolean}\n   */\n  static isHandlingMimeForPasting(mime) {\n    return false;\n  }\n\n  /**\n   * Extract the data from the clipboard item and delegate the creation of the\n   * editor to the parent.\n   * @param {DataTransferItem} item\n   * @param {AnnotationEditorLayer} parent\n   */\n  static paste(item, parent) {\n    unreachable(\"Not implemented\");\n  }\n\n  /**\n   * Get the properties to update in the UI for this editor.\n   * @returns {Array}\n   */\n  get propertiesToUpdate() {\n    return [];\n  }\n\n  get _isDraggable() {\n    return this.#isDraggable;\n  }\n\n  set _isDraggable(value) {\n    this.#isDraggable = value;\n    this.div?.classList.toggle(\"draggable\", value);\n  }\n\n  /**\n   * @returns {boolean} true if the editor handles the Enter key itself.\n   */\n  get isEnterHandled() {\n    return true;\n  }\n\n  center() {\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    switch (this.parentRotation) {\n      case 90:\n        this.x -= (this.height * pageHeight) / (pageWidth * 2);\n        this.y += (this.width * pageWidth) / (pageHeight * 2);\n        break;\n      case 180:\n        this.x += this.width / 2;\n        this.y += this.height / 2;\n        break;\n      case 270:\n        this.x += (this.height * pageHeight) / (pageWidth * 2);\n        this.y -= (this.width * pageWidth) / (pageHeight * 2);\n        break;\n      default:\n        this.x -= this.width / 2;\n        this.y -= this.height / 2;\n        break;\n    }\n    this.fixAndSetPosition();\n  }\n\n  /**\n   * Add some commands into the CommandManager (undo/redo stuff).\n   * @param {Object} params\n   */\n  addCommands(params) {\n    this._uiManager.addCommands(params);\n  }\n\n  get currentLayer() {\n    return this._uiManager.currentLayer;\n  }\n\n  /**\n   * This editor will be behind the others.\n   */\n  setInBackground() {\n    this.div.style.zIndex = 0;\n  }\n\n  /**\n   * This editor will be in the foreground.\n   */\n  setInForeground() {\n    this.div.style.zIndex = this.#zIndex;\n  }\n\n  setParent(parent) {\n    if (parent !== null) {\n      this.pageIndex = parent.pageIndex;\n      this.pageDimensions = parent.pageDimensions;\n    } else {\n      // The editor is being removed from the DOM, so we need to stop resizing.\n      this.#stopResizing();\n    }\n    this.parent = parent;\n  }\n\n  /**\n   * onfocus callback.\n   */\n  focusin(event) {\n    if (!this._focusEventsAllowed) {\n      return;\n    }\n    if (!this.#hasBeenClicked) {\n      this.parent.setSelected(this);\n    } else {\n      this.#hasBeenClicked = false;\n    }\n  }\n\n  /**\n   * onblur callback.\n   * @param {FocusEvent} event\n   */\n  focusout(event) {\n    if (!this._focusEventsAllowed) {\n      return;\n    }\n\n    if (!this.isAttachedToDOM) {\n      return;\n    }\n\n    // In case of focusout, the relatedTarget is the element which\n    // is grabbing the focus.\n    // So if the related target is an element under the div for this\n    // editor, then the editor isn't unactive.\n    const target = event.relatedTarget;\n    if (target?.closest(`#${this.id}`)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (!this.parent?.isMultipleSelection) {\n      this.commitOrRemove();\n    }\n  }\n\n  commitOrRemove() {\n    if (this.isEmpty()) {\n      this.remove();\n    } else {\n      this.commit();\n    }\n  }\n\n  /**\n   * Commit the data contained in this editor.\n   */\n  commit() {\n    this.addToAnnotationStorage();\n  }\n\n  addToAnnotationStorage() {\n    this._uiManager.addToAnnotationStorage(this);\n  }\n\n  /**\n   * Set the editor position within its parent.\n   * @param {number} x\n   * @param {number} y\n   * @param {number} tx - x-translation in screen coordinates.\n   * @param {number} ty - y-translation in screen coordinates.\n   */\n  setAt(x, y, tx, ty) {\n    const [width, height] = this.parentDimensions;\n    [tx, ty] = this.screenToPageTranslation(tx, ty);\n\n    this.x = (x + tx) / width;\n    this.y = (y + ty) / height;\n\n    this.fixAndSetPosition();\n  }\n\n  #translate([width, height], x, y) {\n    [x, y] = this.screenToPageTranslation(x, y);\n\n    this.x += x / width;\n    this.y += y / height;\n\n    this._onTranslating(this.x, this.y);\n\n    this.fixAndSetPosition();\n  }\n\n  /**\n   * Translate the editor position within its parent.\n   * @param {number} x - x-translation in screen coordinates.\n   * @param {number} y - y-translation in screen coordinates.\n   */\n  translate(x, y) {\n    // We don't change the initial position because the move here hasn't been\n    // done by the user.\n    this.#translate(this.parentDimensions, x, y);\n  }\n\n  /**\n   * Translate the editor position within its page and adjust the scroll\n   * in order to have the editor in the view.\n   * @param {number} x - x-translation in page coordinates.\n   * @param {number} y - y-translation in page coordinates.\n   */\n  translateInPage(x, y) {\n    this.#initialRect ||= [this.x, this.y, this.width, this.height];\n    this.#translate(this.pageDimensions, x, y);\n    this.div.scrollIntoView({ block: \"nearest\" });\n  }\n\n  drag(tx, ty) {\n    this.#initialRect ||= [this.x, this.y, this.width, this.height];\n    const {\n      div,\n      parentDimensions: [parentWidth, parentHeight],\n    } = this;\n    this.x += tx / parentWidth;\n    this.y += ty / parentHeight;\n    if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {\n      // It's possible to not have a parent: for example, when the user is\n      // dragging all the selected editors but this one on a page which has been\n      // destroyed.\n      // It's why we need to check for it. In such a situation, it isn't really\n      // a problem to not find a new parent: it's something which is related to\n      // what the user is seeing, hence it depends on how pages are layed out.\n\n      // The element will be outside of its parent so change the parent.\n      const { x, y } = this.div.getBoundingClientRect();\n      if (this.parent.findNewParent(this, x, y)) {\n        this.x -= Math.floor(this.x);\n        this.y -= Math.floor(this.y);\n      }\n    }\n\n    // The editor can be moved wherever the user wants, so we don't need to fix\n    // the position: it'll be done when the user will release the mouse button.\n\n    let { x, y } = this;\n    const [bx, by] = this.getBaseTranslation();\n    x += bx;\n    y += by;\n\n    const { style } = div;\n    style.left = `${(100 * x).toFixed(2)}%`;\n    style.top = `${(100 * y).toFixed(2)}%`;\n\n    this._onTranslating(x, y);\n\n    div.scrollIntoView({ block: \"nearest\" });\n  }\n\n  /**\n   * Called when the editor is being translated.\n   * @param {number} x - in page coordinates.\n   * @param {number} y - in page coordinates.\n   */\n  _onTranslating(x, y) {}\n\n  /**\n   * Called when the editor has been translated.\n   * @param {number} x - in page coordinates.\n   * @param {number} y - in page coordinates.\n   */\n  _onTranslated(x, y) {}\n\n  get _hasBeenMoved() {\n    return (\n      !!this.#initialRect &&\n      (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y)\n    );\n  }\n\n  get _hasBeenResized() {\n    return (\n      !!this.#initialRect &&\n      (this.#initialRect[2] !== this.width ||\n        this.#initialRect[3] !== this.height)\n    );\n  }\n\n  /**\n   * Get the translation to take into account the editor border.\n   * The CSS engine positions the element by taking the border into account so\n   * we must apply the opposite translation to have the editor in the right\n   * position.\n   * @returns {Array<number>}\n   */\n  getBaseTranslation() {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const { _borderLineWidth } = AnnotationEditor;\n    const x = _borderLineWidth / parentWidth;\n    const y = _borderLineWidth / parentHeight;\n    switch (this.rotation) {\n      case 90:\n        return [-x, y];\n      case 180:\n        return [x, y];\n      case 270:\n        return [x, -y];\n      default:\n        return [-x, -y];\n    }\n  }\n\n  /**\n   * @returns {boolean} true if position must be fixed (i.e. make the x and y\n   * living in the page).\n   */\n  get _mustFixPosition() {\n    return true;\n  }\n\n  /**\n   * Fix the position of the editor in order to keep it inside its parent page.\n   * @param {number} [rotation] - the rotation of the page.\n   */\n  fixAndSetPosition(rotation = this.rotation) {\n    const {\n      div: { style },\n      pageDimensions: [pageWidth, pageHeight],\n    } = this;\n    let { x, y, width, height } = this;\n    width *= pageWidth;\n    height *= pageHeight;\n    x *= pageWidth;\n    y *= pageHeight;\n\n    if (this._mustFixPosition) {\n      switch (rotation) {\n        case 0:\n          x = Math.max(0, Math.min(pageWidth - width, x));\n          y = Math.max(0, Math.min(pageHeight - height, y));\n          break;\n        case 90:\n          x = Math.max(0, Math.min(pageWidth - height, x));\n          y = Math.min(pageHeight, Math.max(width, y));\n          break;\n        case 180:\n          x = Math.min(pageWidth, Math.max(width, x));\n          y = Math.min(pageHeight, Math.max(height, y));\n          break;\n        case 270:\n          x = Math.min(pageWidth, Math.max(height, x));\n          y = Math.max(0, Math.min(pageHeight - width, y));\n          break;\n      }\n    }\n\n    this.x = x /= pageWidth;\n    this.y = y /= pageHeight;\n\n    const [bx, by] = this.getBaseTranslation();\n    x += bx;\n    y += by;\n\n    style.left = `${(100 * x).toFixed(2)}%`;\n    style.top = `${(100 * y).toFixed(2)}%`;\n\n    this.moveInDOM();\n  }\n\n  static #rotatePoint(x, y, angle) {\n    switch (angle) {\n      case 90:\n        return [y, -x];\n      case 180:\n        return [-x, -y];\n      case 270:\n        return [-y, x];\n      default:\n        return [x, y];\n    }\n  }\n\n  /**\n   * Convert a screen translation into a page one.\n   * @param {number} x\n   * @param {number} y\n   */\n  screenToPageTranslation(x, y) {\n    return AnnotationEditor.#rotatePoint(x, y, this.parentRotation);\n  }\n\n  /**\n   * Convert a page translation into a screen one.\n   * @param {number} x\n   * @param {number} y\n   */\n  pageTranslationToScreen(x, y) {\n    return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation);\n  }\n\n  #getRotationMatrix(rotation) {\n    switch (rotation) {\n      case 90: {\n        const [pageWidth, pageHeight] = this.pageDimensions;\n        return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0];\n      }\n      case 180:\n        return [-1, 0, 0, -1];\n      case 270: {\n        const [pageWidth, pageHeight] = this.pageDimensions;\n        return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0];\n      }\n      default:\n        return [1, 0, 0, 1];\n    }\n  }\n\n  get parentScale() {\n    return this._uiManager.viewParameters.realScale;\n  }\n\n  get parentRotation() {\n    return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;\n  }\n\n  get parentDimensions() {\n    const {\n      parentScale,\n      pageDimensions: [pageWidth, pageHeight],\n    } = this;\n    return [pageWidth * parentScale, pageHeight * parentScale];\n  }\n\n  /**\n   * Set the dimensions of this editor.\n   * @param {number} width\n   * @param {number} height\n   */\n  setDims(width, height) {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const { style } = this.div;\n    style.width = `${((100 * width) / parentWidth).toFixed(2)}%`;\n    if (!this.#keepAspectRatio) {\n      style.height = `${((100 * height) / parentHeight).toFixed(2)}%`;\n    }\n  }\n\n  fixDims() {\n    const { style } = this.div;\n    const { height, width } = style;\n    const widthPercent = width.endsWith(\"%\");\n    const heightPercent = !this.#keepAspectRatio && height.endsWith(\"%\");\n    if (widthPercent && heightPercent) {\n      return;\n    }\n\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    if (!widthPercent) {\n      style.width = `${((100 * parseFloat(width)) / parentWidth).toFixed(2)}%`;\n    }\n    if (!this.#keepAspectRatio && !heightPercent) {\n      style.height = `${((100 * parseFloat(height)) / parentHeight).toFixed(2)}%`;\n    }\n  }\n\n  /**\n   * Get the translation used to position this editor when it's created.\n   * @returns {Array<number>}\n   */\n  getInitialTranslation() {\n    return [0, 0];\n  }\n\n  #createResizers() {\n    if (this.#resizersDiv) {\n      return;\n    }\n    this.#resizersDiv = document.createElement(\"div\");\n    this.#resizersDiv.classList.add(\"resizers\");\n    // When the resizers are used with the keyboard, they're focusable, hence\n    // we want to have them in this order (top left, top middle, top right, ...)\n    // in the DOM to have the focus order correct.\n    const classes = this._willKeepAspectRatio\n      ? [\"topLeft\", \"topRight\", \"bottomRight\", \"bottomLeft\"]\n      : [\n          \"topLeft\",\n          \"topMiddle\",\n          \"topRight\",\n          \"middleRight\",\n          \"bottomRight\",\n          \"bottomMiddle\",\n          \"bottomLeft\",\n          \"middleLeft\",\n        ];\n    const signal = this._uiManager._signal;\n    for (const name of classes) {\n      const div = document.createElement(\"div\");\n      this.#resizersDiv.append(div);\n      div.classList.add(\"resizer\", name);\n      div.setAttribute(\"data-resizer-name\", name);\n      div.addEventListener(\n        \"pointerdown\",\n        this.#resizerPointerdown.bind(this, name),\n        { signal }\n      );\n      div.addEventListener(\"contextmenu\", noContextMenu, { signal });\n      div.tabIndex = -1;\n    }\n    this.div.prepend(this.#resizersDiv);\n  }\n\n  #resizerPointerdown(name, event) {\n    event.preventDefault();\n    const { isMac } = FeatureTest.platform;\n    if (event.button !== 0 || (event.ctrlKey && isMac)) {\n      return;\n    }\n\n    this.#altText?.toggle(false);\n\n    const savedDraggable = this._isDraggable;\n    this._isDraggable = false;\n    this.#lastPointerCoords = [event.screenX, event.screenY];\n\n    const ac = new AbortController();\n    const signal = this._uiManager.combinedSignal(ac);\n\n    this.parent.togglePointerEvents(false);\n    window.addEventListener(\n      \"pointermove\",\n      this.#resizerPointermove.bind(this, name),\n      { passive: true, capture: true, signal }\n    );\n    window.addEventListener(\n      \"touchmove\",\n      stopEvent /* Prevent the page from scrolling */,\n      { passive: false, signal }\n    );\n    window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    this.#savedDimensions = {\n      savedX: this.x,\n      savedY: this.y,\n      savedWidth: this.width,\n      savedHeight: this.height,\n    };\n    const savedParentCursor = this.parent.div.style.cursor;\n    const savedCursor = this.div.style.cursor;\n    this.div.style.cursor = this.parent.div.style.cursor =\n      window.getComputedStyle(event.target).cursor;\n\n    const pointerUpCallback = () => {\n      ac.abort();\n      this.parent.togglePointerEvents(true);\n      this.#altText?.toggle(true);\n      this._isDraggable = savedDraggable;\n      this.parent.div.style.cursor = savedParentCursor;\n      this.div.style.cursor = savedCursor;\n\n      this.#addResizeToUndoStack();\n    };\n    window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n    // If the user switches to another window (with alt+tab), then we end the\n    // resize session.\n    window.addEventListener(\"blur\", pointerUpCallback, { signal });\n  }\n\n  #resize(x, y, width, height) {\n    this.width = width;\n    this.height = height;\n    this.x = x;\n    this.y = y;\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    this.setDims(parentWidth * width, parentHeight * height);\n    this.fixAndSetPosition();\n    this._onResized();\n  }\n\n  /**\n   * Called when the editor has been resized.\n   */\n  _onResized() {}\n\n  #addResizeToUndoStack() {\n    if (!this.#savedDimensions) {\n      return;\n    }\n    const { savedX, savedY, savedWidth, savedHeight } = this.#savedDimensions;\n    this.#savedDimensions = null;\n\n    const newX = this.x;\n    const newY = this.y;\n    const newWidth = this.width;\n    const newHeight = this.height;\n    if (\n      newX === savedX &&\n      newY === savedY &&\n      newWidth === savedWidth &&\n      newHeight === savedHeight\n    ) {\n      return;\n    }\n\n    this.addCommands({\n      cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight),\n      undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight),\n      mustExec: true,\n    });\n  }\n\n  static _round(x) {\n    // 10000 because we multiply by 100 and use toFixed(2) in fixAndSetPosition.\n    // Without rounding, the positions of the corners other than the top left\n    // one can be slightly wrong.\n    return Math.round(x * 10000) / 10000;\n  }\n\n  #resizerPointermove(name, event) {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const savedX = this.x;\n    const savedY = this.y;\n    const savedWidth = this.width;\n    const savedHeight = this.height;\n    const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n    const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n\n    const rotationMatrix = this.#getRotationMatrix(this.rotation);\n    const transf = (x, y) => [\n      rotationMatrix[0] * x + rotationMatrix[2] * y,\n      rotationMatrix[1] * x + rotationMatrix[3] * y,\n    ];\n    const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation);\n    const invTransf = (x, y) => [\n      invRotationMatrix[0] * x + invRotationMatrix[2] * y,\n      invRotationMatrix[1] * x + invRotationMatrix[3] * y,\n    ];\n    let getPoint;\n    let getOpposite;\n    let isDiagonal = false;\n    let isHorizontal = false;\n\n    switch (name) {\n      case \"topLeft\":\n        isDiagonal = true;\n        getPoint = (w, h) => [0, 0];\n        getOpposite = (w, h) => [w, h];\n        break;\n      case \"topMiddle\":\n        getPoint = (w, h) => [w / 2, 0];\n        getOpposite = (w, h) => [w / 2, h];\n        break;\n      case \"topRight\":\n        isDiagonal = true;\n        getPoint = (w, h) => [w, 0];\n        getOpposite = (w, h) => [0, h];\n        break;\n      case \"middleRight\":\n        isHorizontal = true;\n        getPoint = (w, h) => [w, h / 2];\n        getOpposite = (w, h) => [0, h / 2];\n        break;\n      case \"bottomRight\":\n        isDiagonal = true;\n        getPoint = (w, h) => [w, h];\n        getOpposite = (w, h) => [0, 0];\n        break;\n      case \"bottomMiddle\":\n        getPoint = (w, h) => [w / 2, h];\n        getOpposite = (w, h) => [w / 2, 0];\n        break;\n      case \"bottomLeft\":\n        isDiagonal = true;\n        getPoint = (w, h) => [0, h];\n        getOpposite = (w, h) => [w, 0];\n        break;\n      case \"middleLeft\":\n        isHorizontal = true;\n        getPoint = (w, h) => [0, h / 2];\n        getOpposite = (w, h) => [w, h / 2];\n        break;\n    }\n\n    const point = getPoint(savedWidth, savedHeight);\n    const oppositePoint = getOpposite(savedWidth, savedHeight);\n    let transfOppositePoint = transf(...oppositePoint);\n    const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]);\n    const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]);\n    let ratioX = 1;\n    let ratioY = 1;\n\n    let deltaX, deltaY;\n\n    if (!event.fromKeyboard) {\n      // We can't use event.movementX/Y because they're not reliable:\n      //  https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX\n      // (it was buggy on a laptop with a touch screen).\n      const { screenX, screenY } = event;\n      const [lastScreenX, lastScreenY] = this.#lastPointerCoords;\n      [deltaX, deltaY] = this.screenToPageTranslation(\n        screenX - lastScreenX,\n        screenY - lastScreenY\n      );\n      this.#lastPointerCoords[0] = screenX;\n      this.#lastPointerCoords[1] = screenY;\n    } else {\n      ({ deltaX, deltaY } = event);\n    }\n    [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight);\n\n    if (isDiagonal) {\n      const oldDiag = Math.hypot(savedWidth, savedHeight);\n      ratioX = ratioY = Math.max(\n        Math.min(\n          Math.hypot(\n            oppositePoint[0] - point[0] - deltaX,\n            oppositePoint[1] - point[1] - deltaY\n          ) / oldDiag,\n          // Avoid the editor to be larger than the page.\n          1 / savedWidth,\n          1 / savedHeight\n        ),\n        // Avoid the editor to be smaller than the minimum size.\n        minWidth / savedWidth,\n        minHeight / savedHeight\n      );\n    } else if (isHorizontal) {\n      ratioX =\n        Math.max(\n          minWidth,\n          Math.min(1, Math.abs(oppositePoint[0] - point[0] - deltaX))\n        ) / savedWidth;\n    } else {\n      ratioY =\n        Math.max(\n          minHeight,\n          Math.min(1, Math.abs(oppositePoint[1] - point[1] - deltaY))\n        ) / savedHeight;\n    }\n\n    const newWidth = AnnotationEditor._round(savedWidth * ratioX);\n    const newHeight = AnnotationEditor._round(savedHeight * ratioY);\n    transfOppositePoint = transf(...getOpposite(newWidth, newHeight));\n    const newX = oppositeX - transfOppositePoint[0];\n    const newY = oppositeY - transfOppositePoint[1];\n\n    this.#initialRect ||= [this.x, this.y, this.width, this.height];\n    this.width = newWidth;\n    this.height = newHeight;\n    this.x = newX;\n    this.y = newY;\n\n    this.setDims(parentWidth * newWidth, parentHeight * newHeight);\n    this.fixAndSetPosition();\n\n    this._onResizing();\n  }\n\n  /**\n   * Called when the editor is being resized.\n   */\n  _onResizing() {}\n\n  /**\n   * Called when the alt text dialog is closed.\n   */\n  altTextFinish() {\n    this.#altText?.finish();\n  }\n\n  /**\n   * Add a toolbar for this editor.\n   * @returns {Promise<EditorToolbar|null>}\n   */\n  async addEditToolbar() {\n    if (this._editToolbar || this.#isInEditMode) {\n      return this._editToolbar;\n    }\n    this._editToolbar = new EditorToolbar(this);\n    this.div.append(this._editToolbar.render());\n    if (this.#altText) {\n      await this._editToolbar.addAltText(this.#altText);\n    }\n\n    return this._editToolbar;\n  }\n\n  removeEditToolbar() {\n    if (!this._editToolbar) {\n      return;\n    }\n    this._editToolbar.remove();\n    this._editToolbar = null;\n\n    // We destroy the alt text but we don't null it because we want to be able\n    // to restore it in case the user undoes the deletion.\n    this.#altText?.destroy();\n  }\n\n  addContainer(container) {\n    const editToolbarDiv = this._editToolbar?.div;\n    if (editToolbarDiv) {\n      editToolbarDiv.before(container);\n    } else {\n      this.div.append(container);\n    }\n  }\n\n  getClientDimensions() {\n    return this.div.getBoundingClientRect();\n  }\n\n  async addAltTextButton() {\n    if (this.#altText) {\n      return;\n    }\n    AltText.initialize(AnnotationEditor._l10n);\n    this.#altText = new AltText(this);\n    if (this.#accessibilityData) {\n      this.#altText.data = this.#accessibilityData;\n      this.#accessibilityData = null;\n    }\n    await this.addEditToolbar();\n  }\n\n  get altTextData() {\n    return this.#altText?.data;\n  }\n\n  /**\n   * Set the alt text data.\n   */\n  set altTextData(data) {\n    if (!this.#altText) {\n      return;\n    }\n    this.#altText.data = data;\n  }\n\n  get guessedAltText() {\n    return this.#altText?.guessedText;\n  }\n\n  async setGuessedAltText(text) {\n    await this.#altText?.setGuessedText(text);\n  }\n\n  serializeAltText(isForCopying) {\n    return this.#altText?.serialize(isForCopying);\n  }\n\n  hasAltText() {\n    return !!this.#altText && !this.#altText.isEmpty();\n  }\n\n  hasAltTextData() {\n    return this.#altText?.hasData() ?? false;\n  }\n\n  /**\n   * Render this editor in a div.\n   * @returns {HTMLDivElement | null}\n   */\n  render() {\n    this.div = document.createElement(\"div\");\n    this.div.setAttribute(\"data-editor-rotation\", (360 - this.rotation) % 360);\n    this.div.className = this.name;\n    this.div.setAttribute(\"id\", this.id);\n    this.div.tabIndex = this.#disabled ? -1 : 0;\n    if (!this._isVisible) {\n      this.div.classList.add(\"hidden\");\n    }\n\n    this.setInForeground();\n    this.#addFocusListeners();\n\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    if (this.parentRotation % 180 !== 0) {\n      this.div.style.maxWidth = `${((100 * parentHeight) / parentWidth).toFixed(\n        2\n      )}%`;\n      this.div.style.maxHeight = `${(\n        (100 * parentWidth) /\n        parentHeight\n      ).toFixed(2)}%`;\n    }\n\n    const [tx, ty] = this.getInitialTranslation();\n    this.translate(tx, ty);\n\n    bindEvents(this, this.div, [\"pointerdown\"]);\n\n    if (this.isResizable && this._uiManager._supportsPinchToZoom) {\n      this.#touchManager ||= new TouchManager({\n        container: this.div,\n        isPinchingDisabled: () => !this.isSelected,\n        onPinchStart: this.#touchPinchStartCallback.bind(this),\n        onPinching: this.#touchPinchCallback.bind(this),\n        onPinchEnd: this.#touchPinchEndCallback.bind(this),\n        signal: this._uiManager._signal,\n      });\n    }\n\n    this._uiManager._editorUndoBar?.hide();\n\n    return this.div;\n  }\n\n  #touchPinchStartCallback() {\n    this.#savedDimensions = {\n      savedX: this.x,\n      savedY: this.y,\n      savedWidth: this.width,\n      savedHeight: this.height,\n    };\n    this.#altText?.toggle(false);\n    this.parent.togglePointerEvents(false);\n  }\n\n  #touchPinchCallback(_origin, prevDistance, distance) {\n    // Slightly slow down the zooming because the editor could be small and the\n    // user could have difficulties to rescale it as they want.\n    const slowDownFactor = 0.7;\n    let factor =\n      slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor;\n    if (factor === 1) {\n      return;\n    }\n\n    const rotationMatrix = this.#getRotationMatrix(this.rotation);\n    const transf = (x, y) => [\n      rotationMatrix[0] * x + rotationMatrix[2] * y,\n      rotationMatrix[1] * x + rotationMatrix[3] * y,\n    ];\n\n    // The center of the editor is the fixed point.\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const savedX = this.x;\n    const savedY = this.y;\n    const savedWidth = this.width;\n    const savedHeight = this.height;\n\n    const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n    const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n    factor = Math.max(\n      Math.min(factor, 1 / savedWidth, 1 / savedHeight),\n      minWidth / savedWidth,\n      minHeight / savedHeight\n    );\n    const newWidth = AnnotationEditor._round(savedWidth * factor);\n    const newHeight = AnnotationEditor._round(savedHeight * factor);\n    if (newWidth === savedWidth && newHeight === savedHeight) {\n      return;\n    }\n\n    this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight];\n    const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2);\n    const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]);\n    const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]);\n    const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2);\n\n    this.x = centerX - newTransfCenterPoint[0];\n    this.y = centerY - newTransfCenterPoint[1];\n    this.width = newWidth;\n    this.height = newHeight;\n\n    this.setDims(parentWidth * newWidth, parentHeight * newHeight);\n    this.fixAndSetPosition();\n\n    this._onResizing();\n  }\n\n  #touchPinchEndCallback() {\n    this.#altText?.toggle(true);\n    this.parent.togglePointerEvents(true);\n    this.#addResizeToUndoStack();\n  }\n\n  /**\n   * Onpointerdown callback.\n   * @param {PointerEvent} event\n   */\n  pointerdown(event) {\n    const { isMac } = FeatureTest.platform;\n    if (event.button !== 0 || (event.ctrlKey && isMac)) {\n      // Avoid to focus this editor because of a non-left click.\n      event.preventDefault();\n      return;\n    }\n    this.#hasBeenClicked = true;\n\n    if (this._isDraggable) {\n      this.#setUpDragSession(event);\n      return;\n    }\n\n    this.#selectOnPointerEvent(event);\n  }\n\n  get isSelected() {\n    return this._uiManager.isSelected(this);\n  }\n\n  #selectOnPointerEvent(event) {\n    const { isMac } = FeatureTest.platform;\n    if (\n      (event.ctrlKey && !isMac) ||\n      event.shiftKey ||\n      (event.metaKey && isMac)\n    ) {\n      this.parent.toggleSelected(this);\n    } else {\n      this.parent.setSelected(this);\n    }\n  }\n\n  #setUpDragSession(event) {\n    const { isSelected } = this;\n    this._uiManager.setUpDragSession();\n    let hasDraggingStarted = false;\n\n    const ac = new AbortController();\n    const signal = this._uiManager.combinedSignal(ac);\n    const opts = { capture: true, passive: false, signal };\n    const cancelDrag = e => {\n      ac.abort();\n\n      this.#dragPointerId = null;\n      this.#hasBeenClicked = false;\n      if (!this._uiManager.endDragSession()) {\n        this.#selectOnPointerEvent(e);\n      }\n      if (hasDraggingStarted) {\n        this._onStopDragging();\n      }\n    };\n\n    if (isSelected) {\n      this.#prevDragX = event.clientX;\n      this.#prevDragY = event.clientY;\n      this.#dragPointerId = event.pointerId;\n      this.#dragPointerType = event.pointerType;\n      window.addEventListener(\n        \"pointermove\",\n        e => {\n          if (!hasDraggingStarted) {\n            hasDraggingStarted = true;\n            this._onStartDragging();\n          }\n          const { clientX: x, clientY: y, pointerId } = e;\n          if (pointerId !== this.#dragPointerId) {\n            stopEvent(e);\n            return;\n          }\n          const [tx, ty] = this.screenToPageTranslation(\n            x - this.#prevDragX,\n            y - this.#prevDragY\n          );\n          this.#prevDragX = x;\n          this.#prevDragY = y;\n          this._uiManager.dragSelectedEditors(tx, ty);\n        },\n        opts\n      );\n      window.addEventListener(\n        \"touchmove\",\n        stopEvent /* Prevent the page from scrolling */,\n        opts\n      );\n      window.addEventListener(\n        \"pointerdown\",\n        // If the user drags with one finger and then clicks with another.\n        e => {\n          if (e.pointerType === this.#dragPointerType) {\n            // We've a pinch to zoom session.\n            // We cannot have two primaries at the same time.\n            // It's possible to be in this state with Firefox and Gnome when\n            // trying to drag with three fingers (see bug 1933716).\n            if (this.#touchManager || e.isPrimary) {\n              cancelDrag(e);\n            }\n          }\n          stopEvent(e);\n        },\n        opts\n      );\n    }\n\n    const pointerUpCallback = e => {\n      if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) {\n        cancelDrag(e);\n        return;\n      }\n      stopEvent(e);\n    };\n    window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n    // If the user is using alt+tab during the dragging session, the pointerup\n    // event could be not fired, but a blur event is fired so we can use it in\n    // order to interrupt the dragging session.\n    window.addEventListener(\"blur\", pointerUpCallback, { signal });\n  }\n\n  _onStartDragging() {}\n\n  _onStopDragging() {}\n\n  moveInDOM() {\n    // Moving the editor in the DOM can be expensive, so we wait a bit before.\n    // It's important to not block the UI (for example when changing the font\n    // size in a FreeText).\n    if (this.#moveInDOMTimeout) {\n      clearTimeout(this.#moveInDOMTimeout);\n    }\n    this.#moveInDOMTimeout = setTimeout(() => {\n      this.#moveInDOMTimeout = null;\n      this.parent?.moveEditorInDOM(this);\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n        this._uiManager._eventBus.dispatch(\"editormovedindom\", {\n          source: this,\n        });\n      }\n    }, 0);\n  }\n\n  _setParentAndPosition(parent, x, y) {\n    parent.changeParent(this);\n    this.x = x;\n    this.y = y;\n    this.fixAndSetPosition();\n    this._onTranslated();\n  }\n\n  /**\n   * Convert the current rect into a page one.\n   * @param {number} tx - x-translation in screen coordinates.\n   * @param {number} ty - y-translation in screen coordinates.\n   * @param {number} [rotation] - the rotation of the page.\n   */\n  getRect(tx, ty, rotation = this.rotation) {\n    const scale = this.parentScale;\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    const [pageX, pageY] = this.pageTranslation;\n    const shiftX = tx / scale;\n    const shiftY = ty / scale;\n    const x = this.x * pageWidth;\n    const y = this.y * pageHeight;\n    const width = this.width * pageWidth;\n    const height = this.height * pageHeight;\n\n    switch (rotation) {\n      case 0:\n        return [\n          x + shiftX + pageX,\n          pageHeight - y - shiftY - height + pageY,\n          x + shiftX + width + pageX,\n          pageHeight - y - shiftY + pageY,\n        ];\n      case 90:\n        return [\n          x + shiftY + pageX,\n          pageHeight - y + shiftX + pageY,\n          x + shiftY + height + pageX,\n          pageHeight - y + shiftX + width + pageY,\n        ];\n      case 180:\n        return [\n          x - shiftX - width + pageX,\n          pageHeight - y + shiftY + pageY,\n          x - shiftX + pageX,\n          pageHeight - y + shiftY + height + pageY,\n        ];\n      case 270:\n        return [\n          x - shiftY - height + pageX,\n          pageHeight - y - shiftX - width + pageY,\n          x - shiftY + pageX,\n          pageHeight - y - shiftX + pageY,\n        ];\n      default:\n        throw new Error(\"Invalid rotation\");\n    }\n  }\n\n  getRectInCurrentCoords(rect, pageHeight) {\n    const [x1, y1, x2, y2] = rect;\n\n    const width = x2 - x1;\n    const height = y2 - y1;\n\n    switch (this.rotation) {\n      case 0:\n        return [x1, pageHeight - y2, width, height];\n      case 90:\n        return [x1, pageHeight - y1, height, width];\n      case 180:\n        return [x2, pageHeight - y1, width, height];\n      case 270:\n        return [x2, pageHeight - y2, height, width];\n      default:\n        throw new Error(\"Invalid rotation\");\n    }\n  }\n\n  /**\n   * Executed once this editor has been rendered.\n   * @param {boolean} focus - true if the editor should be focused.\n   */\n  onceAdded(focus) {}\n\n  /**\n   * Check if the editor contains something.\n   * @returns {boolean}\n   */\n  isEmpty() {\n    return false;\n  }\n\n  /**\n   * Enable edit mode.\n   */\n  enableEditMode() {\n    this.#isInEditMode = true;\n  }\n\n  /**\n   * Disable edit mode.\n   */\n  disableEditMode() {\n    this.#isInEditMode = false;\n  }\n\n  /**\n   * Check if the editor is edited.\n   * @returns {boolean}\n   */\n  isInEditMode() {\n    return this.#isInEditMode;\n  }\n\n  /**\n   * If it returns true, then this editor handles the keyboard\n   * events itself.\n   * @returns {boolean}\n   */\n  shouldGetKeyboardEvents() {\n    return this.#isResizerEnabledForKeyboard;\n  }\n\n  /**\n   * Check if this editor needs to be rebuilt or not.\n   * @returns {boolean}\n   */\n  needsToBeRebuilt() {\n    return this.div && !this.isAttachedToDOM;\n  }\n\n  get isOnScreen() {\n    const { top, left, bottom, right } = this.getClientDimensions();\n    const { innerHeight, innerWidth } = window;\n    return left < innerWidth && right > 0 && top < innerHeight && bottom > 0;\n  }\n\n  #addFocusListeners() {\n    if (this.#focusAC || !this.div) {\n      return;\n    }\n    this.#focusAC = new AbortController();\n    const signal = this._uiManager.combinedSignal(this.#focusAC);\n\n    this.div.addEventListener(\"focusin\", this.focusin.bind(this), { signal });\n    this.div.addEventListener(\"focusout\", this.focusout.bind(this), { signal });\n  }\n\n  /**\n   * Rebuild the editor in case it has been removed on undo.\n   *\n   * To implement in subclasses.\n   */\n  rebuild() {\n    this.#addFocusListeners();\n  }\n\n  /**\n   * Rotate the editor when the page is rotated.\n   * @param {number} angle\n   */\n  rotate(_angle) {}\n\n  /**\n   * Resize the editor when the page is resized.\n   */\n  resize() {}\n\n  /**\n   * Serialize the editor when it has been deleted.\n   * @returns {Object}\n   */\n  serializeDeleted() {\n    return {\n      id: this.annotationElementId,\n      deleted: true,\n      pageIndex: this.pageIndex,\n      popupRef: this._initialData?.popupRef || \"\",\n    };\n  }\n\n  /**\n   * Serialize the editor.\n   * The result of the serialization will be used to construct a\n   * new annotation to add to the pdf document.\n   *\n   * To implement in subclasses.\n   * @param {boolean} [isForCopying]\n   * @param {Object | null} [context]\n   * @returns {Object | null}\n   */\n  serialize(isForCopying = false, context = null) {\n    unreachable(\"An editor must be serializable\");\n  }\n\n  /**\n   * Deserialize the editor.\n   * The result of the deserialization is a new editor.\n   *\n   * @param {Object} data\n   * @param {AnnotationEditorLayer} parent\n   * @param {AnnotationEditorUIManager} uiManager\n   * @returns {Promise<AnnotationEditor | null>}\n   */\n  static async deserialize(data, parent, uiManager) {\n    const editor = new this.prototype.constructor({\n      parent,\n      id: parent.getNextId(),\n      uiManager,\n    });\n    editor.rotation = data.rotation;\n    editor.#accessibilityData = data.accessibilityData;\n\n    const [pageWidth, pageHeight] = editor.pageDimensions;\n    const [x, y, width, height] = editor.getRectInCurrentCoords(\n      data.rect,\n      pageHeight\n    );\n\n    editor.x = x / pageWidth;\n    editor.y = y / pageHeight;\n    editor.width = width / pageWidth;\n    editor.height = height / pageHeight;\n\n    return editor;\n  }\n\n  /**\n   * Check if an existing annotation associated with this editor has been\n   * modified.\n   * @returns {boolean}\n   */\n  get hasBeenModified() {\n    return (\n      !!this.annotationElementId && (this.deleted || this.serialize() !== null)\n    );\n  }\n\n  /**\n   * Remove this editor.\n   * It's used on ctrl+backspace action.\n   */\n  remove() {\n    this.#focusAC?.abort();\n    this.#focusAC = null;\n\n    if (!this.isEmpty()) {\n      // The editor is removed but it can be back at some point thanks to\n      // undo/redo so we must commit it before.\n      this.commit();\n    }\n    if (this.parent) {\n      this.parent.remove(this);\n    } else {\n      this._uiManager.removeEditor(this);\n    }\n\n    if (this.#moveInDOMTimeout) {\n      clearTimeout(this.#moveInDOMTimeout);\n      this.#moveInDOMTimeout = null;\n    }\n    this.#stopResizing();\n    this.removeEditToolbar();\n    if (this.#telemetryTimeouts) {\n      for (const timeout of this.#telemetryTimeouts.values()) {\n        clearTimeout(timeout);\n      }\n      this.#telemetryTimeouts = null;\n    }\n    this.parent = null;\n    this.#touchManager?.destroy();\n    this.#touchManager = null;\n  }\n\n  /**\n   * @returns {boolean} true if this editor can be resized.\n   */\n  get isResizable() {\n    return false;\n  }\n\n  /**\n   * Add the resizers to this editor.\n   */\n  makeResizable() {\n    if (this.isResizable) {\n      this.#createResizers();\n      this.#resizersDiv.classList.remove(\"hidden\");\n      bindEvents(this, this.div, [\"keydown\"]);\n    }\n  }\n\n  get toolbarPosition() {\n    return null;\n  }\n\n  /**\n   * onkeydown callback.\n   * @param {KeyboardEvent} event\n   */\n  keydown(event) {\n    if (\n      !this.isResizable ||\n      event.target !== this.div ||\n      event.key !== \"Enter\"\n    ) {\n      return;\n    }\n    this._uiManager.setSelected(this);\n    this.#savedDimensions = {\n      savedX: this.x,\n      savedY: this.y,\n      savedWidth: this.width,\n      savedHeight: this.height,\n    };\n    const children = this.#resizersDiv.children;\n    if (!this.#allResizerDivs) {\n      this.#allResizerDivs = Array.from(children);\n      const boundResizerKeydown = this.#resizerKeydown.bind(this);\n      const boundResizerBlur = this.#resizerBlur.bind(this);\n      const signal = this._uiManager._signal;\n      for (const div of this.#allResizerDivs) {\n        const name = div.getAttribute(\"data-resizer-name\");\n        div.setAttribute(\"role\", \"spinbutton\");\n        div.addEventListener(\"keydown\", boundResizerKeydown, { signal });\n        div.addEventListener(\"blur\", boundResizerBlur, { signal });\n        div.addEventListener(\"focus\", this.#resizerFocus.bind(this, name), {\n          signal,\n        });\n        div.setAttribute(\"data-l10n-id\", AnnotationEditor._l10nResizer[name]);\n      }\n    }\n\n    // We want to have the resizers in the visual order, so we move the first\n    // (top-left) to the right place.\n    const first = this.#allResizerDivs[0];\n    let firstPosition = 0;\n    for (const div of children) {\n      if (div === first) {\n        break;\n      }\n      firstPosition++;\n    }\n    const nextFirstPosition =\n      (((360 - this.rotation + this.parentRotation) % 360) / 90) *\n      (this.#allResizerDivs.length / 4);\n\n    if (nextFirstPosition !== firstPosition) {\n      // We need to reorder the resizers in the DOM in order to have the focus\n      // on the top-left one.\n      if (nextFirstPosition < firstPosition) {\n        for (let i = 0; i < firstPosition - nextFirstPosition; i++) {\n          this.#resizersDiv.append(this.#resizersDiv.firstChild);\n        }\n      } else if (nextFirstPosition > firstPosition) {\n        for (let i = 0; i < nextFirstPosition - firstPosition; i++) {\n          this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild);\n        }\n      }\n\n      let i = 0;\n      for (const child of children) {\n        const div = this.#allResizerDivs[i++];\n        const name = div.getAttribute(\"data-resizer-name\");\n        child.setAttribute(\"data-l10n-id\", AnnotationEditor._l10nResizer[name]);\n      }\n    }\n\n    this.#setResizerTabIndex(0);\n    this.#isResizerEnabledForKeyboard = true;\n    this.#resizersDiv.firstChild.focus({ focusVisible: true });\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  }\n\n  #resizerKeydown(event) {\n    AnnotationEditor._resizerKeyboardManager.exec(this, event);\n  }\n\n  #resizerBlur(event) {\n    if (\n      this.#isResizerEnabledForKeyboard &&\n      event.relatedTarget?.parentNode !== this.#resizersDiv\n    ) {\n      this.#stopResizing();\n    }\n  }\n\n  #resizerFocus(name) {\n    this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : \"\";\n  }\n\n  #setResizerTabIndex(value) {\n    if (!this.#allResizerDivs) {\n      return;\n    }\n    for (const div of this.#allResizerDivs) {\n      div.tabIndex = value;\n    }\n  }\n\n  _resizeWithKeyboard(x, y) {\n    if (!this.#isResizerEnabledForKeyboard) {\n      return;\n    }\n    this.#resizerPointermove(this.#focusedResizerName, {\n      deltaX: x,\n      deltaY: y,\n      fromKeyboard: true,\n    });\n  }\n\n  #stopResizing() {\n    this.#isResizerEnabledForKeyboard = false;\n    this.#setResizerTabIndex(-1);\n    this.#addResizeToUndoStack();\n  }\n\n  _stopResizingWithKeyboard() {\n    this.#stopResizing();\n    this.div.focus();\n  }\n\n  /**\n   * Select this editor.\n   */\n  select() {\n    this.makeResizable();\n    this.div?.classList.add(\"selectedEditor\");\n    if (!this._editToolbar) {\n      this.addEditToolbar().then(() => {\n        if (this.div?.classList.contains(\"selectedEditor\")) {\n          // The editor can have been unselected while we were waiting for the\n          // edit toolbar to be created, hence we want to be sure that this\n          // editor is still selected.\n          this._editToolbar?.show();\n        }\n      });\n      return;\n    }\n    this._editToolbar?.show();\n    this.#altText?.toggleAltTextBadge(false);\n  }\n\n  /**\n   * Unselect this editor.\n   */\n  unselect() {\n    this.#resizersDiv?.classList.add(\"hidden\");\n    this.div?.classList.remove(\"selectedEditor\");\n    if (this.div?.contains(document.activeElement)) {\n      // Don't use this.div.blur() because we don't know where the focus will\n      // go.\n      this._uiManager.currentLayer.div.focus({\n        preventScroll: true,\n      });\n    }\n    this._editToolbar?.hide();\n    this.#altText?.toggleAltTextBadge(true);\n  }\n\n  /**\n   * Update some parameters which have been changed through the UI.\n   * @param {number} type\n   * @param {*} value\n   */\n  updateParams(type, value) {}\n\n  /**\n   * When the user disables the editing mode some editors can change some of\n   * their properties.\n   */\n  disableEditing() {}\n\n  /**\n   * When the user enables the editing mode some editors can change some of\n   * their properties.\n   */\n  enableEditing() {}\n\n  /**\n   * The editor is about to be edited.\n   */\n  enterInEditMode() {}\n\n  /**\n   * @returns {HTMLElement | null} the element requiring an alt text.\n   */\n  getImageForAltText() {\n    return null;\n  }\n\n  /**\n   * Get the div which really contains the displayed content.\n   * @returns {HTMLDivElement | undefined}\n   */\n  get contentDiv() {\n    return this.div;\n  }\n\n  /**\n   * If true then the editor is currently edited.\n   * @type {boolean}\n   */\n  get isEditing() {\n    return this.#isEditing;\n  }\n\n  /**\n   * When set to true, it means that this editor is currently edited.\n   * @param {boolean} value\n   */\n  set isEditing(value) {\n    this.#isEditing = value;\n    if (!this.parent) {\n      return;\n    }\n    if (value) {\n      this.parent.setSelected(this);\n      this.parent.setActiveEditor(this);\n    } else {\n      this.parent.setActiveEditor(null);\n    }\n  }\n\n  /**\n   * Set the aspect ratio to use when resizing.\n   * @param {number} width\n   * @param {number} height\n   */\n  setAspectRatio(width, height) {\n    this.#keepAspectRatio = true;\n    const aspectRatio = width / height;\n    const { style } = this.div;\n    style.aspectRatio = aspectRatio;\n    style.height = \"auto\";\n  }\n\n  static get MIN_SIZE() {\n    return 16;\n  }\n\n  static canCreateNewEmptyEditor() {\n    return true;\n  }\n\n  /**\n   * Get the data to report to the telemetry when the editor is added.\n   * @returns {Object}\n   */\n  get telemetryInitialData() {\n    return { action: \"added\" };\n  }\n\n  /**\n   * The telemetry data to use when saving/printing.\n   * @returns {Object|null}\n   */\n  get telemetryFinalData() {\n    return null;\n  }\n\n  _reportTelemetry(data, mustWait = false) {\n    if (mustWait) {\n      this.#telemetryTimeouts ||= new Map();\n      const { action } = data;\n      let timeout = this.#telemetryTimeouts.get(action);\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n      timeout = setTimeout(() => {\n        this._reportTelemetry(data);\n        this.#telemetryTimeouts.delete(action);\n        if (this.#telemetryTimeouts.size === 0) {\n          this.#telemetryTimeouts = null;\n        }\n      }, AnnotationEditor._telemetryTimeout);\n      this.#telemetryTimeouts.set(action, timeout);\n      return;\n    }\n    data.type ||= this.editorType;\n    this._uiManager._eventBus.dispatch(\"reporttelemetry\", {\n      source: this,\n      details: {\n        type: \"editing\",\n        data,\n      },\n    });\n  }\n\n  /**\n   * Show or hide this editor.\n   * @param {boolean|undefined} visible\n   */\n  show(visible = this._isVisible) {\n    this.div.classList.toggle(\"hidden\", !visible);\n    this._isVisible = visible;\n  }\n\n  enable() {\n    if (this.div) {\n      this.div.tabIndex = 0;\n    }\n    this.#disabled = false;\n  }\n\n  disable() {\n    if (this.div) {\n      this.div.tabIndex = -1;\n    }\n    this.#disabled = true;\n  }\n\n  /**\n   * Render an annotation in the annotation layer.\n   * @param {Object} annotation\n   * @returns {HTMLElement|null}\n   */\n  renderAnnotationElement(annotation) {\n    let content = annotation.container.querySelector(\".annotationContent\");\n    if (!content) {\n      content = document.createElement(\"div\");\n      content.classList.add(\"annotationContent\", this.editorType);\n      annotation.container.prepend(content);\n    } else if (content.nodeName === \"CANVAS\") {\n      const canvas = content;\n      content = document.createElement(\"div\");\n      content.classList.add(\"annotationContent\", this.editorType);\n      canvas.before(content);\n    }\n\n    return content;\n  }\n\n  resetAnnotationElement(annotation) {\n    const { firstChild } = annotation.container;\n    if (\n      firstChild?.nodeName === \"DIV\" &&\n      firstChild.classList.contains(\"annotationContent\")\n    ) {\n      firstChild.remove();\n    }\n  }\n}\n\n// This class is used to fake an editor which has been deleted.\nclass FakeEditor extends AnnotationEditor {\n  constructor(params) {\n    super(params);\n    this.annotationElementId = params.annotationElementId;\n    this.deleted = true;\n  }\n\n  serialize() {\n    return this.serializeDeleted();\n  }\n}\n\nexport { AnnotationEditor };\n","/* Copyright 2014 Opera Software ASA\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n *\n * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.\n * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.\n */\n\nconst SEED = 0xc3d2e1f0;\n// Workaround for missing math precision in JS.\nconst MASK_HIGH = 0xffff0000;\nconst MASK_LOW = 0xffff;\n\nclass MurmurHash3_64 {\n  constructor(seed) {\n    this.h1 = seed ? seed & 0xffffffff : SEED;\n    this.h2 = seed ? seed & 0xffffffff : SEED;\n  }\n\n  update(input) {\n    let data, length;\n    if (typeof input === \"string\") {\n      data = new Uint8Array(input.length * 2);\n      length = 0;\n      for (let i = 0, ii = input.length; i < ii; i++) {\n        const code = input.charCodeAt(i);\n        if (code <= 0xff) {\n          data[length++] = code;\n        } else {\n          data[length++] = code >>> 8;\n          data[length++] = code & 0xff;\n        }\n      }\n    } else if (ArrayBuffer.isView(input)) {\n      data = input.slice();\n      length = data.byteLength;\n    } else {\n      throw new Error(\"Invalid data format, must be a string or TypedArray.\");\n    }\n\n    const blockCounts = length >> 2;\n    const tailLength = length - blockCounts * 4;\n    // We don't care about endianness here.\n    const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n    let k1 = 0,\n      k2 = 0;\n    let h1 = this.h1,\n      h2 = this.h2;\n    const C1 = 0xcc9e2d51,\n      C2 = 0x1b873593;\n    const C1_LOW = C1 & MASK_LOW,\n      C2_LOW = C2 & MASK_LOW;\n\n    for (let i = 0; i < blockCounts; i++) {\n      if (i & 1) {\n        k1 = dataUint32[i];\n        k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n        k1 = (k1 << 15) | (k1 >>> 17);\n        k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n        h1 ^= k1;\n        h1 = (h1 << 13) | (h1 >>> 19);\n        h1 = h1 * 5 + 0xe6546b64;\n      } else {\n        k2 = dataUint32[i];\n        k2 = ((k2 * C1) & MASK_HIGH) | ((k2 * C1_LOW) & MASK_LOW);\n        k2 = (k2 << 15) | (k2 >>> 17);\n        k2 = ((k2 * C2) & MASK_HIGH) | ((k2 * C2_LOW) & MASK_LOW);\n        h2 ^= k2;\n        h2 = (h2 << 13) | (h2 >>> 19);\n        h2 = h2 * 5 + 0xe6546b64;\n      }\n    }\n\n    k1 = 0;\n\n    switch (tailLength) {\n      case 3:\n        k1 ^= data[blockCounts * 4 + 2] << 16;\n      /* falls through */\n      case 2:\n        k1 ^= data[blockCounts * 4 + 1] << 8;\n      /* falls through */\n      case 1:\n        k1 ^= data[blockCounts * 4];\n        /* falls through */\n\n        k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n        k1 = (k1 << 15) | (k1 >>> 17);\n        k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n        if (blockCounts & 1) {\n          h1 ^= k1;\n        } else {\n          h2 ^= k1;\n        }\n    }\n\n    this.h1 = h1;\n    this.h2 = h2;\n  }\n\n  hexdigest() {\n    let h1 = this.h1,\n      h2 = this.h2;\n\n    h1 ^= h2 >>> 1;\n    h1 = ((h1 * 0xed558ccd) & MASK_HIGH) | ((h1 * 0x8ccd) & MASK_LOW);\n    h2 =\n      ((h2 * 0xff51afd7) & MASK_HIGH) |\n      (((((h2 << 16) | (h1 >>> 16)) * 0xafd7ed55) & MASK_HIGH) >>> 16);\n    h1 ^= h2 >>> 1;\n    h1 = ((h1 * 0x1a85ec53) & MASK_HIGH) | ((h1 * 0xec53) & MASK_LOW);\n    h2 =\n      ((h2 * 0xc4ceb9fe) & MASK_HIGH) |\n      (((((h2 << 16) | (h1 >>> 16)) * 0xb9fe1a85) & MASK_HIGH) >>> 16);\n    h1 ^= h2 >>> 1;\n\n    return (\n      (h1 >>> 0).toString(16).padStart(8, \"0\") +\n      (h2 >>> 0).toString(16).padStart(8, \"0\")\n    );\n  }\n}\n\nexport { MurmurHash3_64 };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { objectFromMap, shadow, unreachable } from \"../shared/util.js\";\nimport { AnnotationEditor } from \"./editor/editor.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\n\nconst SerializableEmpty = Object.freeze({\n  map: null,\n  hash: \"\",\n  transfer: undefined,\n});\n\n/**\n * Key/value storage for annotation data in forms.\n */\nclass AnnotationStorage {\n  #modified = false;\n\n  #modifiedIds = null;\n\n  #storage = new Map();\n\n  constructor() {\n    // Callbacks to signal when the modification state is set or reset.\n    // This is used by the viewer to only bind on `beforeunload` if forms\n    // are actually edited to prevent doing so unconditionally since that\n    // can have undesirable effects.\n    this.onSetModified = null;\n    this.onResetModified = null;\n    this.onAnnotationEditor = null;\n  }\n\n  /**\n   * Get the value for a given key if it exists, or return the default value.\n   * @param {string} key\n   * @param {Object} defaultValue\n   * @returns {Object}\n   */\n  getValue(key, defaultValue) {\n    const value = this.#storage.get(key);\n    if (value === undefined) {\n      return defaultValue;\n    }\n\n    return Object.assign(defaultValue, value);\n  }\n\n  /**\n   * Get the value for a given key.\n   * @param {string} key\n   * @returns {Object}\n   */\n  getRawValue(key) {\n    return this.#storage.get(key);\n  }\n\n  /**\n   * Remove a value from the storage.\n   * @param {string} key\n   */\n  remove(key) {\n    this.#storage.delete(key);\n\n    if (this.#storage.size === 0) {\n      this.resetModified();\n    }\n\n    if (typeof this.onAnnotationEditor === \"function\") {\n      for (const value of this.#storage.values()) {\n        if (value instanceof AnnotationEditor) {\n          return;\n        }\n      }\n      this.onAnnotationEditor(null);\n    }\n  }\n\n  /**\n   * Set the value for a given key\n   * @param {string} key\n   * @param {Object} value\n   */\n  setValue(key, value) {\n    const obj = this.#storage.get(key);\n    let modified = false;\n    if (obj !== undefined) {\n      for (const [entry, val] of Object.entries(value)) {\n        if (obj[entry] !== val) {\n          modified = true;\n          obj[entry] = val;\n        }\n      }\n    } else {\n      modified = true;\n      this.#storage.set(key, value);\n    }\n    if (modified) {\n      this.#setModified();\n    }\n\n    if (\n      value instanceof AnnotationEditor &&\n      typeof this.onAnnotationEditor === \"function\"\n    ) {\n      this.onAnnotationEditor(value.constructor._type);\n    }\n  }\n\n  /**\n   * Check if the storage contains the given key.\n   * @param {string} key\n   * @returns {boolean}\n   */\n  has(key) {\n    return this.#storage.has(key);\n  }\n\n  /**\n   * @returns {Object | null}\n   */\n  getAll() {\n    return this.#storage.size > 0 ? objectFromMap(this.#storage) : null;\n  }\n\n  /**\n   * @param {Object} obj\n   */\n  setAll(obj) {\n    for (const [key, val] of Object.entries(obj)) {\n      this.setValue(key, val);\n    }\n  }\n\n  get size() {\n    return this.#storage.size;\n  }\n\n  #setModified() {\n    if (!this.#modified) {\n      this.#modified = true;\n      if (typeof this.onSetModified === \"function\") {\n        this.onSetModified();\n      }\n    }\n  }\n\n  resetModified() {\n    if (this.#modified) {\n      this.#modified = false;\n      if (typeof this.onResetModified === \"function\") {\n        this.onResetModified();\n      }\n    }\n  }\n\n  /**\n   * @returns {PrintAnnotationStorage}\n   */\n  get print() {\n    return new PrintAnnotationStorage(this);\n  }\n\n  /**\n   * PLEASE NOTE: Only intended for usage within the API itself.\n   * @ignore\n   */\n  get serializable() {\n    if (this.#storage.size === 0) {\n      return SerializableEmpty;\n    }\n    const map = new Map(),\n      hash = new MurmurHash3_64(),\n      transfer = [];\n    const context = Object.create(null);\n    let hasBitmap = false;\n\n    for (const [key, val] of this.#storage) {\n      const serialized =\n        val instanceof AnnotationEditor\n          ? val.serialize(/* isForCopying = */ false, context)\n          : val;\n      if (serialized) {\n        map.set(key, serialized);\n\n        hash.update(`${key}:${JSON.stringify(serialized)}`);\n        hasBitmap ||= !!serialized.bitmap;\n      }\n    }\n\n    if (hasBitmap) {\n      // We must transfer the bitmap data separately, since it can be changed\n      // during serialization with SVG images.\n      for (const value of map.values()) {\n        if (value.bitmap) {\n          transfer.push(value.bitmap);\n        }\n      }\n    }\n\n    return map.size > 0\n      ? { map, hash: hash.hexdigest(), transfer }\n      : SerializableEmpty;\n  }\n\n  get editorStats() {\n    let stats = null;\n    const typeToEditor = new Map();\n    for (const value of this.#storage.values()) {\n      if (!(value instanceof AnnotationEditor)) {\n        continue;\n      }\n      const editorStats = value.telemetryFinalData;\n      if (!editorStats) {\n        continue;\n      }\n      const { type } = editorStats;\n      if (!typeToEditor.has(type)) {\n        typeToEditor.set(type, Object.getPrototypeOf(value).constructor);\n      }\n      stats ||= Object.create(null);\n      const map = (stats[type] ||= new Map());\n      for (const [key, val] of Object.entries(editorStats)) {\n        if (key === \"type\") {\n          continue;\n        }\n        let counters = map.get(key);\n        if (!counters) {\n          counters = new Map();\n          map.set(key, counters);\n        }\n        const count = counters.get(val) ?? 0;\n        counters.set(val, count + 1);\n      }\n    }\n    for (const [type, editor] of typeToEditor) {\n      stats[type] = editor.computeTelemetryFinalData(stats[type]);\n    }\n    return stats;\n  }\n\n  resetModifiedIds() {\n    this.#modifiedIds = null;\n  }\n\n  /**\n   * @returns {{ids: Set<string>, hash: string}}\n   */\n  get modifiedIds() {\n    if (this.#modifiedIds) {\n      return this.#modifiedIds;\n    }\n    const ids = [];\n    for (const value of this.#storage.values()) {\n      if (\n        !(value instanceof AnnotationEditor) ||\n        !value.annotationElementId ||\n        !value.serialize()\n      ) {\n        continue;\n      }\n      ids.push(value.annotationElementId);\n    }\n    return (this.#modifiedIds = {\n      ids: new Set(ids),\n      hash: ids.join(\",\"),\n    });\n  }\n}\n\n/**\n * A special `AnnotationStorage` for use during printing, where the serializable\n * data is *frozen* upon initialization, to prevent scripting from modifying its\n * contents. (Necessary since printing is triggered synchronously in browsers.)\n */\nclass PrintAnnotationStorage extends AnnotationStorage {\n  #serializable;\n\n  constructor(parent) {\n    super();\n    const { map, hash, transfer } = parent.serializable;\n    // Create a *copy* of the data, since Objects are passed by reference in JS.\n    const clone = structuredClone(map, transfer ? { transfer } : null);\n\n    this.#serializable = { map: clone, hash, transfer };\n  }\n\n  /**\n   * @returns {PrintAnnotationStorage}\n   */\n  // eslint-disable-next-line getter-return\n  get print() {\n    unreachable(\"Should not call PrintAnnotationStorage.print\");\n  }\n\n  /**\n   * PLEASE NOTE: Only intended for usage within the API itself.\n   * @ignore\n   */\n  get serializable() {\n    return this.#serializable;\n  }\n\n  get modifiedIds() {\n    return shadow(this, \"modifiedIds\", {\n      ids: new Set(),\n      hash: \"\",\n    });\n  }\n}\n\nexport { AnnotationStorage, PrintAnnotationStorage, SerializableEmpty };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert,\n  isNodeJS,\n  shadow,\n  string32,\n  toBase64Util,\n  unreachable,\n  warn,\n} from \"../shared/util.js\";\n\nclass FontLoader {\n  #systemFonts = new Set();\n\n  constructor({\n    ownerDocument = globalThis.document,\n    styleElement = null, // For testing only.\n  }) {\n    this._document = ownerDocument;\n\n    this.nativeFontFaces = new Set();\n    this.styleElement =\n      typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")\n        ? styleElement\n        : null;\n\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n      this.loadingRequests = [];\n      this.loadTestFontId = 0;\n    }\n  }\n\n  addNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.add(nativeFontFace);\n    this._document.fonts.add(nativeFontFace);\n  }\n\n  removeNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.delete(nativeFontFace);\n    this._document.fonts.delete(nativeFontFace);\n  }\n\n  insertRule(rule) {\n    if (!this.styleElement) {\n      this.styleElement = this._document.createElement(\"style\");\n      this._document.documentElement\n        .getElementsByTagName(\"head\")[0]\n        .append(this.styleElement);\n    }\n    const styleSheet = this.styleElement.sheet;\n    styleSheet.insertRule(rule, styleSheet.cssRules.length);\n  }\n\n  clear() {\n    for (const nativeFontFace of this.nativeFontFaces) {\n      this._document.fonts.delete(nativeFontFace);\n    }\n    this.nativeFontFaces.clear();\n    this.#systemFonts.clear();\n\n    if (this.styleElement) {\n      // Note: ChildNode.remove doesn't throw if the parentNode is undefined.\n      this.styleElement.remove();\n      this.styleElement = null;\n    }\n  }\n\n  async loadSystemFont({ systemFontInfo: info, _inspectFont }) {\n    if (!info || this.#systemFonts.has(info.loadedName)) {\n      return;\n    }\n    assert(\n      !this.disableFontFace,\n      \"loadSystemFont shouldn't be called when `disableFontFace` is set.\"\n    );\n\n    if (this.isFontLoadingAPISupported) {\n      const { loadedName, src, style } = info;\n      const fontFace = new FontFace(loadedName, src, style);\n      this.addNativeFontFace(fontFace);\n      try {\n        await fontFace.load();\n        this.#systemFonts.add(loadedName);\n        _inspectFont?.(info);\n      } catch {\n        warn(\n          `Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`\n        );\n\n        this.removeNativeFontFace(fontFace);\n      }\n      return;\n    }\n\n    unreachable(\n      \"Not implemented: loadSystemFont without the Font Loading API.\"\n    );\n  }\n\n  async bind(font) {\n    // Add the font to the DOM only once; skip if the font is already loaded.\n    if (font.attached || (font.missingFile && !font.systemFontInfo)) {\n      return;\n    }\n    font.attached = true;\n\n    if (font.systemFontInfo) {\n      await this.loadSystemFont(font);\n      return;\n    }\n\n    if (this.isFontLoadingAPISupported) {\n      const nativeFontFace = font.createNativeFontFace();\n      if (nativeFontFace) {\n        this.addNativeFontFace(nativeFontFace);\n        try {\n          await nativeFontFace.loaded;\n        } catch (ex) {\n          warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`);\n\n          // When font loading failed, fall back to the built-in font renderer.\n          font.disableFontFace = true;\n          throw ex;\n        }\n      }\n      return; // The font was, asynchronously, loaded.\n    }\n\n    // !this.isFontLoadingAPISupported\n    const rule = font.createFontFaceRule();\n    if (rule) {\n      this.insertRule(rule);\n\n      if (this.isSyncFontLoadingSupported) {\n        return; // The font was, synchronously, loaded.\n      }\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n        throw new Error(\"Not implemented: async font loading\");\n      }\n      await new Promise(resolve => {\n        const request = this._queueLoadingCallback(resolve);\n        this._prepareFontLoadEvent(font, request);\n      });\n      // The font was, asynchronously, loaded.\n    }\n  }\n\n  get isFontLoadingAPISupported() {\n    const hasFonts = !!this._document?.fonts;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      return shadow(\n        this,\n        \"isFontLoadingAPISupported\",\n        hasFonts && !this.styleElement\n      );\n    }\n    return shadow(this, \"isFontLoadingAPISupported\", hasFonts);\n  }\n\n  get isSyncFontLoadingSupported() {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      return shadow(this, \"isSyncFontLoadingSupported\", true);\n    }\n\n    let supported = false;\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\")) {\n      if (isNodeJS) {\n        // Node.js - we can pretend that sync font loading is supported.\n        supported = true;\n      } else if (\n        typeof navigator !== \"undefined\" &&\n        typeof navigator?.userAgent === \"string\" &&\n        // User agent string sniffing is bad, but there is no reliable way to\n        // tell if the font is fully loaded and ready to be used with canvas.\n        /Mozilla\\/5.0.*?rv:\\d+.*? Gecko/.test(navigator.userAgent)\n      ) {\n        // Firefox, from version 14, supports synchronous font loading.\n        supported = true;\n      }\n    }\n    return shadow(this, \"isSyncFontLoadingSupported\", supported);\n  }\n\n  _queueLoadingCallback(callback) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: _queueLoadingCallback\");\n    }\n\n    function completeRequest() {\n      assert(!request.done, \"completeRequest() cannot be called twice.\");\n      request.done = true;\n\n      // Sending all completed requests in order of how they were queued.\n      while (loadingRequests.length > 0 && loadingRequests[0].done) {\n        const otherRequest = loadingRequests.shift();\n        setTimeout(otherRequest.callback, 0);\n      }\n    }\n\n    const { loadingRequests } = this;\n    const request = {\n      done: false,\n      complete: completeRequest,\n      callback,\n    };\n    loadingRequests.push(request);\n    return request;\n  }\n\n  get _loadTestFont() {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: _loadTestFont\");\n    }\n\n    // This is a CFF font with 1 glyph for '.' that fills its entire width\n    // and height.\n    const testFont = atob(\n      \"T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA\" +\n        \"FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA\" +\n        \"ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA\" +\n        \"AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1\" +\n        \"AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD\" +\n        \"6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM\" +\n        \"AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D\" +\n        \"IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA\" +\n        \"AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA\" +\n        \"AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB\" +\n        \"AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY\" +\n        \"AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA\" +\n        \"AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n        \"AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA\" +\n        \"AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC\" +\n        \"AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3\" +\n        \"Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj\" +\n        \"FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==\"\n    );\n    return shadow(this, \"_loadTestFont\", testFont);\n  }\n\n  _prepareFontLoadEvent(font, request) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: _prepareFontLoadEvent\");\n    }\n\n    /** Hack begin */\n    // There's currently no event when a font has finished downloading so the\n    // following code is a dirty hack to 'guess' when a font is ready.\n    // It's assumed fonts are loaded in order, so add a known test font after\n    // the desired fonts and then test for the loading of that test font.\n\n    function int32(data, offset) {\n      return (\n        (data.charCodeAt(offset) << 24) |\n        (data.charCodeAt(offset + 1) << 16) |\n        (data.charCodeAt(offset + 2) << 8) |\n        (data.charCodeAt(offset + 3) & 0xff)\n      );\n    }\n    function spliceString(s, offset, remove, insert) {\n      const chunk1 = s.substring(0, offset);\n      const chunk2 = s.substring(offset + remove);\n      return chunk1 + insert + chunk2;\n    }\n    let i, ii;\n\n    // The temporary canvas is used to determine if fonts are loaded.\n    const canvas = this._document.createElement(\"canvas\");\n    canvas.width = 1;\n    canvas.height = 1;\n    const ctx = canvas.getContext(\"2d\");\n\n    let called = 0;\n    function isFontReady(name, callback) {\n      // With setTimeout clamping this gives the font ~100ms to load.\n      if (++called > 30) {\n        warn(\"Load test font never loaded.\");\n        callback();\n        return;\n      }\n      ctx.font = \"30px \" + name;\n      ctx.fillText(\".\", 0, 20);\n      const imageData = ctx.getImageData(0, 0, 1, 1);\n      if (imageData.data[3] > 0) {\n        callback();\n        return;\n      }\n      setTimeout(isFontReady.bind(null, name, callback));\n    }\n\n    const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;\n    // Chromium seems to cache fonts based on a hash of the actual font data,\n    // so the font must be modified for each load test else it will appear to\n    // be loaded already.\n    // TODO: This could maybe be made faster by avoiding the btoa of the full\n    // font by splitting it in chunks before hand and padding the font id.\n    let data = this._loadTestFont;\n    const COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)\n    data = spliceString(\n      data,\n      COMMENT_OFFSET,\n      loadTestFontId.length,\n      loadTestFontId\n    );\n    // CFF checksum is important for IE, adjusting it\n    const CFF_CHECKSUM_OFFSET = 16;\n    const XXXX_VALUE = 0x58585858; // the \"comment\" filled with 'X'\n    let checksum = int32(data, CFF_CHECKSUM_OFFSET);\n    for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n      checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;\n    }\n    if (i < loadTestFontId.length) {\n      // align to 4 bytes boundary\n      checksum = (checksum - XXXX_VALUE + int32(loadTestFontId + \"XXX\", i)) | 0;\n    }\n    data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));\n\n    const url = `url(data:font/opentype;base64,${btoa(data)});`;\n    const rule = `@font-face {font-family:\"${loadTestFontId}\";src:${url}}`;\n    this.insertRule(rule);\n\n    const div = this._document.createElement(\"div\");\n    div.style.visibility = \"hidden\";\n    div.style.width = div.style.height = \"10px\";\n    div.style.position = \"absolute\";\n    div.style.top = div.style.left = \"0px\";\n\n    for (const name of [font.loadedName, loadTestFontId]) {\n      const span = this._document.createElement(\"span\");\n      span.textContent = \"Hi\";\n      span.style.fontFamily = name;\n      div.append(span);\n    }\n    this._document.body.append(div);\n\n    isFontReady(loadTestFontId, () => {\n      div.remove();\n      request.complete();\n    });\n    /** Hack end */\n  }\n}\n\nclass FontFaceObject {\n  constructor(\n    translatedData,\n    { disableFontFace = false, fontExtraProperties = false, inspectFont = null }\n  ) {\n    this.compiledGlyphs = Object.create(null);\n    // importing translated data\n    for (const i in translatedData) {\n      this[i] = translatedData[i];\n    }\n    this.disableFontFace = disableFontFace === true;\n    this.fontExtraProperties = fontExtraProperties === true;\n    this._inspectFont = inspectFont;\n  }\n\n  createNativeFontFace() {\n    if (!this.data || this.disableFontFace) {\n      return null;\n    }\n    let nativeFontFace;\n    if (!this.cssFontInfo) {\n      nativeFontFace = new FontFace(this.loadedName, this.data, {});\n    } else {\n      const css = {\n        weight: this.cssFontInfo.fontWeight,\n      };\n      if (this.cssFontInfo.italicAngle) {\n        css.style = `oblique ${this.cssFontInfo.italicAngle}deg`;\n      }\n      nativeFontFace = new FontFace(\n        this.cssFontInfo.fontFamily,\n        this.data,\n        css\n      );\n    }\n\n    this._inspectFont?.(this);\n    return nativeFontFace;\n  }\n\n  createFontFaceRule() {\n    if (!this.data || this.disableFontFace) {\n      return null;\n    }\n    // Add the @font-face rule to the document.\n    const url = `url(data:${this.mimetype};base64,${toBase64Util(this.data)});`;\n    let rule;\n    if (!this.cssFontInfo) {\n      rule = `@font-face {font-family:\"${this.loadedName}\";src:${url}}`;\n    } else {\n      let css = `font-weight: ${this.cssFontInfo.fontWeight};`;\n      if (this.cssFontInfo.italicAngle) {\n        css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`;\n      }\n      rule = `@font-face {font-family:\"${this.cssFontInfo.fontFamily}\";${css}src:${url}}`;\n    }\n\n    this._inspectFont?.(this, url);\n    return rule;\n  }\n\n  getPathGenerator(objs, character) {\n    if (this.compiledGlyphs[character] !== undefined) {\n      return this.compiledGlyphs[character];\n    }\n\n    const objId = this.loadedName + \"_path_\" + character;\n    let cmds;\n    try {\n      cmds = objs.get(objId);\n    } catch (ex) {\n      warn(`getPathGenerator - ignoring character: \"${ex}\".`);\n    }\n    const path = new Path2D(cmds || \"\");\n\n    if (!this.fontExtraProperties) {\n      // Remove the raw path-string, since we don't need it anymore.\n      objs.delete(objId);\n    }\n    return (this.compiledGlyphs[character] = path);\n  }\n}\n\nexport { FontFaceObject, FontLoader };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AbortException,\n  assert,\n  InvalidPDFException,\n  MissingPDFException,\n  PasswordException,\n  UnexpectedResponseException,\n  UnknownErrorException,\n  unreachable,\n} from \"./util.js\";\n\nconst CallbackKind = {\n  DATA: 1,\n  ERROR: 2,\n};\n\nconst StreamKind = {\n  CANCEL: 1,\n  CANCEL_COMPLETE: 2,\n  CLOSE: 3,\n  ENQUEUE: 4,\n  ERROR: 5,\n  PULL: 6,\n  PULL_COMPLETE: 7,\n  START_COMPLETE: 8,\n};\n\nfunction onFn() {}\n\nfunction wrapReason(ex) {\n  if (\n    ex instanceof AbortException ||\n    ex instanceof InvalidPDFException ||\n    ex instanceof MissingPDFException ||\n    ex instanceof PasswordException ||\n    ex instanceof UnexpectedResponseException ||\n    ex instanceof UnknownErrorException\n  ) {\n    // Avoid re-creating the exception when its type is already correct.\n    return ex;\n  }\n\n  if (!(ex instanceof Error || (typeof ex === \"object\" && ex !== null))) {\n    unreachable(\n      'wrapReason: Expected \"reason\" to be a (possibly cloned) Error.'\n    );\n  }\n  switch (ex.name) {\n    case \"AbortException\":\n      return new AbortException(ex.message);\n    case \"InvalidPDFException\":\n      return new InvalidPDFException(ex.message);\n    case \"MissingPDFException\":\n      return new MissingPDFException(ex.message);\n    case \"PasswordException\":\n      return new PasswordException(ex.message, ex.code);\n    case \"UnexpectedResponseException\":\n      return new UnexpectedResponseException(ex.message, ex.status);\n    case \"UnknownErrorException\":\n      return new UnknownErrorException(ex.message, ex.details);\n  }\n  return new UnknownErrorException(ex.message, ex.toString());\n}\n\nclass MessageHandler {\n  #messageAC = new AbortController();\n\n  constructor(sourceName, targetName, comObj) {\n    this.sourceName = sourceName;\n    this.targetName = targetName;\n    this.comObj = comObj;\n    this.callbackId = 1;\n    this.streamId = 1;\n    this.streamSinks = Object.create(null);\n    this.streamControllers = Object.create(null);\n    this.callbackCapabilities = Object.create(null);\n    this.actionHandler = Object.create(null);\n\n    comObj.addEventListener(\"message\", this.#onMessage.bind(this), {\n      signal: this.#messageAC.signal,\n    });\n  }\n\n  #onMessage({ data }) {\n    if (data.targetName !== this.sourceName) {\n      return;\n    }\n    if (data.stream) {\n      this.#processStreamMessage(data);\n      return;\n    }\n    if (data.callback) {\n      const callbackId = data.callbackId;\n      const capability = this.callbackCapabilities[callbackId];\n      if (!capability) {\n        throw new Error(`Cannot resolve callback ${callbackId}`);\n      }\n      delete this.callbackCapabilities[callbackId];\n\n      if (data.callback === CallbackKind.DATA) {\n        capability.resolve(data.data);\n      } else if (data.callback === CallbackKind.ERROR) {\n        capability.reject(wrapReason(data.reason));\n      } else {\n        throw new Error(\"Unexpected callback case\");\n      }\n      return;\n    }\n    const action = this.actionHandler[data.action];\n    if (!action) {\n      throw new Error(`Unknown action from worker: ${data.action}`);\n    }\n    if (data.callbackId) {\n      const sourceName = this.sourceName,\n        targetName = data.sourceName,\n        comObj = this.comObj;\n\n      Promise.try(action, data.data).then(\n        function (result) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            callback: CallbackKind.DATA,\n            callbackId: data.callbackId,\n            data: result,\n          });\n        },\n        function (reason) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            callback: CallbackKind.ERROR,\n            callbackId: data.callbackId,\n            reason: wrapReason(reason),\n          });\n        }\n      );\n      return;\n    }\n    if (data.streamId) {\n      this.#createStreamSink(data);\n      return;\n    }\n    action(data.data);\n  }\n\n  on(actionName, handler) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        typeof handler === \"function\",\n        'MessageHandler.on: Expected \"handler\" to be a function.'\n      );\n    }\n    const ah = this.actionHandler;\n    if (ah[actionName]) {\n      throw new Error(`There is already an actionName called \"${actionName}\"`);\n    }\n    ah[actionName] = handler;\n  }\n\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * @param {string} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n   */\n  send(actionName, data, transfers) {\n    this.comObj.postMessage(\n      {\n        sourceName: this.sourceName,\n        targetName: this.targetName,\n        action: actionName,\n        data,\n      },\n      transfers\n    );\n  }\n\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expects that the other side will callback with the response.\n   * @param {string} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n   * @returns {Promise} Promise to be resolved with response data.\n   */\n  sendWithPromise(actionName, data, transfers) {\n    const callbackId = this.callbackId++;\n    const capability = Promise.withResolvers();\n    this.callbackCapabilities[callbackId] = capability;\n    try {\n      this.comObj.postMessage(\n        {\n          sourceName: this.sourceName,\n          targetName: this.targetName,\n          action: actionName,\n          callbackId,\n          data,\n        },\n        transfers\n      );\n    } catch (ex) {\n      capability.reject(ex);\n    }\n    return capability.promise;\n  }\n\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expect that the other side will callback to signal 'start_complete'.\n   * @param {string} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Object} queueingStrategy - Strategy to signal backpressure based on\n   *                 internal queue.\n   * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n   * @returns {ReadableStream} ReadableStream to read data in chunks.\n   */\n  sendWithStream(actionName, data, queueingStrategy, transfers) {\n    const streamId = this.streamId++,\n      sourceName = this.sourceName,\n      targetName = this.targetName,\n      comObj = this.comObj;\n\n    return new ReadableStream(\n      {\n        start: controller => {\n          const startCapability = Promise.withResolvers();\n          this.streamControllers[streamId] = {\n            controller,\n            startCall: startCapability,\n            pullCall: null,\n            cancelCall: null,\n            isClosed: false,\n          };\n          comObj.postMessage(\n            {\n              sourceName,\n              targetName,\n              action: actionName,\n              streamId,\n              data,\n              desiredSize: controller.desiredSize,\n            },\n            transfers\n          );\n          // Return Promise for Async process, to signal success/failure.\n          return startCapability.promise;\n        },\n\n        pull: controller => {\n          const pullCapability = Promise.withResolvers();\n          this.streamControllers[streamId].pullCall = pullCapability;\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL,\n            streamId,\n            desiredSize: controller.desiredSize,\n          });\n          // Returning Promise will not call \"pull\"\n          // again until current pull is resolved.\n          return pullCapability.promise;\n        },\n\n        cancel: reason => {\n          assert(reason instanceof Error, \"cancel must have a valid reason\");\n          const cancelCapability = Promise.withResolvers();\n          this.streamControllers[streamId].cancelCall = cancelCapability;\n          this.streamControllers[streamId].isClosed = true;\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.CANCEL,\n            streamId,\n            reason: wrapReason(reason),\n          });\n          // Return Promise to signal success or failure.\n          return cancelCapability.promise;\n        },\n      },\n      queueingStrategy\n    );\n  }\n\n  #createStreamSink(data) {\n    const streamId = data.streamId,\n      sourceName = this.sourceName,\n      targetName = data.sourceName,\n      comObj = this.comObj;\n    const self = this,\n      action = this.actionHandler[data.action];\n\n    const streamSink = {\n      enqueue(chunk, size = 1, transfers) {\n        if (this.isCancelled) {\n          return;\n        }\n        const lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n        // Enqueue decreases the desiredSize property of sink,\n        // so when it changes from positive to negative,\n        // set ready as unresolved promise.\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = Promise.withResolvers();\n          this.ready = this.sinkCapability.promise;\n        }\n        comObj.postMessage(\n          {\n            sourceName,\n            targetName,\n            stream: StreamKind.ENQUEUE,\n            streamId,\n            chunk,\n          },\n          transfers\n        );\n      },\n\n      close() {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.CLOSE,\n          streamId,\n        });\n        delete self.streamSinks[streamId];\n      },\n\n      error(reason) {\n        assert(reason instanceof Error, \"error must have a valid reason\");\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.ERROR,\n          streamId,\n          reason: wrapReason(reason),\n        });\n      },\n\n      sinkCapability: Promise.withResolvers(),\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize: data.desiredSize,\n      ready: null,\n    };\n\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n\n    Promise.try(action, data.data, streamSink).then(\n      function () {\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.START_COMPLETE,\n          streamId,\n          success: true,\n        });\n      },\n      function (reason) {\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.START_COMPLETE,\n          streamId,\n          reason: wrapReason(reason),\n        });\n      }\n    );\n  }\n\n  #processStreamMessage(data) {\n    const streamId = data.streamId,\n      sourceName = this.sourceName,\n      targetName = data.sourceName,\n      comObj = this.comObj;\n    const streamController = this.streamControllers[streamId],\n      streamSink = this.streamSinks[streamId];\n\n    switch (data.stream) {\n      case StreamKind.START_COMPLETE:\n        if (data.success) {\n          streamController.startCall.resolve();\n        } else {\n          streamController.startCall.reject(wrapReason(data.reason));\n        }\n        break;\n      case StreamKind.PULL_COMPLETE:\n        if (data.success) {\n          streamController.pullCall.resolve();\n        } else {\n          streamController.pullCall.reject(wrapReason(data.reason));\n        }\n        break;\n      case StreamKind.PULL:\n        // Ignore any pull after close is called.\n        if (!streamSink) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            success: true,\n          });\n          break;\n        }\n        // Pull increases the desiredSize property of sink, so when it changes\n        // from negative to positive, set ready property as resolved promise.\n        if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {\n          streamSink.sinkCapability.resolve();\n        }\n        // Reset desiredSize property of sink on every pull.\n        streamSink.desiredSize = data.desiredSize;\n\n        Promise.try(streamSink.onPull || onFn).then(\n          function () {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.PULL_COMPLETE,\n              streamId,\n              success: true,\n            });\n          },\n          function (reason) {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.PULL_COMPLETE,\n              streamId,\n              reason: wrapReason(reason),\n            });\n          }\n        );\n        break;\n      case StreamKind.ENQUEUE:\n        assert(streamController, \"enqueue should have stream controller\");\n        if (streamController.isClosed) {\n          break;\n        }\n        streamController.controller.enqueue(data.chunk);\n        break;\n      case StreamKind.CLOSE:\n        assert(streamController, \"close should have stream controller\");\n        if (streamController.isClosed) {\n          break;\n        }\n        streamController.isClosed = true;\n        streamController.controller.close();\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.ERROR:\n        assert(streamController, \"error should have stream controller\");\n        streamController.controller.error(wrapReason(data.reason));\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.CANCEL_COMPLETE:\n        if (data.success) {\n          streamController.cancelCall.resolve();\n        } else {\n          streamController.cancelCall.reject(wrapReason(data.reason));\n        }\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.CANCEL:\n        if (!streamSink) {\n          break;\n        }\n        const dataReason = wrapReason(data.reason);\n\n        Promise.try(streamSink.onCancel || onFn, dataReason).then(\n          function () {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.CANCEL_COMPLETE,\n              streamId,\n              success: true,\n            });\n          },\n          function (reason) {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.CANCEL_COMPLETE,\n              streamId,\n              reason: wrapReason(reason),\n            });\n          }\n        );\n        streamSink.sinkCapability.reject(dataReason);\n        streamSink.isCancelled = true;\n        delete this.streamSinks[streamId];\n        break;\n      default:\n        throw new Error(\"Unexpected stream case\");\n    }\n  }\n\n  async #deleteStreamController(streamController, streamId) {\n    // Delete the `streamController` only when the start, pull, and cancel\n    // capabilities have settled, to prevent `TypeError`s.\n    await Promise.allSettled([\n      streamController.startCall?.promise,\n      streamController.pullCall?.promise,\n      streamController.cancelCall?.promise,\n    ]);\n    delete this.streamControllers[streamId];\n  }\n\n  destroy() {\n    this.#messageAC?.abort();\n    this.#messageAC = null;\n  }\n}\n\nexport { MessageHandler, wrapReason };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { unreachable } from \"../shared/util.js\";\n\nclass BaseCanvasFactory {\n  #enableHWA = false;\n\n  constructor({ enableHWA = false }) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseCanvasFactory\n    ) {\n      unreachable(\"Cannot initialize BaseCanvasFactory.\");\n    }\n    this.#enableHWA = enableHWA;\n  }\n\n  create(width, height) {\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid canvas size\");\n    }\n    const canvas = this._createCanvas(width, height);\n    return {\n      canvas,\n      context: canvas.getContext(\"2d\", {\n        willReadFrequently: !this.#enableHWA,\n      }),\n    };\n  }\n\n  reset(canvasAndContext, width, height) {\n    if (!canvasAndContext.canvas) {\n      throw new Error(\"Canvas is not specified\");\n    }\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid canvas size\");\n    }\n    canvasAndContext.canvas.width = width;\n    canvasAndContext.canvas.height = height;\n  }\n\n  destroy(canvasAndContext) {\n    if (!canvasAndContext.canvas) {\n      throw new Error(\"Canvas is not specified\");\n    }\n    // Zeroing the width and height cause Firefox to release graphics\n    // resources immediately, which can greatly reduce memory consumption.\n    canvasAndContext.canvas.width = 0;\n    canvasAndContext.canvas.height = 0;\n    canvasAndContext.canvas = null;\n    canvasAndContext.context = null;\n  }\n\n  /**\n   * @ignore\n   */\n  _createCanvas(width, height) {\n    unreachable(\"Abstract method `_createCanvas` called.\");\n  }\n}\n\nclass DOMCanvasFactory extends BaseCanvasFactory {\n  constructor({ ownerDocument = globalThis.document, enableHWA = false }) {\n    super({ enableHWA });\n    this._document = ownerDocument;\n  }\n\n  /**\n   * @ignore\n   */\n  _createCanvas(width, height) {\n    const canvas = this._document.createElement(\"canvas\");\n    canvas.width = width;\n    canvas.height = height;\n    return canvas;\n  }\n}\n\nexport { BaseCanvasFactory, DOMCanvasFactory };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringToBytes, unreachable } from \"../shared/util.js\";\nimport { fetchData } from \"./display_utils.js\";\n\nclass BaseCMapReaderFactory {\n  constructor({ baseUrl = null, isCompressed = true }) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseCMapReaderFactory\n    ) {\n      unreachable(\"Cannot initialize BaseCMapReaderFactory.\");\n    }\n    this.baseUrl = baseUrl;\n    this.isCompressed = isCompressed;\n  }\n\n  async fetch({ name }) {\n    if (!this.baseUrl) {\n      throw new Error(\n        \"Ensure that the `cMapUrl` and `cMapPacked` API parameters are provided.\"\n      );\n    }\n    if (!name) {\n      throw new Error(\"CMap name must be specified.\");\n    }\n    const url = this.baseUrl + name + (this.isCompressed ? \".bcmap\" : \"\");\n\n    return this._fetch(url)\n      .then(cMapData => ({ cMapData, isCompressed: this.isCompressed }))\n      .catch(reason => {\n        throw new Error(\n          `Unable to load ${this.isCompressed ? \"binary \" : \"\"}CMap at: ${url}`\n        );\n      });\n  }\n\n  /**\n   * @ignore\n   * @returns {Promise<Uint8Array>}\n   */\n  async _fetch(url) {\n    unreachable(\"Abstract method `_fetch` called.\");\n  }\n}\n\nclass DOMCMapReaderFactory extends BaseCMapReaderFactory {\n  /**\n   * @ignore\n   */\n  async _fetch(url) {\n    const data = await fetchData(\n      url,\n      /* type = */ this.isCompressed ? \"arraybuffer\" : \"text\"\n    );\n    return data instanceof ArrayBuffer\n      ? new Uint8Array(data)\n      : stringToBytes(data);\n  }\n}\n\nexport { BaseCMapReaderFactory, DOMCMapReaderFactory };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getRGB, isDataScheme, SVG_NS } from \"./display_utils.js\";\nimport { unreachable, Util, warn } from \"../shared/util.js\";\n\nclass BaseFilterFactory {\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseFilterFactory\n    ) {\n      unreachable(\"Cannot initialize BaseFilterFactory.\");\n    }\n  }\n\n  addFilter(maps) {\n    return \"none\";\n  }\n\n  addHCMFilter(fgColor, bgColor) {\n    return \"none\";\n  }\n\n  addAlphaFilter(map) {\n    return \"none\";\n  }\n\n  addLuminosityFilter(map) {\n    return \"none\";\n  }\n\n  addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n    return \"none\";\n  }\n\n  destroy(keepHCM = false) {}\n}\n\n/**\n * FilterFactory aims to create some SVG filters we can use when drawing an\n * image (or whatever) on a canvas.\n * Filters aren't applied with ctx.putImageData because it just overwrites the\n * underlying pixels.\n * With these filters, it's possible for example to apply some transfer maps on\n * an image without the need to apply them on the pixel arrays: the renderer\n * does the magic for us.\n */\nclass DOMFilterFactory extends BaseFilterFactory {\n  #baseUrl;\n\n  #_cache;\n\n  #_defs;\n\n  #docId;\n\n  #document;\n\n  #_hcmCache;\n\n  #id = 0;\n\n  constructor({ docId, ownerDocument = globalThis.document }) {\n    super();\n    this.#docId = docId;\n    this.#document = ownerDocument;\n  }\n\n  get #cache() {\n    return (this.#_cache ||= new Map());\n  }\n\n  get #hcmCache() {\n    return (this.#_hcmCache ||= new Map());\n  }\n\n  get #defs() {\n    if (!this.#_defs) {\n      const div = this.#document.createElement(\"div\");\n      const { style } = div;\n      style.visibility = \"hidden\";\n      style.contain = \"strict\";\n      style.width = style.height = 0;\n      style.position = \"absolute\";\n      style.top = style.left = 0;\n      style.zIndex = -1;\n\n      const svg = this.#document.createElementNS(SVG_NS, \"svg\");\n      svg.setAttribute(\"width\", 0);\n      svg.setAttribute(\"height\", 0);\n      this.#_defs = this.#document.createElementNS(SVG_NS, \"defs\");\n      div.append(svg);\n      svg.append(this.#_defs);\n      this.#document.body.append(div);\n    }\n    return this.#_defs;\n  }\n\n  #createTables(maps) {\n    if (maps.length === 1) {\n      const mapR = maps[0];\n      const buffer = new Array(256);\n      for (let i = 0; i < 256; i++) {\n        buffer[i] = mapR[i] / 255;\n      }\n\n      const table = buffer.join(\",\");\n      return [table, table, table];\n    }\n\n    const [mapR, mapG, mapB] = maps;\n    const bufferR = new Array(256);\n    const bufferG = new Array(256);\n    const bufferB = new Array(256);\n    for (let i = 0; i < 256; i++) {\n      bufferR[i] = mapR[i] / 255;\n      bufferG[i] = mapG[i] / 255;\n      bufferB[i] = mapB[i] / 255;\n    }\n    return [bufferR.join(\",\"), bufferG.join(\",\"), bufferB.join(\",\")];\n  }\n\n  #createUrl(id) {\n    if (this.#baseUrl === undefined) {\n      // Unless a `<base>`-element is present a relative URL should work.\n      this.#baseUrl = \"\";\n\n      const url = this.#document.URL;\n      if (url !== this.#document.baseURI) {\n        if (isDataScheme(url)) {\n          warn('#createUrl: ignore \"data:\"-URL for performance reasons.');\n        } else {\n          this.#baseUrl = url.split(\"#\", 1)[0];\n        }\n      }\n    }\n    return `url(${this.#baseUrl}#${id})`;\n  }\n\n  addFilter(maps) {\n    if (!maps) {\n      return \"none\";\n    }\n\n    // When a page is zoomed the page is re-drawn but the maps are likely\n    // the same.\n    let value = this.#cache.get(maps);\n    if (value) {\n      return value;\n    }\n\n    const [tableR, tableG, tableB] = this.#createTables(maps);\n    const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`;\n\n    value = this.#cache.get(key);\n    if (value) {\n      this.#cache.set(maps, value);\n      return value;\n    }\n\n    // We create a SVG filter: feComponentTransferElement\n    //  https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement\n\n    const id = `g_${this.#docId}_transfer_map_${this.#id++}`;\n    const url = this.#createUrl(id);\n    this.#cache.set(maps, url);\n    this.#cache.set(key, url);\n\n    const filter = this.#createFilter(id);\n    this.#addTransferMapConversion(tableR, tableG, tableB, filter);\n\n    return url;\n  }\n\n  addHCMFilter(fgColor, bgColor) {\n    const key = `${fgColor}-${bgColor}`;\n    const filterName = \"base\";\n    let info = this.#hcmCache.get(filterName);\n    if (info?.key === key) {\n      return info.url;\n    }\n\n    if (info) {\n      info.filter?.remove();\n      info.key = key;\n      info.url = \"none\";\n      info.filter = null;\n    } else {\n      info = {\n        key,\n        url: \"none\",\n        filter: null,\n      };\n      this.#hcmCache.set(filterName, info);\n    }\n\n    if (!fgColor || !bgColor) {\n      return info.url;\n    }\n\n    const fgRGB = this.#getRGB(fgColor);\n    fgColor = Util.makeHexColor(...fgRGB);\n    const bgRGB = this.#getRGB(bgColor);\n    bgColor = Util.makeHexColor(...bgRGB);\n    this.#defs.style.color = \"\";\n\n    if (\n      (fgColor === \"#000000\" && bgColor === \"#ffffff\") ||\n      fgColor === bgColor\n    ) {\n      return info.url;\n    }\n\n    // https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_Colors_and_Luminance\n    //\n    // Relative luminance:\n    // https://www.w3.org/TR/WCAG20/#relativeluminancedef\n    //\n    // We compute the rounded luminance of the default background color.\n    // Then for every color in the pdf, if its rounded luminance is the\n    // same as the background one then it's replaced by the new\n    // background color else by the foreground one.\n    const map = new Array(256);\n    for (let i = 0; i <= 255; i++) {\n      const x = i / 255;\n      map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n    }\n    const table = map.join(\",\");\n\n    const id = `g_${this.#docId}_hcm_filter`;\n    const filter = (info.filter = this.#createFilter(id));\n    this.#addTransferMapConversion(table, table, table, filter);\n    this.#addGrayConversion(filter);\n\n    const getSteps = (c, n) => {\n      const start = fgRGB[c] / 255;\n      const end = bgRGB[c] / 255;\n      const arr = new Array(n + 1);\n      for (let i = 0; i <= n; i++) {\n        arr[i] = start + (i / n) * (end - start);\n      }\n      return arr.join(\",\");\n    };\n    this.#addTransferMapConversion(\n      getSteps(0, 5),\n      getSteps(1, 5),\n      getSteps(2, 5),\n      filter\n    );\n\n    info.url = this.#createUrl(id);\n    return info.url;\n  }\n\n  addAlphaFilter(map) {\n    // When a page is zoomed the page is re-drawn but the maps are likely\n    // the same.\n    let value = this.#cache.get(map);\n    if (value) {\n      return value;\n    }\n\n    const [tableA] = this.#createTables([map]);\n    const key = `alpha_${tableA}`;\n\n    value = this.#cache.get(key);\n    if (value) {\n      this.#cache.set(map, value);\n      return value;\n    }\n\n    const id = `g_${this.#docId}_alpha_map_${this.#id++}`;\n    const url = this.#createUrl(id);\n    this.#cache.set(map, url);\n    this.#cache.set(key, url);\n\n    const filter = this.#createFilter(id);\n    this.#addTransferMapAlphaConversion(tableA, filter);\n\n    return url;\n  }\n\n  addLuminosityFilter(map) {\n    // When a page is zoomed the page is re-drawn but the maps are likely\n    // the same.\n    let value = this.#cache.get(map || \"luminosity\");\n    if (value) {\n      return value;\n    }\n\n    let tableA, key;\n    if (map) {\n      [tableA] = this.#createTables([map]);\n      key = `luminosity_${tableA}`;\n    } else {\n      key = \"luminosity\";\n    }\n\n    value = this.#cache.get(key);\n    if (value) {\n      this.#cache.set(map, value);\n      return value;\n    }\n\n    const id = `g_${this.#docId}_luminosity_map_${this.#id++}`;\n    const url = this.#createUrl(id);\n    this.#cache.set(map, url);\n    this.#cache.set(key, url);\n\n    const filter = this.#createFilter(id);\n    this.#addLuminosityConversion(filter);\n    if (map) {\n      this.#addTransferMapAlphaConversion(tableA, filter);\n    }\n\n    return url;\n  }\n\n  addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n    const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`;\n    let info = this.#hcmCache.get(filterName);\n    if (info?.key === key) {\n      return info.url;\n    }\n\n    if (info) {\n      info.filter?.remove();\n      info.key = key;\n      info.url = \"none\";\n      info.filter = null;\n    } else {\n      info = {\n        key,\n        url: \"none\",\n        filter: null,\n      };\n      this.#hcmCache.set(filterName, info);\n    }\n\n    if (!fgColor || !bgColor) {\n      return info.url;\n    }\n\n    const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this));\n    let fgGray = Math.round(\n      0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]\n    );\n    let bgGray = Math.round(\n      0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]\n    );\n    let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(\n      this.#getRGB.bind(this)\n    );\n    if (bgGray < fgGray) {\n      [fgGray, bgGray, newFgRGB, newBgRGB] = [\n        bgGray,\n        fgGray,\n        newBgRGB,\n        newFgRGB,\n      ];\n    }\n    this.#defs.style.color = \"\";\n\n    // Now we can create the filters to highlight some canvas parts.\n    // The colors in the pdf will almost be Canvas and CanvasText, hence we\n    // want to filter them to finally get Highlight and HighlightText.\n    // Since we're in HCM the background color and the foreground color should\n    // be really different when converted to grayscale (if they're not then it\n    // means that we've a poor contrast). Once the canvas colors are converted\n    // to grayscale we can easily map them on their new colors.\n    // The grayscale step is important because if we've something like:\n    //   fgColor = #FF....\n    //   bgColor = #FF....\n    //   then we are enable to map the red component on the new red components\n    //   which can be different.\n\n    const getSteps = (fg, bg, n) => {\n      const arr = new Array(256);\n      const step = (bgGray - fgGray) / n;\n      const newStart = fg / 255;\n      const newStep = (bg - fg) / (255 * n);\n      let prev = 0;\n      for (let i = 0; i <= n; i++) {\n        const k = Math.round(fgGray + i * step);\n        const value = newStart + i * newStep;\n        for (let j = prev; j <= k; j++) {\n          arr[j] = value;\n        }\n        prev = k + 1;\n      }\n      for (let i = prev; i < 256; i++) {\n        arr[i] = arr[prev - 1];\n      }\n      return arr.join(\",\");\n    };\n\n    const id = `g_${this.#docId}_hcm_${filterName}_filter`;\n    const filter = (info.filter = this.#createFilter(id));\n\n    this.#addGrayConversion(filter);\n    this.#addTransferMapConversion(\n      getSteps(newFgRGB[0], newBgRGB[0], 5),\n      getSteps(newFgRGB[1], newBgRGB[1], 5),\n      getSteps(newFgRGB[2], newBgRGB[2], 5),\n      filter\n    );\n\n    info.url = this.#createUrl(id);\n    return info.url;\n  }\n\n  destroy(keepHCM = false) {\n    if (keepHCM && this.#_hcmCache?.size) {\n      return;\n    }\n    this.#_defs?.parentNode.parentNode.remove();\n    this.#_defs = null;\n\n    this.#_cache?.clear();\n    this.#_cache = null;\n\n    this.#_hcmCache?.clear();\n    this.#_hcmCache = null;\n\n    this.#id = 0;\n  }\n\n  #addLuminosityConversion(filter) {\n    const feColorMatrix = this.#document.createElementNS(\n      SVG_NS,\n      \"feColorMatrix\"\n    );\n    feColorMatrix.setAttribute(\"type\", \"matrix\");\n    feColorMatrix.setAttribute(\n      \"values\",\n      \"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0\"\n    );\n    filter.append(feColorMatrix);\n  }\n\n  #addGrayConversion(filter) {\n    const feColorMatrix = this.#document.createElementNS(\n      SVG_NS,\n      \"feColorMatrix\"\n    );\n    feColorMatrix.setAttribute(\"type\", \"matrix\");\n    feColorMatrix.setAttribute(\n      \"values\",\n      \"0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0\"\n    );\n    filter.append(feColorMatrix);\n  }\n\n  #createFilter(id) {\n    const filter = this.#document.createElementNS(SVG_NS, \"filter\");\n    filter.setAttribute(\"color-interpolation-filters\", \"sRGB\");\n    filter.setAttribute(\"id\", id);\n    this.#defs.append(filter);\n\n    return filter;\n  }\n\n  #appendFeFunc(feComponentTransfer, func, table) {\n    const feFunc = this.#document.createElementNS(SVG_NS, func);\n    feFunc.setAttribute(\"type\", \"discrete\");\n    feFunc.setAttribute(\"tableValues\", table);\n    feComponentTransfer.append(feFunc);\n  }\n\n  #addTransferMapConversion(rTable, gTable, bTable, filter) {\n    const feComponentTransfer = this.#document.createElementNS(\n      SVG_NS,\n      \"feComponentTransfer\"\n    );\n    filter.append(feComponentTransfer);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncR\", rTable);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncG\", gTable);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncB\", bTable);\n  }\n\n  #addTransferMapAlphaConversion(aTable, filter) {\n    const feComponentTransfer = this.#document.createElementNS(\n      SVG_NS,\n      \"feComponentTransfer\"\n    );\n    filter.append(feComponentTransfer);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncA\", aTable);\n  }\n\n  #getRGB(color) {\n    this.#defs.style.color = color;\n    return getRGB(getComputedStyle(this.#defs).getPropertyValue(\"color\"));\n  }\n}\n\nexport { BaseFilterFactory, DOMFilterFactory };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { fetchData } from \"./display_utils.js\";\nimport { unreachable } from \"../shared/util.js\";\n\nclass BaseStandardFontDataFactory {\n  constructor({ baseUrl = null }) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseStandardFontDataFactory\n    ) {\n      unreachable(\"Cannot initialize BaseStandardFontDataFactory.\");\n    }\n    this.baseUrl = baseUrl;\n  }\n\n  async fetch({ filename }) {\n    if (!this.baseUrl) {\n      throw new Error(\n        \"Ensure that the `standardFontDataUrl` API parameter is provided.\"\n      );\n    }\n    if (!filename) {\n      throw new Error(\"Font filename must be specified.\");\n    }\n    const url = `${this.baseUrl}${filename}`;\n\n    return this._fetch(url).catch(reason => {\n      throw new Error(`Unable to load font data at: ${url}`);\n    });\n  }\n\n  /**\n   * @ignore\n   * @returns {Promise<Uint8Array>}\n   */\n  async _fetch(url) {\n    unreachable(\"Abstract method `_fetch` called.\");\n  }\n}\n\nclass DOMStandardFontDataFactory extends BaseStandardFontDataFactory {\n  /**\n   * @ignore\n   */\n  async _fetch(url) {\n    const data = await fetchData(url, /* type = */ \"arraybuffer\");\n    return new Uint8Array(data);\n  }\n}\n\nexport { BaseStandardFontDataFactory, DOMStandardFontDataFactory };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\nimport { isNodeJS, warn } from \"../shared/util.js\";\nimport { BaseCanvasFactory } from \"./canvas_factory.js\";\nimport { BaseCMapReaderFactory } from \"./cmap_reader_factory.js\";\nimport { BaseFilterFactory } from \"./filter_factory.js\";\nimport { BaseStandardFontDataFactory } from \"./standard_fontdata_factory.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n  throw new Error(\n    'Module \"./node_utils.js\" shall not be used with MOZCENTRAL builds.'\n  );\n}\n\nif (isNodeJS) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"SKIP_BABEL\")) {\n    warn(\"Please use the `legacy` build in Node.js environments.\");\n  } else {\n    let canvas;\n    try {\n      const require = process\n        .getBuiltinModule(\"module\")\n        .createRequire(import.meta.url);\n\n      try {\n        canvas = require(\"@napi-rs/canvas\");\n      } catch (ex) {\n        warn(`Cannot load \"@napi-rs/canvas\" package: \"${ex}\".`);\n      }\n    } catch (ex) {\n      warn(`Cannot access the \\`require\\` function: \"${ex}\".`);\n    }\n\n    if (!globalThis.DOMMatrix) {\n      if (canvas?.DOMMatrix) {\n        globalThis.DOMMatrix = canvas.DOMMatrix;\n      } else {\n        warn(\"Cannot polyfill `DOMMatrix`, rendering may be broken.\");\n      }\n    }\n    if (!globalThis.ImageData) {\n      if (canvas?.ImageData) {\n        globalThis.ImageData = canvas.ImageData;\n      } else {\n        warn(\"Cannot polyfill `ImageData`, rendering may be broken.\");\n      }\n    }\n    if (!globalThis.Path2D) {\n      if (canvas?.Path2D) {\n        globalThis.Path2D = canvas.Path2D;\n      } else {\n        warn(\"Cannot polyfill `Path2D`, rendering may be broken.\");\n      }\n    }\n  }\n}\n\nasync function fetchData(url) {\n  const fs = process.getBuiltinModule(\"fs\");\n  const data = await fs.promises.readFile(url);\n  return new Uint8Array(data);\n}\n\nclass NodeFilterFactory extends BaseFilterFactory {}\n\nclass NodeCanvasFactory extends BaseCanvasFactory {\n  /**\n   * @ignore\n   */\n  _createCanvas(width, height) {\n    const require = process\n      .getBuiltinModule(\"module\")\n      .createRequire(import.meta.url);\n    const canvas = require(\"@napi-rs/canvas\");\n    return canvas.createCanvas(width, height);\n  }\n}\n\nclass NodeCMapReaderFactory extends BaseCMapReaderFactory {\n  /**\n   * @ignore\n   */\n  async _fetch(url) {\n    return fetchData(url);\n  }\n}\n\nclass NodeStandardFontDataFactory extends BaseStandardFontDataFactory {\n  /**\n   * @ignore\n   */\n  async _fetch(url) {\n    return fetchData(url);\n  }\n}\n\nexport {\n  fetchData,\n  NodeCanvasFactory,\n  NodeCMapReaderFactory,\n  NodeFilterFactory,\n  NodeStandardFontDataFactory,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FormatError, info, unreachable, Util } from \"../shared/util.js\";\nimport { getCurrentTransform } from \"./display_utils.js\";\n\nconst PathType = {\n  FILL: \"Fill\",\n  STROKE: \"Stroke\",\n  SHADING: \"Shading\",\n};\n\nfunction applyBoundingBox(ctx, bbox) {\n  if (!bbox) {\n    return;\n  }\n  const width = bbox[2] - bbox[0];\n  const height = bbox[3] - bbox[1];\n  const region = new Path2D();\n  region.rect(bbox[0], bbox[1], width, height);\n  ctx.clip(region);\n}\n\nclass BaseShadingPattern {\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseShadingPattern\n    ) {\n      unreachable(\"Cannot initialize BaseShadingPattern.\");\n    }\n  }\n\n  getPattern() {\n    unreachable(\"Abstract method `getPattern` called.\");\n  }\n}\n\nclass RadialAxialShadingPattern extends BaseShadingPattern {\n  constructor(IR) {\n    super();\n    this._type = IR[1];\n    this._bbox = IR[2];\n    this._colorStops = IR[3];\n    this._p0 = IR[4];\n    this._p1 = IR[5];\n    this._r0 = IR[6];\n    this._r1 = IR[7];\n    this.matrix = null;\n  }\n\n  _createGradient(ctx) {\n    let grad;\n    if (this._type === \"axial\") {\n      grad = ctx.createLinearGradient(\n        this._p0[0],\n        this._p0[1],\n        this._p1[0],\n        this._p1[1]\n      );\n    } else if (this._type === \"radial\") {\n      grad = ctx.createRadialGradient(\n        this._p0[0],\n        this._p0[1],\n        this._r0,\n        this._p1[0],\n        this._p1[1],\n        this._r1\n      );\n    }\n\n    for (const colorStop of this._colorStops) {\n      grad.addColorStop(colorStop[0], colorStop[1]);\n    }\n    return grad;\n  }\n\n  getPattern(ctx, owner, inverse, pathType) {\n    let pattern;\n    if (pathType === PathType.STROKE || pathType === PathType.FILL) {\n      const ownerBBox = owner.current.getClippedPathBoundingBox(\n        pathType,\n        getCurrentTransform(ctx)\n      ) || [0, 0, 0, 0];\n      // Create a canvas that is only as big as the current path. This doesn't\n      // allow us to cache the pattern, but it generally creates much smaller\n      // canvases and saves memory use. See bug 1722807 for an example.\n      const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1;\n      const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1;\n\n      const tmpCanvas = owner.cachedCanvases.getCanvas(\n        \"pattern\",\n        width,\n        height\n      );\n\n      const tmpCtx = tmpCanvas.context;\n      tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n      tmpCtx.beginPath();\n      tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n      // Non shading fill patterns are positioned relative to the base transform\n      // (usually the page's initial transform), but we may have created a\n      // smaller canvas based on the path, so we must account for the shift.\n      tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]);\n      inverse = Util.transform(inverse, [\n        1,\n        0,\n        0,\n        1,\n        ownerBBox[0],\n        ownerBBox[1],\n      ]);\n\n      tmpCtx.transform(...owner.baseTransform);\n      if (this.matrix) {\n        tmpCtx.transform(...this.matrix);\n      }\n      applyBoundingBox(tmpCtx, this._bbox);\n\n      tmpCtx.fillStyle = this._createGradient(tmpCtx);\n      tmpCtx.fill();\n\n      pattern = ctx.createPattern(tmpCanvas.canvas, \"no-repeat\");\n      const domMatrix = new DOMMatrix(inverse);\n      pattern.setTransform(domMatrix);\n    } else {\n      // Shading fills are applied relative to the current matrix which is also\n      // how canvas gradients work, so there's no need to do anything special\n      // here.\n      applyBoundingBox(ctx, this._bbox);\n      pattern = this._createGradient(ctx);\n    }\n    return pattern;\n  }\n}\n\nfunction drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n  // Very basic Gouraud-shaded triangle rasterization algorithm.\n  const coords = context.coords,\n    colors = context.colors;\n  const bytes = data.data,\n    rowSize = data.width * 4;\n  let tmp;\n  if (coords[p1 + 1] > coords[p2 + 1]) {\n    tmp = p1;\n    p1 = p2;\n    p2 = tmp;\n    tmp = c1;\n    c1 = c2;\n    c2 = tmp;\n  }\n  if (coords[p2 + 1] > coords[p3 + 1]) {\n    tmp = p2;\n    p2 = p3;\n    p3 = tmp;\n    tmp = c2;\n    c2 = c3;\n    c3 = tmp;\n  }\n  if (coords[p1 + 1] > coords[p2 + 1]) {\n    tmp = p1;\n    p1 = p2;\n    p2 = tmp;\n    tmp = c1;\n    c1 = c2;\n    c2 = tmp;\n  }\n  const x1 = (coords[p1] + context.offsetX) * context.scaleX;\n  const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;\n  const x2 = (coords[p2] + context.offsetX) * context.scaleX;\n  const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;\n  const x3 = (coords[p3] + context.offsetX) * context.scaleX;\n  const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;\n  if (y1 >= y3) {\n    return;\n  }\n  const c1r = colors[c1],\n    c1g = colors[c1 + 1],\n    c1b = colors[c1 + 2];\n  const c2r = colors[c2],\n    c2g = colors[c2 + 1],\n    c2b = colors[c2 + 2];\n  const c3r = colors[c3],\n    c3g = colors[c3 + 1],\n    c3b = colors[c3 + 2];\n\n  const minY = Math.round(y1),\n    maxY = Math.round(y3);\n  let xa, car, cag, cab;\n  let xb, cbr, cbg, cbb;\n  for (let y = minY; y <= maxY; y++) {\n    if (y < y2) {\n      const k = y < y1 ? 0 : (y1 - y) / (y1 - y2);\n      xa = x1 - (x1 - x2) * k;\n      car = c1r - (c1r - c2r) * k;\n      cag = c1g - (c1g - c2g) * k;\n      cab = c1b - (c1b - c2b) * k;\n    } else {\n      let k;\n      if (y > y3) {\n        k = 1;\n      } else if (y2 === y3) {\n        k = 0;\n      } else {\n        k = (y2 - y) / (y2 - y3);\n      }\n      xa = x2 - (x2 - x3) * k;\n      car = c2r - (c2r - c3r) * k;\n      cag = c2g - (c2g - c3g) * k;\n      cab = c2b - (c2b - c3b) * k;\n    }\n\n    let k;\n    if (y < y1) {\n      k = 0;\n    } else if (y > y3) {\n      k = 1;\n    } else {\n      k = (y1 - y) / (y1 - y3);\n    }\n    xb = x1 - (x1 - x3) * k;\n    cbr = c1r - (c1r - c3r) * k;\n    cbg = c1g - (c1g - c3g) * k;\n    cbb = c1b - (c1b - c3b) * k;\n    const x1_ = Math.round(Math.min(xa, xb));\n    const x2_ = Math.round(Math.max(xa, xb));\n    let j = rowSize * y + x1_ * 4;\n    for (let x = x1_; x <= x2_; x++) {\n      k = (xa - x) / (xa - xb);\n      if (k < 0) {\n        k = 0;\n      } else if (k > 1) {\n        k = 1;\n      }\n      bytes[j++] = (car - (car - cbr) * k) | 0;\n      bytes[j++] = (cag - (cag - cbg) * k) | 0;\n      bytes[j++] = (cab - (cab - cbb) * k) | 0;\n      bytes[j++] = 255;\n    }\n  }\n}\n\nfunction drawFigure(data, figure, context) {\n  const ps = figure.coords;\n  const cs = figure.colors;\n  let i, ii;\n  switch (figure.type) {\n    case \"lattice\":\n      const verticesPerRow = figure.verticesPerRow;\n      const rows = Math.floor(ps.length / verticesPerRow) - 1;\n      const cols = verticesPerRow - 1;\n      for (i = 0; i < rows; i++) {\n        let q = i * verticesPerRow;\n        for (let j = 0; j < cols; j++, q++) {\n          drawTriangle(\n            data,\n            context,\n            ps[q],\n            ps[q + 1],\n            ps[q + verticesPerRow],\n            cs[q],\n            cs[q + 1],\n            cs[q + verticesPerRow]\n          );\n          drawTriangle(\n            data,\n            context,\n            ps[q + verticesPerRow + 1],\n            ps[q + 1],\n            ps[q + verticesPerRow],\n            cs[q + verticesPerRow + 1],\n            cs[q + 1],\n            cs[q + verticesPerRow]\n          );\n        }\n      }\n      break;\n    case \"triangles\":\n      for (i = 0, ii = ps.length; i < ii; i += 3) {\n        drawTriangle(\n          data,\n          context,\n          ps[i],\n          ps[i + 1],\n          ps[i + 2],\n          cs[i],\n          cs[i + 1],\n          cs[i + 2]\n        );\n      }\n      break;\n    default:\n      throw new Error(\"illegal figure\");\n  }\n}\n\nclass MeshShadingPattern extends BaseShadingPattern {\n  constructor(IR) {\n    super();\n    this._coords = IR[2];\n    this._colors = IR[3];\n    this._figures = IR[4];\n    this._bounds = IR[5];\n    this._bbox = IR[7];\n    this._background = IR[8];\n    this.matrix = null;\n  }\n\n  _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) {\n    // we will increase scale on some weird factor to let antialiasing take\n    // care of \"rough\" edges\n    const EXPECTED_SCALE = 1.1;\n    // MAX_PATTERN_SIZE is used to avoid OOM situation.\n    const MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough\n    // We need to keep transparent border around our pattern for fill():\n    // createPattern with 'no-repeat' will bleed edges across entire area.\n    const BORDER_SIZE = 2;\n\n    const offsetX = Math.floor(this._bounds[0]);\n    const offsetY = Math.floor(this._bounds[1]);\n    const boundsWidth = Math.ceil(this._bounds[2]) - offsetX;\n    const boundsHeight = Math.ceil(this._bounds[3]) - offsetY;\n\n    const width = Math.min(\n      Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)),\n      MAX_PATTERN_SIZE\n    );\n    const height = Math.min(\n      Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)),\n      MAX_PATTERN_SIZE\n    );\n    const scaleX = boundsWidth / width;\n    const scaleY = boundsHeight / height;\n\n    const context = {\n      coords: this._coords,\n      colors: this._colors,\n      offsetX: -offsetX,\n      offsetY: -offsetY,\n      scaleX: 1 / scaleX,\n      scaleY: 1 / scaleY,\n    };\n\n    const paddedWidth = width + BORDER_SIZE * 2;\n    const paddedHeight = height + BORDER_SIZE * 2;\n\n    const tmpCanvas = cachedCanvases.getCanvas(\n      \"mesh\",\n      paddedWidth,\n      paddedHeight\n    );\n    const tmpCtx = tmpCanvas.context;\n\n    const data = tmpCtx.createImageData(width, height);\n    if (backgroundColor) {\n      const bytes = data.data;\n      for (let i = 0, ii = bytes.length; i < ii; i += 4) {\n        bytes[i] = backgroundColor[0];\n        bytes[i + 1] = backgroundColor[1];\n        bytes[i + 2] = backgroundColor[2];\n        bytes[i + 3] = 255;\n      }\n    }\n    for (const figure of this._figures) {\n      drawFigure(data, figure, context);\n    }\n    tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n    const canvas = tmpCanvas.canvas;\n\n    return {\n      canvas,\n      offsetX: offsetX - BORDER_SIZE * scaleX,\n      offsetY: offsetY - BORDER_SIZE * scaleY,\n      scaleX,\n      scaleY,\n    };\n  }\n\n  getPattern(ctx, owner, inverse, pathType) {\n    applyBoundingBox(ctx, this._bbox);\n    let scale;\n    if (pathType === PathType.SHADING) {\n      scale = Util.singularValueDecompose2dScale(getCurrentTransform(ctx));\n    } else {\n      // Obtain scale from matrix and current transformation matrix.\n      scale = Util.singularValueDecompose2dScale(owner.baseTransform);\n      if (this.matrix) {\n        const matrixScale = Util.singularValueDecompose2dScale(this.matrix);\n        scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];\n      }\n    }\n\n    // Rasterizing on the main thread since sending/queue large canvases\n    // might cause OOM.\n    const temporaryPatternCanvas = this._createMeshCanvas(\n      scale,\n      pathType === PathType.SHADING ? null : this._background,\n      owner.cachedCanvases\n    );\n\n    if (pathType !== PathType.SHADING) {\n      ctx.setTransform(...owner.baseTransform);\n      if (this.matrix) {\n        ctx.transform(...this.matrix);\n      }\n    }\n\n    ctx.translate(\n      temporaryPatternCanvas.offsetX,\n      temporaryPatternCanvas.offsetY\n    );\n    ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);\n\n    return ctx.createPattern(temporaryPatternCanvas.canvas, \"no-repeat\");\n  }\n}\n\nclass DummyShadingPattern extends BaseShadingPattern {\n  getPattern() {\n    return \"hotpink\";\n  }\n}\n\nfunction getShadingPattern(IR) {\n  switch (IR[0]) {\n    case \"RadialAxial\":\n      return new RadialAxialShadingPattern(IR);\n    case \"Mesh\":\n      return new MeshShadingPattern(IR);\n    case \"Dummy\":\n      return new DummyShadingPattern();\n  }\n  throw new Error(`Unknown IR type: ${IR[0]}`);\n}\n\nconst PaintType = {\n  COLORED: 1,\n  UNCOLORED: 2,\n};\n\nclass TilingPattern {\n  // 10in @ 300dpi shall be enough.\n  static MAX_PATTERN_SIZE = 3000;\n\n  constructor(IR, color, ctx, canvasGraphicsFactory, baseTransform) {\n    this.operatorList = IR[2];\n    this.matrix = IR[3];\n    this.bbox = IR[4];\n    this.xstep = IR[5];\n    this.ystep = IR[6];\n    this.paintType = IR[7];\n    this.tilingType = IR[8];\n    this.color = color;\n    this.ctx = ctx;\n    this.canvasGraphicsFactory = canvasGraphicsFactory;\n    this.baseTransform = baseTransform;\n  }\n\n  createPatternCanvas(owner) {\n    const {\n      bbox,\n      operatorList,\n      paintType,\n      tilingType,\n      color,\n      canvasGraphicsFactory,\n    } = this;\n    let { xstep, ystep } = this;\n    xstep = Math.abs(xstep);\n    ystep = Math.abs(ystep);\n\n    info(\"TilingType: \" + tilingType);\n\n    // A tiling pattern as defined by PDF spec 8.7.2 is a cell whose size is\n    // described by bbox, and may repeat regularly by shifting the cell by\n    // xstep and ystep.\n    // Because the HTML5 canvas API does not support pattern repetition with\n    // gaps in between, we use the xstep/ystep instead of the bbox's size.\n    //\n    // This has the following consequences (similarly for ystep):\n    //\n    // - If xstep is the same as bbox, then there is no observable difference.\n    //\n    // - If xstep is larger than bbox, then the pattern canvas is partially\n    //   empty: the area bounded by bbox is painted, the outside area is void.\n    //\n    // - If xstep is smaller than bbox, then the pixels between xstep and the\n    //   bbox boundary will be missing. This is INCORRECT behavior.\n    //   \"Figures on adjacent tiles should not overlap\" (PDF spec 8.7.3.1),\n    //   but overlapping cells without common pixels are still valid.\n\n    const x0 = bbox[0],\n      y0 = bbox[1],\n      x1 = bbox[2],\n      y1 = bbox[3];\n    const width = x1 - x0;\n    const height = y1 - y0;\n\n    // Obtain scale from matrix and current transformation matrix.\n    const matrixScale = Util.singularValueDecompose2dScale(this.matrix);\n    const curMatrixScale = Util.singularValueDecompose2dScale(\n      this.baseTransform\n    );\n    const combinedScaleX = matrixScale[0] * curMatrixScale[0];\n    const combinedScaleY = matrixScale[1] * curMatrixScale[1];\n\n    let canvasWidth = width,\n      canvasHeight = height,\n      redrawHorizontally = false,\n      redrawVertically = false;\n\n    const xScaledStep = Math.ceil(xstep * combinedScaleX);\n    const yScaledStep = Math.ceil(ystep * combinedScaleY);\n    const xScaledWidth = Math.ceil(width * combinedScaleX);\n    const yScaledHeight = Math.ceil(height * combinedScaleY);\n\n    if (xScaledStep >= xScaledWidth) {\n      canvasWidth = xstep;\n    } else {\n      redrawHorizontally = true;\n    }\n    if (yScaledStep >= yScaledHeight) {\n      canvasHeight = ystep;\n    } else {\n      redrawVertically = true;\n    }\n\n    // Use width and height values that are as close as possible to the end\n    // result when the pattern is used. Too low value makes the pattern look\n    // blurry. Too large value makes it look too crispy.\n    const dimx = this.getSizeAndScale(\n      canvasWidth,\n      this.ctx.canvas.width,\n      combinedScaleX\n    );\n    const dimy = this.getSizeAndScale(\n      canvasHeight,\n      this.ctx.canvas.height,\n      combinedScaleY\n    );\n\n    const tmpCanvas = owner.cachedCanvases.getCanvas(\n      \"pattern\",\n      dimx.size,\n      dimy.size\n    );\n    const tmpCtx = tmpCanvas.context;\n    const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);\n    graphics.groupLevel = owner.groupLevel;\n\n    this.setFillAndStrokeStyleToContext(graphics, paintType, color);\n\n    tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0);\n    graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0);\n\n    // To match CanvasGraphics beginDrawing we must save the context here or\n    // else we end up with unbalanced save/restores.\n    tmpCtx.save();\n\n    this.clipBbox(graphics, x0, y0, x1, y1);\n\n    graphics.baseTransform = getCurrentTransform(graphics.ctx);\n\n    graphics.executeOperatorList(operatorList);\n\n    graphics.endDrawing();\n\n    tmpCtx.restore();\n\n    if (redrawHorizontally || redrawVertically) {\n      // The tile is overlapping itself, so we create a new tile with\n      // dimensions xstep * ystep.\n      // Then we draw the overlapping parts of the original tile on the new\n      // tile.\n      // Just as a side note, the code here works correctly even if we don't\n      // have to redraw the tile horizontally or vertically. In that case, the\n      // original tile is drawn on the new tile only once, but it's useless.\n      const image = tmpCanvas.canvas;\n      if (redrawHorizontally) {\n        canvasWidth = xstep;\n      }\n      if (redrawVertically) {\n        canvasHeight = ystep;\n      }\n\n      const dimx2 = this.getSizeAndScale(\n        canvasWidth,\n        this.ctx.canvas.width,\n        combinedScaleX\n      );\n      const dimy2 = this.getSizeAndScale(\n        canvasHeight,\n        this.ctx.canvas.height,\n        combinedScaleY\n      );\n\n      const xSize = dimx2.size;\n      const ySize = dimy2.size;\n      const tmpCanvas2 = owner.cachedCanvases.getCanvas(\n        \"pattern-workaround\",\n        xSize,\n        ySize\n      );\n      const tmpCtx2 = tmpCanvas2.context;\n      const ii = redrawHorizontally ? Math.floor(width / xstep) : 0;\n      const jj = redrawVertically ? Math.floor(height / ystep) : 0;\n\n      // Draw the overlapping parts of the original tile on the new tile.\n      for (let i = 0; i <= ii; i++) {\n        for (let j = 0; j <= jj; j++) {\n          tmpCtx2.drawImage(\n            image,\n            xSize * i,\n            ySize * j,\n            xSize,\n            ySize,\n            0,\n            0,\n            xSize,\n            ySize\n          );\n        }\n      }\n      return {\n        canvas: tmpCanvas2.canvas,\n        scaleX: dimx2.scale,\n        scaleY: dimy2.scale,\n        offsetX: x0,\n        offsetY: y0,\n      };\n    }\n\n    return {\n      canvas: tmpCanvas.canvas,\n      scaleX: dimx.scale,\n      scaleY: dimy.scale,\n      offsetX: x0,\n      offsetY: y0,\n    };\n  }\n\n  getSizeAndScale(step, realOutputSize, scale) {\n    // MAX_PATTERN_SIZE is used to avoid OOM situation.\n    // Use the destination canvas's size if it is bigger than the hard-coded\n    // limit of MAX_PATTERN_SIZE to avoid clipping patterns that cover the\n    // whole canvas.\n    const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize);\n    let size = Math.ceil(step * scale);\n    if (size >= maxSize) {\n      size = maxSize;\n    } else {\n      scale = size / step;\n    }\n    return { scale, size };\n  }\n\n  clipBbox(graphics, x0, y0, x1, y1) {\n    const bboxWidth = x1 - x0;\n    const bboxHeight = y1 - y0;\n    graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);\n    graphics.current.updateRectMinMax(getCurrentTransform(graphics.ctx), [\n      x0,\n      y0,\n      x1,\n      y1,\n    ]);\n    graphics.clip();\n    graphics.endPath();\n  }\n\n  setFillAndStrokeStyleToContext(graphics, paintType, color) {\n    const context = graphics.ctx,\n      current = graphics.current;\n    switch (paintType) {\n      case PaintType.COLORED:\n        const ctx = this.ctx;\n        context.fillStyle = ctx.fillStyle;\n        context.strokeStyle = ctx.strokeStyle;\n        current.fillColor = ctx.fillStyle;\n        current.strokeColor = ctx.strokeStyle;\n        break;\n      case PaintType.UNCOLORED:\n        const cssColor = Util.makeHexColor(color[0], color[1], color[2]);\n        context.fillStyle = cssColor;\n        context.strokeStyle = cssColor;\n        // Set color needed by image masks (fixes issues 3226 and 8741).\n        current.fillColor = cssColor;\n        current.strokeColor = cssColor;\n        break;\n      default:\n        throw new FormatError(`Unsupported paint type: ${paintType}`);\n    }\n  }\n\n  getPattern(ctx, owner, inverse, pathType) {\n    // PDF spec 8.7.2 NOTE 1: pattern's matrix is relative to initial matrix.\n    let matrix = inverse;\n    if (pathType !== PathType.SHADING) {\n      matrix = Util.transform(matrix, owner.baseTransform);\n      if (this.matrix) {\n        matrix = Util.transform(matrix, this.matrix);\n      }\n    }\n\n    const temporaryPatternCanvas = this.createPatternCanvas(owner);\n\n    let domMatrix = new DOMMatrix(matrix);\n    // Rescale and so that the ctx.createPattern call generates a pattern with\n    // the desired size.\n    domMatrix = domMatrix.translate(\n      temporaryPatternCanvas.offsetX,\n      temporaryPatternCanvas.offsetY\n    );\n    domMatrix = domMatrix.scale(\n      1 / temporaryPatternCanvas.scaleX,\n      1 / temporaryPatternCanvas.scaleY\n    );\n\n    const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, \"repeat\");\n    pattern.setTransform(domMatrix);\n\n    return pattern;\n  }\n}\n\nexport { getShadingPattern, PathType, TilingPattern };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FeatureTest, ImageKind } from \"./util.js\";\n\nfunction convertToRGBA(params) {\n  switch (params.kind) {\n    case ImageKind.GRAYSCALE_1BPP:\n      return convertBlackAndWhiteToRGBA(params);\n    case ImageKind.RGB_24BPP:\n      return convertRGBToRGBA(params);\n  }\n\n  return null;\n}\n\nfunction convertBlackAndWhiteToRGBA({\n  src,\n  srcPos = 0,\n  dest,\n  width,\n  height,\n  nonBlackColor = 0xffffffff,\n  inverseDecode = false,\n}) {\n  const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n  const [zeroMapping, oneMapping] = inverseDecode\n    ? [nonBlackColor, black]\n    : [black, nonBlackColor];\n  const widthInSource = width >> 3;\n  const widthRemainder = width & 7;\n  const srcLength = src.length;\n  dest = new Uint32Array(dest.buffer);\n  let destPos = 0;\n\n  for (let i = 0; i < height; i++) {\n    for (const max = srcPos + widthInSource; srcPos < max; srcPos++) {\n      const elem = srcPos < srcLength ? src[srcPos] : 255;\n      dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping;\n      dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping;\n      dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping;\n      dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping;\n      dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping;\n      dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping;\n      dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping;\n      dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping;\n    }\n    if (widthRemainder === 0) {\n      continue;\n    }\n    const elem = srcPos < srcLength ? src[srcPos++] : 255;\n    for (let j = 0; j < widthRemainder; j++) {\n      dest[destPos++] = elem & (1 << (7 - j)) ? oneMapping : zeroMapping;\n    }\n  }\n  return { srcPos, destPos };\n}\n\nfunction convertRGBToRGBA({\n  src,\n  srcPos = 0,\n  dest,\n  destPos = 0,\n  width,\n  height,\n}) {\n  let i = 0;\n  const len = width * height * 3;\n  const len32 = len >> 2;\n  const src32 = new Uint32Array(src.buffer, srcPos, len32);\n\n  if (FeatureTest.isLittleEndian) {\n    // It's a way faster to do the shuffle manually instead of working\n    // component by component with some Uint8 arrays.\n    for (; i < len32 - 2; i += 3, destPos += 4) {\n      const s1 = src32[i]; // R2B1G1R1\n      const s2 = src32[i + 1]; // G3R3B2G2\n      const s3 = src32[i + 2]; // B4G4R4B3\n\n      dest[destPos] = s1 | 0xff000000;\n      dest[destPos + 1] = (s1 >>> 24) | (s2 << 8) | 0xff000000;\n      dest[destPos + 2] = (s2 >>> 16) | (s3 << 16) | 0xff000000;\n      dest[destPos + 3] = (s3 >>> 8) | 0xff000000;\n    }\n\n    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n      dest[destPos++] =\n        src[j] | (src[j + 1] << 8) | (src[j + 2] << 16) | 0xff000000;\n    }\n  } else {\n    for (; i < len32 - 2; i += 3, destPos += 4) {\n      const s1 = src32[i]; // R1G1B1R2\n      const s2 = src32[i + 1]; // G2B2R3G3\n      const s3 = src32[i + 2]; // B3R4G4B4\n\n      dest[destPos] = s1 | 0xff;\n      dest[destPos + 1] = (s1 << 24) | (s2 >>> 8) | 0xff;\n      dest[destPos + 2] = (s2 << 16) | (s3 >>> 16) | 0xff;\n      dest[destPos + 3] = (s3 << 8) | 0xff;\n    }\n\n    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n      dest[destPos++] =\n        (src[j] << 24) | (src[j + 1] << 16) | (src[j + 2] << 8) | 0xff;\n    }\n  }\n\n  return { srcPos: srcPos + len, destPos };\n}\n\nfunction grayToRGBA(src, dest) {\n  if (FeatureTest.isLittleEndian) {\n    for (let i = 0, ii = src.length; i < ii; i++) {\n      dest[i] = (src[i] * 0x10101) | 0xff000000;\n    }\n  } else {\n    for (let i = 0, ii = src.length; i < ii; i++) {\n      dest[i] = (src[i] * 0x1010100) | 0x000000ff;\n    }\n  }\n}\n\nexport { convertBlackAndWhiteToRGBA, convertToRGBA, grayToRGBA };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  FeatureTest,\n  FONT_IDENTITY_MATRIX,\n  IDENTITY_MATRIX,\n  ImageKind,\n  info,\n  isNodeJS,\n  OPS,\n  shadow,\n  TextRenderingMode,\n  unreachable,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  getCurrentTransform,\n  getCurrentTransformInverse,\n  PixelsPerInch,\n} from \"./display_utils.js\";\nimport {\n  getShadingPattern,\n  PathType,\n  TilingPattern,\n} from \"./pattern_helper.js\";\nimport { convertBlackAndWhiteToRGBA } from \"../shared/image_utils.js\";\n\n// <canvas> contexts store most of the state we need natively.\n// However, PDF needs a bit more state, which we store here.\n// Minimal font size that would be used during canvas fillText operations.\nconst MIN_FONT_SIZE = 16;\n// Maximum font size that would be used during canvas fillText operations.\nconst MAX_FONT_SIZE = 100;\n\n// Defines the time the `executeOperatorList`-method is going to be executing\n// before it stops and schedules a continue of execution.\nconst EXECUTION_TIME = 15; // ms\n// Defines the number of steps before checking the execution time.\nconst EXECUTION_STEPS = 10;\n\n// To disable Type3 compilation, set the value to `-1`.\nconst MAX_SIZE_TO_COMPILE = 1000;\n\nconst FULL_CHUNK_HEIGHT = 16;\n\n/**\n * Overrides certain methods on a 2d ctx so that when they are called they\n * will also call the same method on the destCtx. The methods that are\n * overridden are all the transformation state modifiers, path creation, and\n * save/restore. We only forward these specific methods because they are the\n * only state modifiers that we cannot copy over when we switch contexts.\n *\n * To remove mirroring call `ctx._removeMirroring()`.\n *\n * @param {Object} ctx - The 2d canvas context that will duplicate its calls on\n *   the destCtx.\n * @param {Object} destCtx - The 2d canvas context that will receive the\n *   forwarded calls.\n */\nfunction mirrorContextOperations(ctx, destCtx) {\n  if (ctx._removeMirroring) {\n    throw new Error(\"Context is already forwarding operations.\");\n  }\n  ctx.__originalSave = ctx.save;\n  ctx.__originalRestore = ctx.restore;\n  ctx.__originalRotate = ctx.rotate;\n  ctx.__originalScale = ctx.scale;\n  ctx.__originalTranslate = ctx.translate;\n  ctx.__originalTransform = ctx.transform;\n  ctx.__originalSetTransform = ctx.setTransform;\n  ctx.__originalResetTransform = ctx.resetTransform;\n  ctx.__originalClip = ctx.clip;\n  ctx.__originalMoveTo = ctx.moveTo;\n  ctx.__originalLineTo = ctx.lineTo;\n  ctx.__originalBezierCurveTo = ctx.bezierCurveTo;\n  ctx.__originalRect = ctx.rect;\n  ctx.__originalClosePath = ctx.closePath;\n  ctx.__originalBeginPath = ctx.beginPath;\n\n  ctx._removeMirroring = () => {\n    ctx.save = ctx.__originalSave;\n    ctx.restore = ctx.__originalRestore;\n    ctx.rotate = ctx.__originalRotate;\n    ctx.scale = ctx.__originalScale;\n    ctx.translate = ctx.__originalTranslate;\n    ctx.transform = ctx.__originalTransform;\n    ctx.setTransform = ctx.__originalSetTransform;\n    ctx.resetTransform = ctx.__originalResetTransform;\n\n    ctx.clip = ctx.__originalClip;\n    ctx.moveTo = ctx.__originalMoveTo;\n    ctx.lineTo = ctx.__originalLineTo;\n    ctx.bezierCurveTo = ctx.__originalBezierCurveTo;\n    ctx.rect = ctx.__originalRect;\n    ctx.closePath = ctx.__originalClosePath;\n    ctx.beginPath = ctx.__originalBeginPath;\n    delete ctx._removeMirroring;\n  };\n\n  ctx.save = function ctxSave() {\n    destCtx.save();\n    this.__originalSave();\n  };\n\n  ctx.restore = function ctxRestore() {\n    destCtx.restore();\n    this.__originalRestore();\n  };\n\n  ctx.translate = function ctxTranslate(x, y) {\n    destCtx.translate(x, y);\n    this.__originalTranslate(x, y);\n  };\n\n  ctx.scale = function ctxScale(x, y) {\n    destCtx.scale(x, y);\n    this.__originalScale(x, y);\n  };\n\n  ctx.transform = function ctxTransform(a, b, c, d, e, f) {\n    destCtx.transform(a, b, c, d, e, f);\n    this.__originalTransform(a, b, c, d, e, f);\n  };\n\n  ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {\n    destCtx.setTransform(a, b, c, d, e, f);\n    this.__originalSetTransform(a, b, c, d, e, f);\n  };\n\n  ctx.resetTransform = function ctxResetTransform() {\n    destCtx.resetTransform();\n    this.__originalResetTransform();\n  };\n\n  ctx.rotate = function ctxRotate(angle) {\n    destCtx.rotate(angle);\n    this.__originalRotate(angle);\n  };\n\n  ctx.clip = function ctxRotate(rule) {\n    destCtx.clip(rule);\n    this.__originalClip(rule);\n  };\n\n  ctx.moveTo = function (x, y) {\n    destCtx.moveTo(x, y);\n    this.__originalMoveTo(x, y);\n  };\n\n  ctx.lineTo = function (x, y) {\n    destCtx.lineTo(x, y);\n    this.__originalLineTo(x, y);\n  };\n\n  ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) {\n    destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n    this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n  };\n\n  ctx.rect = function (x, y, width, height) {\n    destCtx.rect(x, y, width, height);\n    this.__originalRect(x, y, width, height);\n  };\n\n  ctx.closePath = function () {\n    destCtx.closePath();\n    this.__originalClosePath();\n  };\n\n  ctx.beginPath = function () {\n    destCtx.beginPath();\n    this.__originalBeginPath();\n  };\n}\n\nclass CachedCanvases {\n  constructor(canvasFactory) {\n    this.canvasFactory = canvasFactory;\n    this.cache = Object.create(null);\n  }\n\n  getCanvas(id, width, height) {\n    let canvasEntry;\n    if (this.cache[id] !== undefined) {\n      canvasEntry = this.cache[id];\n      this.canvasFactory.reset(canvasEntry, width, height);\n    } else {\n      canvasEntry = this.canvasFactory.create(width, height);\n      this.cache[id] = canvasEntry;\n    }\n    return canvasEntry;\n  }\n\n  delete(id) {\n    delete this.cache[id];\n  }\n\n  clear() {\n    for (const id in this.cache) {\n      const canvasEntry = this.cache[id];\n      this.canvasFactory.destroy(canvasEntry);\n      delete this.cache[id];\n    }\n  }\n}\n\nfunction drawImageAtIntegerCoords(\n  ctx,\n  srcImg,\n  srcX,\n  srcY,\n  srcW,\n  srcH,\n  destX,\n  destY,\n  destW,\n  destH\n) {\n  const [a, b, c, d, tx, ty] = getCurrentTransform(ctx);\n  if (b === 0 && c === 0) {\n    // top-left corner is at (X, Y) and\n    // bottom-right one is at (X + width, Y + height).\n\n    // If leftX is 4.321 then it's rounded to 4.\n    // If width is 10.432 then it's rounded to 11 because\n    // rightX = leftX + width = 14.753 which is rounded to 15\n    // so after rounding the total width is 11 (15 - 4).\n    // It's why we can't just floor/ceil uniformly, it just depends\n    // on the values we've.\n\n    const tlX = destX * a + tx;\n    const rTlX = Math.round(tlX);\n    const tlY = destY * d + ty;\n    const rTlY = Math.round(tlY);\n    const brX = (destX + destW) * a + tx;\n\n    // Some pdf contains images with 1x1 images so in case of 0-width after\n    // scaling we must fallback on 1 to be sure there is something.\n    const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n    const brY = (destY + destH) * d + ty;\n    const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n\n    // We must apply a transformation in order to apply it on the image itself.\n    // For example if a == 1 && d == -1, it means that the image itself is\n    // mirrored w.r.t. the x-axis.\n    ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY);\n    ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight);\n    ctx.setTransform(a, b, c, d, tx, ty);\n\n    return [rWidth, rHeight];\n  }\n\n  if (a === 0 && d === 0) {\n    // This path is taken in issue9462.pdf (page 3).\n    const tlX = destY * c + tx;\n    const rTlX = Math.round(tlX);\n    const tlY = destX * b + ty;\n    const rTlY = Math.round(tlY);\n    const brX = (destY + destH) * c + tx;\n    const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n    const brY = (destX + destW) * b + ty;\n    const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n\n    ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY);\n    ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth);\n    ctx.setTransform(a, b, c, d, tx, ty);\n\n    return [rHeight, rWidth];\n  }\n\n  // Not a scale matrix so let the render handle the case without rounding.\n  ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH);\n\n  const scaleX = Math.hypot(a, b);\n  const scaleY = Math.hypot(c, d);\n  return [scaleX * destW, scaleY * destH];\n}\n\nfunction compileType3Glyph(imgData) {\n  const { width, height } = imgData;\n  if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) {\n    return null;\n  }\n\n  const POINT_TO_PROCESS_LIMIT = 1000;\n  const POINT_TYPES = new Uint8Array([\n    0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0,\n  ]);\n\n  const width1 = width + 1;\n  let points = new Uint8Array(width1 * (height + 1));\n  let i, j, j0;\n\n  // decodes bit-packed mask data\n  const lineSize = (width + 7) & ~7;\n  let data = new Uint8Array(lineSize * height),\n    pos = 0;\n  for (const elem of imgData.data) {\n    let mask = 128;\n    while (mask > 0) {\n      data[pos++] = elem & mask ? 0 : 255;\n      mask >>= 1;\n    }\n  }\n\n  // finding interesting points: every point is located between mask pixels,\n  // so there will be points of the (width + 1)x(height + 1) grid. Every point\n  // will have flags assigned based on neighboring mask pixels:\n  //   4 | 8\n  //   --P--\n  //   2 | 1\n  // We are interested only in points with the flags:\n  //   - outside corners: 1, 2, 4, 8;\n  //   - inside corners: 7, 11, 13, 14;\n  //   - and, intersections: 5, 10.\n  let count = 0;\n  pos = 0;\n  if (data[pos] !== 0) {\n    points[0] = 1;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j] = data[pos] ? 2 : 1;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j] = 2;\n    ++count;\n  }\n  for (i = 1; i < height; i++) {\n    pos = i * lineSize;\n    j0 = i * width1;\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0] = data[pos] ? 1 : 8;\n      ++count;\n    }\n    // 'sum' is the position of the current pixel configuration in the 'TYPES'\n    // array (in order 8-1-2-4, so we can use '>>2' to shift the column).\n    let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);\n    for (j = 1; j < width; j++) {\n      sum =\n        (sum >> 2) +\n        (data[pos + 1] ? 4 : 0) +\n        (data[pos - lineSize + 1] ? 8 : 0);\n      if (POINT_TYPES[sum]) {\n        points[j0 + j] = POINT_TYPES[sum];\n        ++count;\n      }\n      pos++;\n    }\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0 + j] = data[pos] ? 2 : 4;\n      ++count;\n    }\n\n    if (count > POINT_TO_PROCESS_LIMIT) {\n      return null;\n    }\n  }\n\n  pos = lineSize * (height - 1);\n  j0 = i * width1;\n  if (data[pos] !== 0) {\n    points[j0] = 8;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j0 + j] = data[pos] ? 4 : 8;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j0 + j] = 4;\n    ++count;\n  }\n  if (count > POINT_TO_PROCESS_LIMIT) {\n    return null;\n  }\n\n  // building outlines\n  const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);\n  const path = new Path2D();\n\n  for (i = 0; count && i <= height; i++) {\n    let p = i * width1;\n    const end = p + width;\n    while (p < end && !points[p]) {\n      p++;\n    }\n    if (p === end) {\n      continue;\n    }\n    path.moveTo(p % width1, i);\n\n    const p0 = p;\n    let type = points[p];\n    do {\n      const step = steps[type];\n      do {\n        p += step;\n      } while (!points[p]);\n\n      const pp = points[p];\n      if (pp !== 5 && pp !== 10) {\n        // set new direction\n        type = pp;\n        // delete mark\n        points[p] = 0;\n      } else {\n        // type is 5 or 10, ie, a crossing\n        // set new direction\n        type = pp & ((0x33 * type) >> 4);\n        // set new type for \"future hit\"\n        points[p] &= (type >> 2) | (type << 2);\n      }\n      path.lineTo(p % width1, (p / width1) | 0);\n\n      if (!points[p]) {\n        --count;\n      }\n    } while (p0 !== p);\n    --i;\n  }\n\n  // Immediately release the, potentially large, `Uint8Array`s after parsing.\n  data = null;\n  points = null;\n\n  const drawOutline = function (c) {\n    c.save();\n    // the path shall be painted in [0..1]x[0..1] space\n    c.scale(1 / width, -1 / height);\n    c.translate(0, -height);\n    c.fill(path);\n    c.beginPath();\n    c.restore();\n  };\n\n  return drawOutline;\n}\n\nclass CanvasExtraState {\n  constructor(width, height) {\n    // Are soft masks and alpha values shapes or opacities?\n    this.alphaIsShape = false;\n    this.fontSize = 0;\n    this.fontSizeScale = 1;\n    this.textMatrix = IDENTITY_MATRIX;\n    this.textMatrixScale = 1;\n    this.fontMatrix = FONT_IDENTITY_MATRIX;\n    this.leading = 0;\n    // Current point (in user coordinates)\n    this.x = 0;\n    this.y = 0;\n    // Start of text line (in text coordinates)\n    this.lineX = 0;\n    this.lineY = 0;\n    // Character and word spacing\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.textHScale = 1;\n    this.textRenderingMode = TextRenderingMode.FILL;\n    this.textRise = 0;\n    // Default fore and background colors\n    this.fillColor = \"#000000\";\n    this.strokeColor = \"#000000\";\n    this.patternFill = false;\n    this.patternStroke = false;\n    // Note: fill alpha applies to all non-stroking operations\n    this.fillAlpha = 1;\n    this.strokeAlpha = 1;\n    this.lineWidth = 1;\n    this.activeSMask = null;\n    this.transferMaps = \"none\";\n\n    this.startNewPathAndClipBox([0, 0, width, height]);\n  }\n\n  clone() {\n    const clone = Object.create(this);\n    clone.clipBox = this.clipBox.slice();\n    return clone;\n  }\n\n  setCurrentPoint(x, y) {\n    this.x = x;\n    this.y = y;\n  }\n\n  updatePathMinMax(transform, x, y) {\n    [x, y] = Util.applyTransform([x, y], transform);\n    this.minX = Math.min(this.minX, x);\n    this.minY = Math.min(this.minY, y);\n    this.maxX = Math.max(this.maxX, x);\n    this.maxY = Math.max(this.maxY, y);\n  }\n\n  updateRectMinMax(transform, rect) {\n    const p1 = Util.applyTransform(rect, transform);\n    const p2 = Util.applyTransform(rect.slice(2), transform);\n    const p3 = Util.applyTransform([rect[0], rect[3]], transform);\n    const p4 = Util.applyTransform([rect[2], rect[1]], transform);\n\n    this.minX = Math.min(this.minX, p1[0], p2[0], p3[0], p4[0]);\n    this.minY = Math.min(this.minY, p1[1], p2[1], p3[1], p4[1]);\n    this.maxX = Math.max(this.maxX, p1[0], p2[0], p3[0], p4[0]);\n    this.maxY = Math.max(this.maxY, p1[1], p2[1], p3[1], p4[1]);\n  }\n\n  updateScalingPathMinMax(transform, minMax) {\n    Util.scaleMinMax(transform, minMax);\n    this.minX = Math.min(this.minX, minMax[0]);\n    this.minY = Math.min(this.minY, minMax[1]);\n    this.maxX = Math.max(this.maxX, minMax[2]);\n    this.maxY = Math.max(this.maxY, minMax[3]);\n  }\n\n  updateCurvePathMinMax(transform, x0, y0, x1, y1, x2, y2, x3, y3, minMax) {\n    const box = Util.bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax);\n    if (minMax) {\n      return;\n    }\n    this.updateRectMinMax(transform, box);\n  }\n\n  getPathBoundingBox(pathType = PathType.FILL, transform = null) {\n    const box = [this.minX, this.minY, this.maxX, this.maxY];\n    if (pathType === PathType.STROKE) {\n      if (!transform) {\n        unreachable(\"Stroke bounding box must include transform.\");\n      }\n      // Stroked paths can be outside of the path bounding box by 1/2 the line\n      // width.\n      const scale = Util.singularValueDecompose2dScale(transform);\n      const xStrokePad = (scale[0] * this.lineWidth) / 2;\n      const yStrokePad = (scale[1] * this.lineWidth) / 2;\n      box[0] -= xStrokePad;\n      box[1] -= yStrokePad;\n      box[2] += xStrokePad;\n      box[3] += yStrokePad;\n    }\n    return box;\n  }\n\n  updateClipFromPath() {\n    const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox());\n    this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]);\n  }\n\n  isEmptyClip() {\n    return this.minX === Infinity;\n  }\n\n  startNewPathAndClipBox(box) {\n    this.clipBox = box;\n    this.minX = Infinity;\n    this.minY = Infinity;\n    this.maxX = 0;\n    this.maxY = 0;\n  }\n\n  getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) {\n    return Util.intersect(\n      this.clipBox,\n      this.getPathBoundingBox(pathType, transform)\n    );\n  }\n}\n\nfunction putBinaryImageData(ctx, imgData) {\n  if (imgData instanceof ImageData) {\n    ctx.putImageData(imgData, 0, 0);\n    return;\n  }\n\n  // Put the image data to the canvas in chunks, rather than putting the\n  // whole image at once.  This saves JS memory, because the ImageData object\n  // is smaller. It also possibly saves C++ memory within the implementation\n  // of putImageData(). (E.g. in Firefox we make two short-lived copies of\n  // the data passed to putImageData()). |n| shouldn't be too small, however,\n  // because too many putImageData() calls will slow things down.\n  //\n  // Note: as written, if the last chunk is partial, the putImageData() call\n  // will (conceptually) put pixels past the bounds of the canvas.  But\n  // that's ok; any such pixels are ignored.\n\n  const height = imgData.height,\n    width = imgData.width;\n  const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n  const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n  const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n  const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n  let srcPos = 0,\n    destPos;\n  const src = imgData.data;\n  const dest = chunkImgData.data;\n  let i, j, thisChunkHeight, elemsInThisChunk;\n\n  // There are multiple forms in which the pixel data can be passed, and\n  // imgData.kind tells us which one this is.\n  if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {\n    // Grayscale, 1 bit per pixel (i.e. black-and-white).\n    const srcLength = src.byteLength;\n    const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);\n    const dest32DataLength = dest32.length;\n    const fullSrcDiff = (width + 7) >> 3;\n    const white = 0xffffffff;\n    const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n\n    for (i = 0; i < totalChunks; i++) {\n      thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n      destPos = 0;\n      for (j = 0; j < thisChunkHeight; j++) {\n        const srcDiff = srcLength - srcPos;\n        let k = 0;\n        const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;\n        const kEndUnrolled = kEnd & ~7;\n        let mask = 0;\n        let srcByte = 0;\n        for (; k < kEndUnrolled; k += 8) {\n          srcByte = src[srcPos++];\n          dest32[destPos++] = srcByte & 128 ? white : black;\n          dest32[destPos++] = srcByte & 64 ? white : black;\n          dest32[destPos++] = srcByte & 32 ? white : black;\n          dest32[destPos++] = srcByte & 16 ? white : black;\n          dest32[destPos++] = srcByte & 8 ? white : black;\n          dest32[destPos++] = srcByte & 4 ? white : black;\n          dest32[destPos++] = srcByte & 2 ? white : black;\n          dest32[destPos++] = srcByte & 1 ? white : black;\n        }\n        for (; k < kEnd; k++) {\n          if (mask === 0) {\n            srcByte = src[srcPos++];\n            mask = 128;\n          }\n\n          dest32[destPos++] = srcByte & mask ? white : black;\n          mask >>= 1;\n        }\n      }\n      // We ran out of input. Make all remaining pixels transparent.\n      while (destPos < dest32DataLength) {\n        dest32[destPos++] = 0;\n      }\n\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  } else if (imgData.kind === ImageKind.RGBA_32BPP) {\n    // RGBA, 32-bits per pixel.\n    j = 0;\n    elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n    for (i = 0; i < fullChunks; i++) {\n      dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n      srcPos += elemsInThisChunk;\n\n      ctx.putImageData(chunkImgData, 0, j);\n      j += FULL_CHUNK_HEIGHT;\n    }\n    if (i < totalChunks) {\n      elemsInThisChunk = width * partialChunkHeight * 4;\n      dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n\n      ctx.putImageData(chunkImgData, 0, j);\n    }\n  } else if (imgData.kind === ImageKind.RGB_24BPP) {\n    // RGB, 24-bits per pixel.\n    thisChunkHeight = FULL_CHUNK_HEIGHT;\n    elemsInThisChunk = width * thisChunkHeight;\n    for (i = 0; i < totalChunks; i++) {\n      if (i >= fullChunks) {\n        thisChunkHeight = partialChunkHeight;\n        elemsInThisChunk = width * thisChunkHeight;\n      }\n\n      destPos = 0;\n      for (j = elemsInThisChunk; j--; ) {\n        dest[destPos++] = src[srcPos++];\n        dest[destPos++] = src[srcPos++];\n        dest[destPos++] = src[srcPos++];\n        dest[destPos++] = 255;\n      }\n\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  } else {\n    throw new Error(`bad image kind: ${imgData.kind}`);\n  }\n}\n\nfunction putBinaryImageMask(ctx, imgData) {\n  if (imgData.bitmap) {\n    // The bitmap has been created in the worker.\n    ctx.drawImage(imgData.bitmap, 0, 0);\n    return;\n  }\n\n  // Slow path: OffscreenCanvas isn't available in the worker.\n  const height = imgData.height,\n    width = imgData.width;\n  const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n  const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n  const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n  const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n  let srcPos = 0;\n  const src = imgData.data;\n  const dest = chunkImgData.data;\n\n  for (let i = 0; i < totalChunks; i++) {\n    const thisChunkHeight =\n      i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n\n    // Expand the mask so it can be used by the canvas.  Any required\n    // inversion has already been handled.\n\n    ({ srcPos } = convertBlackAndWhiteToRGBA({\n      src,\n      srcPos,\n      dest,\n      width,\n      height: thisChunkHeight,\n      nonBlackColor: 0,\n    }));\n\n    ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n  }\n}\n\nfunction copyCtxState(sourceCtx, destCtx) {\n  const properties = [\n    \"strokeStyle\",\n    \"fillStyle\",\n    \"fillRule\",\n    \"globalAlpha\",\n    \"lineWidth\",\n    \"lineCap\",\n    \"lineJoin\",\n    \"miterLimit\",\n    \"globalCompositeOperation\",\n    \"font\",\n    \"filter\",\n  ];\n  for (const property of properties) {\n    if (sourceCtx[property] !== undefined) {\n      destCtx[property] = sourceCtx[property];\n    }\n  }\n  if (sourceCtx.setLineDash !== undefined) {\n    destCtx.setLineDash(sourceCtx.getLineDash());\n    destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n  }\n}\n\nfunction resetCtxToDefault(ctx) {\n  ctx.strokeStyle = ctx.fillStyle = \"#000000\";\n  ctx.fillRule = \"nonzero\";\n  ctx.globalAlpha = 1;\n  ctx.lineWidth = 1;\n  ctx.lineCap = \"butt\";\n  ctx.lineJoin = \"miter\";\n  ctx.miterLimit = 10;\n  ctx.globalCompositeOperation = \"source-over\";\n  ctx.font = \"10px sans-serif\";\n  if (ctx.setLineDash !== undefined) {\n    ctx.setLineDash([]);\n    ctx.lineDashOffset = 0;\n  }\n  if (\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n    !isNodeJS\n  ) {\n    const { filter } = ctx;\n    if (filter !== \"none\" && filter !== \"\") {\n      ctx.filter = \"none\";\n    }\n  }\n}\n\nfunction getImageSmoothingEnabled(transform, interpolate) {\n  // In section 8.9.5.3 of the PDF spec, it's mentioned that the interpolate\n  // flag should be used when the image is upscaled.\n  // In Firefox, smoothing is always used when downscaling images (bug 1360415).\n\n  if (interpolate) {\n    return true;\n  }\n\n  const scale = Util.singularValueDecompose2dScale(transform);\n  // Round to a 32bit float so that `<=` check below will pass for numbers that\n  // are very close, but not exactly the same 64bit floats.\n  scale[0] = Math.fround(scale[0]);\n  scale[1] = Math.fround(scale[1]);\n  const actualScale = Math.fround(\n    (globalThis.devicePixelRatio || 1) * PixelsPerInch.PDF_TO_CSS_UNITS\n  );\n  return scale[0] <= actualScale && scale[1] <= actualScale;\n}\n\nconst LINE_CAP_STYLES = [\"butt\", \"round\", \"square\"];\nconst LINE_JOIN_STYLES = [\"miter\", \"round\", \"bevel\"];\nconst NORMAL_CLIP = {};\nconst EO_CLIP = {};\n\nclass CanvasGraphics {\n  constructor(\n    canvasCtx,\n    commonObjs,\n    objs,\n    canvasFactory,\n    filterFactory,\n    { optionalContentConfig, markedContentStack = null },\n    annotationCanvasMap,\n    pageColors\n  ) {\n    this.ctx = canvasCtx;\n    this.current = new CanvasExtraState(\n      this.ctx.canvas.width,\n      this.ctx.canvas.height\n    );\n    this.stateStack = [];\n    this.pendingClip = null;\n    this.pendingEOFill = false;\n    this.res = null;\n    this.xobjs = null;\n    this.commonObjs = commonObjs;\n    this.objs = objs;\n    this.canvasFactory = canvasFactory;\n    this.filterFactory = filterFactory;\n    this.groupStack = [];\n    this.processingType3 = null;\n    // Patterns are painted relative to the initial page/form transform, see\n    // PDF spec 8.7.2 NOTE 1.\n    this.baseTransform = null;\n    this.baseTransformStack = [];\n    this.groupLevel = 0;\n    this.smaskStack = [];\n    this.smaskCounter = 0;\n    this.tempSMask = null;\n    this.suspendedCtx = null;\n    this.contentVisible = true;\n    this.markedContentStack = markedContentStack || [];\n    this.optionalContentConfig = optionalContentConfig;\n    this.cachedCanvases = new CachedCanvases(this.canvasFactory);\n    this.cachedPatterns = new Map();\n    this.annotationCanvasMap = annotationCanvasMap;\n    this.viewportScale = 1;\n    this.outputScaleX = 1;\n    this.outputScaleY = 1;\n    this.pageColors = pageColors;\n\n    this._cachedScaleForStroking = [-1, 0];\n    this._cachedGetSinglePixelWidth = null;\n    this._cachedBitmapsMap = new Map();\n  }\n\n  getObject(data, fallback = null) {\n    if (typeof data === \"string\") {\n      return data.startsWith(\"g_\")\n        ? this.commonObjs.get(data)\n        : this.objs.get(data);\n    }\n    return fallback;\n  }\n\n  beginDrawing({\n    transform,\n    viewport,\n    transparency = false,\n    background = null,\n  }) {\n    // For pdfs that use blend modes we have to clear the canvas else certain\n    // blend modes can look wrong since we'd be blending with a white\n    // backdrop. The problem with a transparent backdrop though is we then\n    // don't get sub pixel anti aliasing on text, creating temporary\n    // transparent canvas when we have blend modes.\n    const width = this.ctx.canvas.width;\n    const height = this.ctx.canvas.height;\n\n    const savedFillStyle = this.ctx.fillStyle;\n    this.ctx.fillStyle = background || \"#ffffff\";\n    this.ctx.fillRect(0, 0, width, height);\n    this.ctx.fillStyle = savedFillStyle;\n\n    if (transparency) {\n      const transparentCanvas = this.cachedCanvases.getCanvas(\n        \"transparent\",\n        width,\n        height\n      );\n      this.compositeCtx = this.ctx;\n      this.transparentCanvas = transparentCanvas.canvas;\n      this.ctx = transparentCanvas.context;\n      this.ctx.save();\n      // The transform can be applied before rendering, transferring it to\n      // the new canvas.\n      this.ctx.transform(...getCurrentTransform(this.compositeCtx));\n    }\n\n    this.ctx.save();\n    resetCtxToDefault(this.ctx);\n    if (transform) {\n      this.ctx.transform(...transform);\n      this.outputScaleX = transform[0];\n      this.outputScaleY = transform[0];\n    }\n    this.ctx.transform(...viewport.transform);\n    this.viewportScale = viewport.scale;\n\n    this.baseTransform = getCurrentTransform(this.ctx);\n  }\n\n  executeOperatorList(\n    operatorList,\n    executionStartIdx,\n    continueCallback,\n    stepper\n  ) {\n    const argsArray = operatorList.argsArray;\n    const fnArray = operatorList.fnArray;\n    let i = executionStartIdx || 0;\n    const argsArrayLen = argsArray.length;\n\n    // Sometimes the OperatorList to execute is empty.\n    if (argsArrayLen === i) {\n      return i;\n    }\n\n    const chunkOperations =\n      argsArrayLen - i > EXECUTION_STEPS &&\n      typeof continueCallback === \"function\";\n    const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n    let steps = 0;\n\n    const commonObjs = this.commonObjs;\n    const objs = this.objs;\n    let fnId;\n\n    while (true) {\n      if (stepper !== undefined && i === stepper.nextBreakPoint) {\n        stepper.breakIt(i, continueCallback);\n        return i;\n      }\n\n      fnId = fnArray[i];\n\n      if (fnId !== OPS.dependency) {\n        // eslint-disable-next-line prefer-spread\n        this[fnId].apply(this, argsArray[i]);\n      } else {\n        for (const depObjId of argsArray[i]) {\n          const objsPool = depObjId.startsWith(\"g_\") ? commonObjs : objs;\n\n          // If the promise isn't resolved yet, add the continueCallback\n          // to the promise and bail out.\n          if (!objsPool.has(depObjId)) {\n            objsPool.get(depObjId, continueCallback);\n            return i;\n          }\n        }\n      }\n\n      i++;\n\n      // If the entire operatorList was executed, stop as were done.\n      if (i === argsArrayLen) {\n        return i;\n      }\n\n      // If the execution took longer then a certain amount of time and\n      // `continueCallback` is specified, interrupt the execution.\n      if (chunkOperations && ++steps > EXECUTION_STEPS) {\n        if (Date.now() > endTime) {\n          continueCallback();\n          return i;\n        }\n        steps = 0;\n      }\n\n      // If the operatorList isn't executed completely yet OR the execution\n      // time was short enough, do another execution round.\n    }\n  }\n\n  #restoreInitialState() {\n    // Finishing all opened operations such as SMask group painting.\n    while (this.stateStack.length || this.inSMaskMode) {\n      this.restore();\n    }\n\n    this.current.activeSMask = null;\n    this.ctx.restore();\n\n    if (this.transparentCanvas) {\n      this.ctx = this.compositeCtx;\n      this.ctx.save();\n      this.ctx.setTransform(1, 0, 0, 1, 0, 0); // Avoid apply transform twice\n      this.ctx.drawImage(this.transparentCanvas, 0, 0);\n      this.ctx.restore();\n      this.transparentCanvas = null;\n    }\n  }\n\n  endDrawing() {\n    this.#restoreInitialState();\n\n    this.cachedCanvases.clear();\n    this.cachedPatterns.clear();\n\n    for (const cache of this._cachedBitmapsMap.values()) {\n      for (const canvas of cache.values()) {\n        if (\n          typeof HTMLCanvasElement !== \"undefined\" &&\n          canvas instanceof HTMLCanvasElement\n        ) {\n          canvas.width = canvas.height = 0;\n        }\n      }\n      cache.clear();\n    }\n    this._cachedBitmapsMap.clear();\n    this.#drawFilter();\n  }\n\n  #drawFilter() {\n    if (this.pageColors) {\n      const hcmFilterId = this.filterFactory.addHCMFilter(\n        this.pageColors.foreground,\n        this.pageColors.background\n      );\n      if (hcmFilterId !== \"none\") {\n        const savedFilter = this.ctx.filter;\n        this.ctx.filter = hcmFilterId;\n        this.ctx.drawImage(this.ctx.canvas, 0, 0);\n        this.ctx.filter = savedFilter;\n      }\n    }\n  }\n\n  _scaleImage(img, inverseTransform) {\n    // Vertical or horizontal scaling shall not be more than 2 to not lose the\n    // pixels during drawImage operation, painting on the temporary canvas(es)\n    // that are twice smaller in size.\n\n    // displayWidth and displayHeight are used for VideoFrame.\n    const width = img.width ?? img.displayWidth;\n    const height = img.height ?? img.displayHeight;\n    let widthScale = Math.max(\n      Math.hypot(inverseTransform[0], inverseTransform[1]),\n      1\n    );\n    let heightScale = Math.max(\n      Math.hypot(inverseTransform[2], inverseTransform[3]),\n      1\n    );\n\n    let paintWidth = width,\n      paintHeight = height;\n    let tmpCanvasId = \"prescale1\";\n    let tmpCanvas, tmpCtx;\n    while (\n      (widthScale > 2 && paintWidth > 1) ||\n      (heightScale > 2 && paintHeight > 1)\n    ) {\n      let newWidth = paintWidth,\n        newHeight = paintHeight;\n      if (widthScale > 2 && paintWidth > 1) {\n        // See bug 1820511 (Windows specific bug).\n        // TODO: once the above bug is fixed we could revert to:\n        // newWidth = Math.ceil(paintWidth / 2);\n        newWidth =\n          paintWidth >= 16384\n            ? Math.floor(paintWidth / 2) - 1 || 1\n            : Math.ceil(paintWidth / 2);\n        widthScale /= paintWidth / newWidth;\n      }\n      if (heightScale > 2 && paintHeight > 1) {\n        // TODO: see the comment above.\n        newHeight =\n          paintHeight >= 16384\n            ? Math.floor(paintHeight / 2) - 1 || 1\n            : Math.ceil(paintHeight) / 2;\n        heightScale /= paintHeight / newHeight;\n      }\n      tmpCanvas = this.cachedCanvases.getCanvas(\n        tmpCanvasId,\n        newWidth,\n        newHeight\n      );\n      tmpCtx = tmpCanvas.context;\n      tmpCtx.clearRect(0, 0, newWidth, newHeight);\n      tmpCtx.drawImage(\n        img,\n        0,\n        0,\n        paintWidth,\n        paintHeight,\n        0,\n        0,\n        newWidth,\n        newHeight\n      );\n      img = tmpCanvas.canvas;\n      paintWidth = newWidth;\n      paintHeight = newHeight;\n      tmpCanvasId = tmpCanvasId === \"prescale1\" ? \"prescale2\" : \"prescale1\";\n    }\n    return {\n      img,\n      paintWidth,\n      paintHeight,\n    };\n  }\n\n  _createMaskCanvas(img) {\n    const ctx = this.ctx;\n    const { width, height } = img;\n    const fillColor = this.current.fillColor;\n    const isPatternFill = this.current.patternFill;\n    const currentTransform = getCurrentTransform(ctx);\n\n    let cache, cacheKey, scaled, maskCanvas;\n    if ((img.bitmap || img.data) && img.count > 1) {\n      const mainKey = img.bitmap || img.data.buffer;\n      // We're reusing the same image several times, so we can cache it.\n      // In case we've a pattern fill we just keep the scaled version of\n      // the image.\n      // Only the scaling part matters, the translation part is just used\n      // to compute offsets (but not when filling patterns see #15573).\n      // TODO: handle the case of a pattern fill if it's possible.\n      cacheKey = JSON.stringify(\n        isPatternFill\n          ? currentTransform\n          : [currentTransform.slice(0, 4), fillColor]\n      );\n\n      cache = this._cachedBitmapsMap.get(mainKey);\n      if (!cache) {\n        cache = new Map();\n        this._cachedBitmapsMap.set(mainKey, cache);\n      }\n      const cachedImage = cache.get(cacheKey);\n      if (cachedImage && !isPatternFill) {\n        const offsetX = Math.round(\n          Math.min(currentTransform[0], currentTransform[2]) +\n            currentTransform[4]\n        );\n        const offsetY = Math.round(\n          Math.min(currentTransform[1], currentTransform[3]) +\n            currentTransform[5]\n        );\n        return {\n          canvas: cachedImage,\n          offsetX,\n          offsetY,\n        };\n      }\n      scaled = cachedImage;\n    }\n\n    if (!scaled) {\n      maskCanvas = this.cachedCanvases.getCanvas(\"maskCanvas\", width, height);\n      putBinaryImageMask(maskCanvas.context, img);\n    }\n\n    // Create the mask canvas at the size it will be drawn at and also set\n    // its transform to match the current transform so if there are any\n    // patterns applied they will be applied relative to the correct\n    // transform.\n\n    let maskToCanvas = Util.transform(currentTransform, [\n      1 / width,\n      0,\n      0,\n      -1 / height,\n      0,\n      0,\n    ]);\n    maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]);\n    const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox(\n      [0, 0, width, height],\n      maskToCanvas\n    );\n    const drawnWidth = Math.round(maxX - minX) || 1;\n    const drawnHeight = Math.round(maxY - minY) || 1;\n    const fillCanvas = this.cachedCanvases.getCanvas(\n      \"fillCanvas\",\n      drawnWidth,\n      drawnHeight\n    );\n    const fillCtx = fillCanvas.context;\n\n    // The offset will be the top-left cordinate mask.\n    // If objToCanvas is [a,b,c,d,e,f] then:\n    //   - offsetX = min(a, c) + e\n    //   - offsetY = min(b, d) + f\n    const offsetX = minX;\n    const offsetY = minY;\n    fillCtx.translate(-offsetX, -offsetY);\n    fillCtx.transform(...maskToCanvas);\n\n    if (!scaled) {\n      // Pre-scale if needed to improve image smoothing.\n      scaled = this._scaleImage(\n        maskCanvas.canvas,\n        getCurrentTransformInverse(fillCtx)\n      );\n      scaled = scaled.img;\n      if (cache && isPatternFill) {\n        cache.set(cacheKey, scaled);\n      }\n    }\n\n    fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(\n      getCurrentTransform(fillCtx),\n      img.interpolate\n    );\n\n    drawImageAtIntegerCoords(\n      fillCtx,\n      scaled,\n      0,\n      0,\n      scaled.width,\n      scaled.height,\n      0,\n      0,\n      width,\n      height\n    );\n    fillCtx.globalCompositeOperation = \"source-in\";\n\n    const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [\n      1,\n      0,\n      0,\n      1,\n      -offsetX,\n      -offsetY,\n    ]);\n    fillCtx.fillStyle = isPatternFill\n      ? fillColor.getPattern(ctx, this, inverse, PathType.FILL)\n      : fillColor;\n\n    fillCtx.fillRect(0, 0, width, height);\n\n    if (cache && !isPatternFill) {\n      // The fill canvas is put in the cache associated to the mask image\n      // so we must remove from the cached canvas: it mustn't be used again.\n      this.cachedCanvases.delete(\"fillCanvas\");\n      cache.set(cacheKey, fillCanvas.canvas);\n    }\n\n    // Round the offsets to avoid drawing fractional pixels.\n    return {\n      canvas: fillCanvas.canvas,\n      offsetX: Math.round(offsetX),\n      offsetY: Math.round(offsetY),\n    };\n  }\n\n  // Graphics state\n  setLineWidth(width) {\n    if (width !== this.current.lineWidth) {\n      this._cachedScaleForStroking[0] = -1;\n    }\n    this.current.lineWidth = width;\n    this.ctx.lineWidth = width;\n  }\n\n  setLineCap(style) {\n    this.ctx.lineCap = LINE_CAP_STYLES[style];\n  }\n\n  setLineJoin(style) {\n    this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n  }\n\n  setMiterLimit(limit) {\n    this.ctx.miterLimit = limit;\n  }\n\n  setDash(dashArray, dashPhase) {\n    const ctx = this.ctx;\n    if (ctx.setLineDash !== undefined) {\n      ctx.setLineDash(dashArray);\n      ctx.lineDashOffset = dashPhase;\n    }\n  }\n\n  setRenderingIntent(intent) {\n    // This operation is ignored since we haven't found a use case for it yet.\n  }\n\n  setFlatness(flatness) {\n    // This operation is ignored since we haven't found a use case for it yet.\n  }\n\n  setGState(states) {\n    for (const [key, value] of states) {\n      switch (key) {\n        case \"LW\":\n          this.setLineWidth(value);\n          break;\n        case \"LC\":\n          this.setLineCap(value);\n          break;\n        case \"LJ\":\n          this.setLineJoin(value);\n          break;\n        case \"ML\":\n          this.setMiterLimit(value);\n          break;\n        case \"D\":\n          this.setDash(value[0], value[1]);\n          break;\n        case \"RI\":\n          this.setRenderingIntent(value);\n          break;\n        case \"FL\":\n          this.setFlatness(value);\n          break;\n        case \"Font\":\n          this.setFont(value[0], value[1]);\n          break;\n        case \"CA\":\n          this.current.strokeAlpha = value;\n          break;\n        case \"ca\":\n          this.current.fillAlpha = value;\n          this.ctx.globalAlpha = value;\n          break;\n        case \"BM\":\n          this.ctx.globalCompositeOperation = value;\n          break;\n        case \"SMask\":\n          this.current.activeSMask = value ? this.tempSMask : null;\n          this.tempSMask = null;\n          this.checkSMaskState();\n          break;\n        case \"TR\":\n          this.ctx.filter = this.current.transferMaps =\n            this.filterFactory.addFilter(value);\n          break;\n      }\n    }\n  }\n\n  get inSMaskMode() {\n    return !!this.suspendedCtx;\n  }\n\n  checkSMaskState() {\n    const inSMaskMode = this.inSMaskMode;\n    if (this.current.activeSMask && !inSMaskMode) {\n      this.beginSMaskMode();\n    } else if (!this.current.activeSMask && inSMaskMode) {\n      this.endSMaskMode();\n    }\n    // Else, the state is okay and nothing needs to be done.\n  }\n\n  /**\n   * Soft mask mode takes the current main drawing canvas and replaces it with\n   * a temporary canvas. Any drawing operations that happen on the temporary\n   * canvas need to be composed with the main canvas that was suspended (see\n   * `compose()`). The temporary canvas also duplicates many of its operations\n   * on the suspended canvas to keep them in sync, so that when the soft mask\n   * mode ends any clipping paths or transformations will still be active and in\n   * the right order on the canvas' graphics state stack.\n   */\n  beginSMaskMode() {\n    if (this.inSMaskMode) {\n      throw new Error(\"beginSMaskMode called while already in smask mode\");\n    }\n    const drawnWidth = this.ctx.canvas.width;\n    const drawnHeight = this.ctx.canvas.height;\n    const cacheId = \"smaskGroupAt\" + this.groupLevel;\n    const scratchCanvas = this.cachedCanvases.getCanvas(\n      cacheId,\n      drawnWidth,\n      drawnHeight\n    );\n    this.suspendedCtx = this.ctx;\n    this.ctx = scratchCanvas.context;\n    const ctx = this.ctx;\n    ctx.setTransform(...getCurrentTransform(this.suspendedCtx));\n    copyCtxState(this.suspendedCtx, ctx);\n    mirrorContextOperations(ctx, this.suspendedCtx);\n\n    this.setGState([\n      [\"BM\", \"source-over\"],\n      [\"ca\", 1],\n      [\"CA\", 1],\n    ]);\n  }\n\n  endSMaskMode() {\n    if (!this.inSMaskMode) {\n      throw new Error(\"endSMaskMode called while not in smask mode\");\n    }\n    // The soft mask is done, now restore the suspended canvas as the main\n    // drawing canvas.\n    this.ctx._removeMirroring();\n    copyCtxState(this.ctx, this.suspendedCtx);\n    this.ctx = this.suspendedCtx;\n\n    this.suspendedCtx = null;\n  }\n\n  compose(dirtyBox) {\n    if (!this.current.activeSMask) {\n      return;\n    }\n\n    if (!dirtyBox) {\n      dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];\n    } else {\n      dirtyBox[0] = Math.floor(dirtyBox[0]);\n      dirtyBox[1] = Math.floor(dirtyBox[1]);\n      dirtyBox[2] = Math.ceil(dirtyBox[2]);\n      dirtyBox[3] = Math.ceil(dirtyBox[3]);\n    }\n    const smask = this.current.activeSMask;\n    const suspendedCtx = this.suspendedCtx;\n\n    this.composeSMask(suspendedCtx, smask, this.ctx, dirtyBox);\n    // Whatever was drawn has been moved to the suspended canvas, now clear it\n    // out of the current canvas.\n    this.ctx.save();\n    this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n    this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n    this.ctx.restore();\n  }\n\n  composeSMask(ctx, smask, layerCtx, layerBox) {\n    const layerOffsetX = layerBox[0];\n    const layerOffsetY = layerBox[1];\n    const layerWidth = layerBox[2] - layerOffsetX;\n    const layerHeight = layerBox[3] - layerOffsetY;\n    if (layerWidth === 0 || layerHeight === 0) {\n      return;\n    }\n    this.genericComposeSMask(\n      smask.context,\n      layerCtx,\n      layerWidth,\n      layerHeight,\n      smask.subtype,\n      smask.backdrop,\n      smask.transferMap,\n      layerOffsetX,\n      layerOffsetY,\n      smask.offsetX,\n      smask.offsetY\n    );\n    ctx.save();\n    ctx.globalAlpha = 1;\n    ctx.globalCompositeOperation = \"source-over\";\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    ctx.drawImage(layerCtx.canvas, 0, 0);\n    ctx.restore();\n  }\n\n  genericComposeSMask(\n    maskCtx,\n    layerCtx,\n    width,\n    height,\n    subtype,\n    backdrop,\n    transferMap,\n    layerOffsetX,\n    layerOffsetY,\n    maskOffsetX,\n    maskOffsetY\n  ) {\n    let maskCanvas = maskCtx.canvas;\n    let maskX = layerOffsetX - maskOffsetX;\n    let maskY = layerOffsetY - maskOffsetY;\n\n    if (backdrop) {\n      const backdropRGB = Util.makeHexColor(...backdrop);\n      if (\n        maskX < 0 ||\n        maskY < 0 ||\n        maskX + width > maskCanvas.width ||\n        maskY + height > maskCanvas.height\n      ) {\n        const canvas = this.cachedCanvases.getCanvas(\n          \"maskExtension\",\n          width,\n          height\n        );\n        const ctx = canvas.context;\n        ctx.drawImage(maskCanvas, -maskX, -maskY);\n        ctx.globalCompositeOperation = \"destination-atop\";\n        ctx.fillStyle = backdropRGB;\n        ctx.fillRect(0, 0, width, height);\n        ctx.globalCompositeOperation = \"source-over\";\n\n        maskCanvas = canvas.canvas;\n        maskX = maskY = 0;\n      } else {\n        maskCtx.save();\n        maskCtx.globalAlpha = 1;\n        maskCtx.setTransform(1, 0, 0, 1, 0, 0);\n        const clip = new Path2D();\n        clip.rect(maskX, maskY, width, height);\n        maskCtx.clip(clip);\n        maskCtx.globalCompositeOperation = \"destination-atop\";\n        maskCtx.fillStyle = backdropRGB;\n        maskCtx.fillRect(maskX, maskY, width, height);\n        maskCtx.restore();\n      }\n    }\n\n    layerCtx.save();\n    layerCtx.globalAlpha = 1;\n    layerCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n    if (subtype === \"Alpha\" && transferMap) {\n      layerCtx.filter = this.filterFactory.addAlphaFilter(transferMap);\n    } else if (subtype === \"Luminosity\") {\n      layerCtx.filter = this.filterFactory.addLuminosityFilter(transferMap);\n    }\n\n    const clip = new Path2D();\n    clip.rect(layerOffsetX, layerOffsetY, width, height);\n    layerCtx.clip(clip);\n    layerCtx.globalCompositeOperation = \"destination-in\";\n    layerCtx.drawImage(\n      maskCanvas,\n      maskX,\n      maskY,\n      width,\n      height,\n      layerOffsetX,\n      layerOffsetY,\n      width,\n      height\n    );\n    layerCtx.restore();\n  }\n\n  save() {\n    if (this.inSMaskMode) {\n      // SMask mode may be turned on/off causing us to lose graphics state.\n      // Copy the temporary canvas state to the main(suspended) canvas to keep\n      // it in sync.\n      copyCtxState(this.ctx, this.suspendedCtx);\n      // Don't bother calling save on the temporary canvas since state is not\n      // saved there.\n      this.suspendedCtx.save();\n    } else {\n      this.ctx.save();\n    }\n    const old = this.current;\n    this.stateStack.push(old);\n    this.current = old.clone();\n  }\n\n  restore() {\n    if (this.stateStack.length === 0 && this.inSMaskMode) {\n      this.endSMaskMode();\n    }\n    if (this.stateStack.length !== 0) {\n      this.current = this.stateStack.pop();\n      if (this.inSMaskMode) {\n        // Graphics state is stored on the main(suspended) canvas. Restore its\n        // state then copy it over to the temporary canvas.\n        this.suspendedCtx.restore();\n        copyCtxState(this.suspendedCtx, this.ctx);\n      } else {\n        this.ctx.restore();\n      }\n      this.checkSMaskState();\n\n      // Ensure that the clipping path is reset (fixes issue6413.pdf).\n      this.pendingClip = null;\n\n      this._cachedScaleForStroking[0] = -1;\n      this._cachedGetSinglePixelWidth = null;\n    }\n  }\n\n  transform(a, b, c, d, e, f) {\n    this.ctx.transform(a, b, c, d, e, f);\n\n    this._cachedScaleForStroking[0] = -1;\n    this._cachedGetSinglePixelWidth = null;\n  }\n\n  // Path\n  constructPath(ops, args, minMax) {\n    const ctx = this.ctx;\n    const current = this.current;\n    let x = current.x,\n      y = current.y;\n    let startX, startY;\n    const currentTransform = getCurrentTransform(ctx);\n\n    // Most of the time the current transform is a scaling matrix\n    // so we don't need to transform points before computing min/max:\n    // we can compute min/max first and then smartly \"apply\" the\n    // transform (see Util.scaleMinMax).\n    // For rectangle, moveTo and lineTo, min/max are computed in the\n    // worker (see evaluator.js).\n    const isScalingMatrix =\n      (currentTransform[0] === 0 && currentTransform[3] === 0) ||\n      (currentTransform[1] === 0 && currentTransform[2] === 0);\n    const minMaxForBezier = isScalingMatrix ? minMax.slice(0) : null;\n\n    for (let i = 0, j = 0, ii = ops.length; i < ii; i++) {\n      switch (ops[i] | 0) {\n        case OPS.rectangle:\n          x = args[j++];\n          y = args[j++];\n          const width = args[j++];\n          const height = args[j++];\n\n          const xw = x + width;\n          const yh = y + height;\n          ctx.moveTo(x, y);\n          if (width === 0 || height === 0) {\n            ctx.lineTo(xw, yh);\n          } else {\n            ctx.lineTo(xw, y);\n            ctx.lineTo(xw, yh);\n            ctx.lineTo(x, yh);\n          }\n          if (!isScalingMatrix) {\n            current.updateRectMinMax(currentTransform, [x, y, xw, yh]);\n          }\n          ctx.closePath();\n          break;\n        case OPS.moveTo:\n          x = args[j++];\n          y = args[j++];\n          ctx.moveTo(x, y);\n          if (!isScalingMatrix) {\n            current.updatePathMinMax(currentTransform, x, y);\n          }\n          break;\n        case OPS.lineTo:\n          x = args[j++];\n          y = args[j++];\n          ctx.lineTo(x, y);\n          if (!isScalingMatrix) {\n            current.updatePathMinMax(currentTransform, x, y);\n          }\n          break;\n        case OPS.curveTo:\n          startX = x;\n          startY = y;\n          x = args[j + 4];\n          y = args[j + 5];\n          ctx.bezierCurveTo(\n            args[j],\n            args[j + 1],\n            args[j + 2],\n            args[j + 3],\n            x,\n            y\n          );\n          current.updateCurvePathMinMax(\n            currentTransform,\n            startX,\n            startY,\n            args[j],\n            args[j + 1],\n            args[j + 2],\n            args[j + 3],\n            x,\n            y,\n            minMaxForBezier\n          );\n          j += 6;\n          break;\n        case OPS.curveTo2:\n          startX = x;\n          startY = y;\n          ctx.bezierCurveTo(\n            x,\n            y,\n            args[j],\n            args[j + 1],\n            args[j + 2],\n            args[j + 3]\n          );\n          current.updateCurvePathMinMax(\n            currentTransform,\n            startX,\n            startY,\n            x,\n            y,\n            args[j],\n            args[j + 1],\n            args[j + 2],\n            args[j + 3],\n            minMaxForBezier\n          );\n          x = args[j + 2];\n          y = args[j + 3];\n          j += 4;\n          break;\n        case OPS.curveTo3:\n          startX = x;\n          startY = y;\n          x = args[j + 2];\n          y = args[j + 3];\n          ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);\n          current.updateCurvePathMinMax(\n            currentTransform,\n            startX,\n            startY,\n            args[j],\n            args[j + 1],\n            x,\n            y,\n            x,\n            y,\n            minMaxForBezier\n          );\n          j += 4;\n          break;\n        case OPS.closePath:\n          ctx.closePath();\n          break;\n      }\n    }\n\n    if (isScalingMatrix) {\n      current.updateScalingPathMinMax(currentTransform, minMaxForBezier);\n    }\n\n    current.setCurrentPoint(x, y);\n  }\n\n  closePath() {\n    this.ctx.closePath();\n  }\n\n  stroke(consumePath = true) {\n    const ctx = this.ctx;\n    const strokeColor = this.current.strokeColor;\n    // For stroke we want to temporarily change the global alpha to the\n    // stroking alpha.\n    ctx.globalAlpha = this.current.strokeAlpha;\n    if (this.contentVisible) {\n      if (typeof strokeColor === \"object\" && strokeColor?.getPattern) {\n        ctx.save();\n        ctx.strokeStyle = strokeColor.getPattern(\n          ctx,\n          this,\n          getCurrentTransformInverse(ctx),\n          PathType.STROKE\n        );\n        this.rescaleAndStroke(/* saveRestore */ false);\n        ctx.restore();\n      } else {\n        this.rescaleAndStroke(/* saveRestore */ true);\n      }\n    }\n    if (consumePath) {\n      this.consumePath(this.current.getClippedPathBoundingBox());\n    }\n    // Restore the global alpha to the fill alpha\n    ctx.globalAlpha = this.current.fillAlpha;\n  }\n\n  closeStroke() {\n    this.closePath();\n    this.stroke();\n  }\n\n  fill(consumePath = true) {\n    const ctx = this.ctx;\n    const fillColor = this.current.fillColor;\n    const isPatternFill = this.current.patternFill;\n    let needRestore = false;\n\n    if (isPatternFill) {\n      ctx.save();\n      ctx.fillStyle = fillColor.getPattern(\n        ctx,\n        this,\n        getCurrentTransformInverse(ctx),\n        PathType.FILL\n      );\n      needRestore = true;\n    }\n\n    const intersect = this.current.getClippedPathBoundingBox();\n    if (this.contentVisible && intersect !== null) {\n      if (this.pendingEOFill) {\n        ctx.fill(\"evenodd\");\n        this.pendingEOFill = false;\n      } else {\n        ctx.fill();\n      }\n    }\n\n    if (needRestore) {\n      ctx.restore();\n    }\n    if (consumePath) {\n      this.consumePath(intersect);\n    }\n  }\n\n  eoFill() {\n    this.pendingEOFill = true;\n    this.fill();\n  }\n\n  fillStroke() {\n    this.fill(false);\n    this.stroke(false);\n\n    this.consumePath();\n  }\n\n  eoFillStroke() {\n    this.pendingEOFill = true;\n    this.fillStroke();\n  }\n\n  closeFillStroke() {\n    this.closePath();\n    this.fillStroke();\n  }\n\n  closeEOFillStroke() {\n    this.pendingEOFill = true;\n    this.closePath();\n    this.fillStroke();\n  }\n\n  endPath() {\n    this.consumePath();\n  }\n\n  // Clipping\n  clip() {\n    this.pendingClip = NORMAL_CLIP;\n  }\n\n  eoClip() {\n    this.pendingClip = EO_CLIP;\n  }\n\n  // Text\n  beginText() {\n    this.current.textMatrix = IDENTITY_MATRIX;\n    this.current.textMatrixScale = 1;\n    this.current.x = this.current.lineX = 0;\n    this.current.y = this.current.lineY = 0;\n  }\n\n  endText() {\n    const paths = this.pendingTextPaths;\n    const ctx = this.ctx;\n    if (paths === undefined) {\n      ctx.beginPath();\n      return;\n    }\n\n    const newPath = new Path2D();\n    const invTransf = ctx.getTransform().invertSelf();\n    for (const { transform, x, y, fontSize, path } of paths) {\n      newPath.addPath(\n        path,\n        new DOMMatrix(transform)\n          .preMultiplySelf(invTransf)\n          .translate(x, y)\n          .scale(fontSize, -fontSize)\n      );\n    }\n\n    ctx.clip(newPath);\n    ctx.beginPath();\n    delete this.pendingTextPaths;\n  }\n\n  setCharSpacing(spacing) {\n    this.current.charSpacing = spacing;\n  }\n\n  setWordSpacing(spacing) {\n    this.current.wordSpacing = spacing;\n  }\n\n  setHScale(scale) {\n    this.current.textHScale = scale / 100;\n  }\n\n  setLeading(leading) {\n    this.current.leading = -leading;\n  }\n\n  setFont(fontRefName, size) {\n    const fontObj = this.commonObjs.get(fontRefName);\n    const current = this.current;\n\n    if (!fontObj) {\n      throw new Error(`Can't find font for ${fontRefName}`);\n    }\n    current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX;\n\n    // A valid matrix needs all main diagonal elements to be non-zero\n    // This also ensures we bypass FF bugzilla bug #719844.\n    if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {\n      warn(\"Invalid font matrix for font \" + fontRefName);\n    }\n\n    // The spec for Tf (setFont) says that 'size' specifies the font 'scale',\n    // and in some docs this can be negative (inverted x-y axes).\n    if (size < 0) {\n      size = -size;\n      current.fontDirection = -1;\n    } else {\n      current.fontDirection = 1;\n    }\n\n    this.current.font = fontObj;\n    this.current.fontSize = size;\n\n    if (fontObj.isType3Font) {\n      return; // we don't need ctx.font for Type3 fonts\n    }\n\n    const name = fontObj.loadedName || \"sans-serif\";\n    const typeface =\n      fontObj.systemFontInfo?.css || `\"${name}\", ${fontObj.fallbackName}`;\n\n    let bold = \"normal\";\n    if (fontObj.black) {\n      bold = \"900\";\n    } else if (fontObj.bold) {\n      bold = \"bold\";\n    }\n    const italic = fontObj.italic ? \"italic\" : \"normal\";\n\n    // Some font backends cannot handle fonts below certain size.\n    // Keeping the font at minimal size and using the fontSizeScale to change\n    // the current transformation matrix before the fillText/strokeText.\n    // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227\n    let browserFontSize = size;\n    if (size < MIN_FONT_SIZE) {\n      browserFontSize = MIN_FONT_SIZE;\n    } else if (size > MAX_FONT_SIZE) {\n      browserFontSize = MAX_FONT_SIZE;\n    }\n    this.current.fontSizeScale = size / browserFontSize;\n\n    this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;\n  }\n\n  setTextRenderingMode(mode) {\n    this.current.textRenderingMode = mode;\n  }\n\n  setTextRise(rise) {\n    this.current.textRise = rise;\n  }\n\n  moveText(x, y) {\n    this.current.x = this.current.lineX += x;\n    this.current.y = this.current.lineY += y;\n  }\n\n  setLeadingMoveText(x, y) {\n    this.setLeading(-y);\n    this.moveText(x, y);\n  }\n\n  setTextMatrix(a, b, c, d, e, f) {\n    this.current.textMatrix = [a, b, c, d, e, f];\n    this.current.textMatrixScale = Math.hypot(a, b);\n\n    this.current.x = this.current.lineX = 0;\n    this.current.y = this.current.lineY = 0;\n  }\n\n  nextLine() {\n    this.moveText(0, this.current.leading);\n  }\n\n  #getScaledPath(path, currentTransform, transform) {\n    const newPath = new Path2D();\n    newPath.addPath(\n      path,\n      new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform)\n    );\n    return newPath;\n  }\n\n  paintChar(character, x, y, patternFillTransform, patternStrokeTransform) {\n    const ctx = this.ctx;\n    const current = this.current;\n    const font = current.font;\n    const textRenderingMode = current.textRenderingMode;\n    const fontSize = current.fontSize / current.fontSizeScale;\n    const fillStrokeMode =\n      textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n    const isAddToPathSet = !!(\n      textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG\n    );\n    const patternFill = current.patternFill && !font.missingFile;\n    const patternStroke = current.patternStroke && !font.missingFile;\n\n    let path;\n    if (\n      font.disableFontFace ||\n      isAddToPathSet ||\n      patternFill ||\n      patternStroke\n    ) {\n      path = font.getPathGenerator(this.commonObjs, character);\n    }\n\n    if (font.disableFontFace || patternFill || patternStroke) {\n      ctx.save();\n      ctx.translate(x, y);\n      ctx.scale(fontSize, -fontSize);\n      if (\n        fillStrokeMode === TextRenderingMode.FILL ||\n        fillStrokeMode === TextRenderingMode.FILL_STROKE\n      ) {\n        if (patternFillTransform) {\n          const currentTransform = ctx.getTransform();\n          ctx.setTransform(...patternFillTransform);\n          ctx.fill(\n            this.#getScaledPath(path, currentTransform, patternFillTransform)\n          );\n        } else {\n          ctx.fill(path);\n        }\n      }\n      if (\n        fillStrokeMode === TextRenderingMode.STROKE ||\n        fillStrokeMode === TextRenderingMode.FILL_STROKE\n      ) {\n        if (patternStrokeTransform) {\n          const currentTransform = ctx.getTransform();\n          ctx.setTransform(...patternStrokeTransform);\n          ctx.stroke(\n            this.#getScaledPath(path, currentTransform, patternStrokeTransform)\n          );\n        } else {\n          ctx.lineWidth /= fontSize;\n          ctx.stroke(path);\n        }\n      }\n      ctx.restore();\n    } else {\n      if (\n        fillStrokeMode === TextRenderingMode.FILL ||\n        fillStrokeMode === TextRenderingMode.FILL_STROKE\n      ) {\n        ctx.fillText(character, x, y);\n      }\n      if (\n        fillStrokeMode === TextRenderingMode.STROKE ||\n        fillStrokeMode === TextRenderingMode.FILL_STROKE\n      ) {\n        ctx.strokeText(character, x, y);\n      }\n    }\n\n    if (isAddToPathSet) {\n      const paths = (this.pendingTextPaths ||= []);\n      paths.push({\n        transform: getCurrentTransform(ctx),\n        x,\n        y,\n        fontSize,\n        path,\n      });\n    }\n  }\n\n  get isFontSubpixelAAEnabled() {\n    // Checks if anti-aliasing is enabled when scaled text is painted.\n    // On Windows GDI scaled fonts looks bad.\n    const { context: ctx } = this.cachedCanvases.getCanvas(\n      \"isFontSubpixelAAEnabled\",\n      10,\n      10\n    );\n    ctx.scale(1.5, 1);\n    ctx.fillText(\"I\", 0, 10);\n    const data = ctx.getImageData(0, 0, 10, 10).data;\n    let enabled = false;\n    for (let i = 3; i < data.length; i += 4) {\n      if (data[i] > 0 && data[i] < 255) {\n        enabled = true;\n        break;\n      }\n    }\n    return shadow(this, \"isFontSubpixelAAEnabled\", enabled);\n  }\n\n  showText(glyphs) {\n    const current = this.current;\n    const font = current.font;\n    if (font.isType3Font) {\n      return this.showType3Text(glyphs);\n    }\n\n    const fontSize = current.fontSize;\n    if (fontSize === 0) {\n      return undefined;\n    }\n\n    const ctx = this.ctx;\n    const fontSizeScale = current.fontSizeScale;\n    const charSpacing = current.charSpacing;\n    const wordSpacing = current.wordSpacing;\n    const fontDirection = current.fontDirection;\n    const textHScale = current.textHScale * fontDirection;\n    const glyphsLength = glyphs.length;\n    const vertical = font.vertical;\n    const spacingDir = vertical ? 1 : -1;\n    const defaultVMetrics = font.defaultVMetrics;\n    const widthAdvanceScale = fontSize * current.fontMatrix[0];\n\n    const simpleFillText =\n      current.textRenderingMode === TextRenderingMode.FILL &&\n      !font.disableFontFace &&\n      !current.patternFill;\n\n    ctx.save();\n    ctx.transform(...current.textMatrix);\n    ctx.translate(current.x, current.y + current.textRise);\n\n    if (fontDirection > 0) {\n      ctx.scale(textHScale, -1);\n    } else {\n      ctx.scale(textHScale, 1);\n    }\n\n    let patternFillTransform, patternStrokeTransform;\n    if (current.patternFill) {\n      ctx.save();\n      const pattern = current.fillColor.getPattern(\n        ctx,\n        this,\n        getCurrentTransformInverse(ctx),\n        PathType.FILL\n      );\n      patternFillTransform = getCurrentTransform(ctx);\n      ctx.restore();\n      ctx.fillStyle = pattern;\n    }\n\n    if (current.patternStroke) {\n      ctx.save();\n      const pattern = current.strokeColor.getPattern(\n        ctx,\n        this,\n        getCurrentTransformInverse(ctx),\n        PathType.STROKE\n      );\n      patternStrokeTransform = getCurrentTransform(ctx);\n      ctx.restore();\n      ctx.strokeStyle = pattern;\n    }\n\n    let lineWidth = current.lineWidth;\n    const scale = current.textMatrixScale;\n    if (scale === 0 || lineWidth === 0) {\n      const fillStrokeMode =\n        current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n      if (\n        fillStrokeMode === TextRenderingMode.STROKE ||\n        fillStrokeMode === TextRenderingMode.FILL_STROKE\n      ) {\n        lineWidth = this.getSinglePixelWidth();\n      }\n    } else {\n      lineWidth /= scale;\n    }\n\n    if (fontSizeScale !== 1.0) {\n      ctx.scale(fontSizeScale, fontSizeScale);\n      lineWidth /= fontSizeScale;\n    }\n\n    ctx.lineWidth = lineWidth;\n\n    if (font.isInvalidPDFjsFont) {\n      const chars = [];\n      let width = 0;\n      for (const glyph of glyphs) {\n        chars.push(glyph.unicode);\n        width += glyph.width;\n      }\n      ctx.fillText(chars.join(\"\"), 0, 0);\n      current.x += width * widthAdvanceScale * textHScale;\n      ctx.restore();\n      this.compose();\n\n      return undefined;\n    }\n\n    let x = 0,\n      i;\n    for (i = 0; i < glyphsLength; ++i) {\n      const glyph = glyphs[i];\n      if (typeof glyph === \"number\") {\n        x += (spacingDir * glyph * fontSize) / 1000;\n        continue;\n      }\n\n      let restoreNeeded = false;\n      const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n      const character = glyph.fontChar;\n      const accent = glyph.accent;\n      let scaledX, scaledY;\n      let width = glyph.width;\n      if (vertical) {\n        const vmetric = glyph.vmetric || defaultVMetrics;\n        const vx =\n          -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;\n        const vy = vmetric[2] * widthAdvanceScale;\n\n        width = vmetric ? -vmetric[0] : width;\n        scaledX = vx / fontSizeScale;\n        scaledY = (x + vy) / fontSizeScale;\n      } else {\n        scaledX = x / fontSizeScale;\n        scaledY = 0;\n      }\n\n      if (font.remeasure && width > 0) {\n        // Some standard fonts may not have the exact width: rescale per\n        // character if measured width is greater than expected glyph width\n        // and subpixel-aa is enabled, otherwise just center the glyph.\n        const measuredWidth =\n          ((ctx.measureText(character).width * 1000) / fontSize) *\n          fontSizeScale;\n        if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n          const characterScaleX = width / measuredWidth;\n          restoreNeeded = true;\n          ctx.save();\n          ctx.scale(characterScaleX, 1);\n          scaledX /= characterScaleX;\n        } else if (width !== measuredWidth) {\n          scaledX +=\n            (((width - measuredWidth) / 2000) * fontSize) / fontSizeScale;\n        }\n      }\n\n      // Only attempt to draw the glyph if it is actually in the embedded font\n      // file or if there isn't a font file so the fallback font is shown.\n      if (this.contentVisible && (glyph.isInFont || font.missingFile)) {\n        if (simpleFillText && !accent) {\n          // common case\n          ctx.fillText(character, scaledX, scaledY);\n        } else {\n          this.paintChar(\n            character,\n            scaledX,\n            scaledY,\n            patternFillTransform,\n            patternStrokeTransform\n          );\n          if (accent) {\n            const scaledAccentX =\n              scaledX + (fontSize * accent.offset.x) / fontSizeScale;\n            const scaledAccentY =\n              scaledY - (fontSize * accent.offset.y) / fontSizeScale;\n            this.paintChar(\n              accent.fontChar,\n              scaledAccentX,\n              scaledAccentY,\n              patternFillTransform,\n              patternStrokeTransform\n            );\n          }\n        }\n      }\n\n      const charWidth = vertical\n        ? width * widthAdvanceScale - spacing * fontDirection\n        : width * widthAdvanceScale + spacing * fontDirection;\n      x += charWidth;\n\n      if (restoreNeeded) {\n        ctx.restore();\n      }\n    }\n    if (vertical) {\n      current.y -= x;\n    } else {\n      current.x += x * textHScale;\n    }\n    ctx.restore();\n    this.compose();\n\n    return undefined;\n  }\n\n  showType3Text(glyphs) {\n    // Type3 fonts - each glyph is a \"mini-PDF\"\n    const ctx = this.ctx;\n    const current = this.current;\n    const font = current.font;\n    const fontSize = current.fontSize;\n    const fontDirection = current.fontDirection;\n    const spacingDir = font.vertical ? 1 : -1;\n    const charSpacing = current.charSpacing;\n    const wordSpacing = current.wordSpacing;\n    const textHScale = current.textHScale * fontDirection;\n    const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;\n    const glyphsLength = glyphs.length;\n    const isTextInvisible =\n      current.textRenderingMode === TextRenderingMode.INVISIBLE;\n    let i, glyph, width, spacingLength;\n\n    if (isTextInvisible || fontSize === 0) {\n      return;\n    }\n    this._cachedScaleForStroking[0] = -1;\n    this._cachedGetSinglePixelWidth = null;\n\n    ctx.save();\n    ctx.transform(...current.textMatrix);\n    ctx.translate(current.x, current.y);\n\n    ctx.scale(textHScale, fontDirection);\n\n    for (i = 0; i < glyphsLength; ++i) {\n      glyph = glyphs[i];\n      if (typeof glyph === \"number\") {\n        spacingLength = (spacingDir * glyph * fontSize) / 1000;\n        this.ctx.translate(spacingLength, 0);\n        current.x += spacingLength * textHScale;\n        continue;\n      }\n\n      const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n      const operatorList = font.charProcOperatorList[glyph.operatorListId];\n      if (!operatorList) {\n        warn(`Type3 character \"${glyph.operatorListId}\" is not available.`);\n        continue;\n      }\n      if (this.contentVisible) {\n        this.processingType3 = glyph;\n        this.save();\n        ctx.scale(fontSize, fontSize);\n        ctx.transform(...fontMatrix);\n        this.executeOperatorList(operatorList);\n        this.restore();\n      }\n\n      const transformed = Util.applyTransform([glyph.width, 0], fontMatrix);\n      width = transformed[0] * fontSize + spacing;\n\n      ctx.translate(width, 0);\n      current.x += width * textHScale;\n    }\n    ctx.restore();\n    this.processingType3 = null;\n  }\n\n  // Type3 fonts\n  setCharWidth(xWidth, yWidth) {\n    // We can safely ignore this since the width should be the same\n    // as the width in the Widths array.\n  }\n\n  setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {\n    this.ctx.rect(llx, lly, urx - llx, ury - lly);\n    this.ctx.clip();\n    this.endPath();\n  }\n\n  // Color\n  getColorN_Pattern(IR) {\n    let pattern;\n    if (IR[0] === \"TilingPattern\") {\n      const color = IR[1];\n      const baseTransform = this.baseTransform || getCurrentTransform(this.ctx);\n      const canvasGraphicsFactory = {\n        createCanvasGraphics: ctx =>\n          new CanvasGraphics(\n            ctx,\n            this.commonObjs,\n            this.objs,\n            this.canvasFactory,\n            this.filterFactory,\n            {\n              optionalContentConfig: this.optionalContentConfig,\n              markedContentStack: this.markedContentStack,\n            }\n          ),\n      };\n      pattern = new TilingPattern(\n        IR,\n        color,\n        this.ctx,\n        canvasGraphicsFactory,\n        baseTransform\n      );\n    } else {\n      pattern = this._getPattern(IR[1], IR[2]);\n    }\n    return pattern;\n  }\n\n  setStrokeColorN() {\n    this.current.strokeColor = this.getColorN_Pattern(arguments);\n    this.current.patternStroke = true;\n  }\n\n  setFillColorN() {\n    this.current.fillColor = this.getColorN_Pattern(arguments);\n    this.current.patternFill = true;\n  }\n\n  setStrokeRGBColor(r, g, b) {\n    this.ctx.strokeStyle = this.current.strokeColor = Util.makeHexColor(\n      r,\n      g,\n      b\n    );\n    this.current.patternStroke = false;\n  }\n\n  setStrokeTransparent() {\n    this.ctx.strokeStyle = this.current.strokeColor = \"transparent\";\n    this.current.patternStroke = false;\n  }\n\n  setFillRGBColor(r, g, b) {\n    this.ctx.fillStyle = this.current.fillColor = Util.makeHexColor(r, g, b);\n    this.current.patternFill = false;\n  }\n\n  setFillTransparent() {\n    this.ctx.fillStyle = this.current.fillColor = \"transparent\";\n    this.current.patternFill = false;\n  }\n\n  _getPattern(objId, matrix = null) {\n    let pattern;\n    if (this.cachedPatterns.has(objId)) {\n      pattern = this.cachedPatterns.get(objId);\n    } else {\n      pattern = getShadingPattern(this.getObject(objId));\n      this.cachedPatterns.set(objId, pattern);\n    }\n    if (matrix) {\n      pattern.matrix = matrix;\n    }\n    return pattern;\n  }\n\n  shadingFill(objId) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const ctx = this.ctx;\n\n    this.save();\n    const pattern = this._getPattern(objId);\n    ctx.fillStyle = pattern.getPattern(\n      ctx,\n      this,\n      getCurrentTransformInverse(ctx),\n      PathType.SHADING\n    );\n\n    const inv = getCurrentTransformInverse(ctx);\n    if (inv) {\n      const { width, height } = ctx.canvas;\n      const [x0, y0, x1, y1] = Util.getAxialAlignedBoundingBox(\n        [0, 0, width, height],\n        inv\n      );\n\n      this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n    } else {\n      // HACK to draw the gradient onto an infinite rectangle.\n      // PDF gradients are drawn across the entire image while\n      // Canvas only allows gradients to be drawn in a rectangle\n      // The following bug should allow us to remove this.\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=664884\n\n      this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n    }\n\n    this.compose(this.current.getClippedPathBoundingBox());\n    this.restore();\n  }\n\n  // Images\n  beginInlineImage() {\n    unreachable(\"Should not call beginInlineImage\");\n  }\n\n  beginImageData() {\n    unreachable(\"Should not call beginImageData\");\n  }\n\n  paintFormXObjectBegin(matrix, bbox) {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.save();\n    this.baseTransformStack.push(this.baseTransform);\n\n    if (matrix) {\n      this.transform(...matrix);\n    }\n    this.baseTransform = getCurrentTransform(this.ctx);\n\n    if (bbox) {\n      const width = bbox[2] - bbox[0];\n      const height = bbox[3] - bbox[1];\n      this.ctx.rect(bbox[0], bbox[1], width, height);\n      this.current.updateRectMinMax(getCurrentTransform(this.ctx), bbox);\n      this.clip();\n      this.endPath();\n    }\n  }\n\n  paintFormXObjectEnd() {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.restore();\n    this.baseTransform = this.baseTransformStack.pop();\n  }\n\n  beginGroup(group) {\n    if (!this.contentVisible) {\n      return;\n    }\n\n    this.save();\n    // If there's an active soft mask we don't want it enabled for the group, so\n    // clear it out. The mask and suspended canvas will be restored in endGroup.\n    if (this.inSMaskMode) {\n      this.endSMaskMode();\n      this.current.activeSMask = null;\n    }\n\n    const currentCtx = this.ctx;\n    // TODO non-isolated groups - according to Rik at adobe non-isolated\n    // group results aren't usually that different and they even have tools\n    // that ignore this setting. Notes from Rik on implementing:\n    // - When you encounter an transparency group, create a new canvas with\n    // the dimensions of the bbox\n    // - copy the content from the previous canvas to the new canvas\n    // - draw as usual\n    // - remove the backdrop alpha:\n    // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha\n    // value of your transparency group and 'alphaBackdrop' the alpha of the\n    // backdrop\n    // - remove background color:\n    // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)\n    if (!group.isolated) {\n      info(\"TODO: Support non-isolated groups.\");\n    }\n\n    // TODO knockout - supposedly possible with the clever use of compositing\n    // modes.\n    if (group.knockout) {\n      warn(\"Knockout groups not supported.\");\n    }\n\n    const currentTransform = getCurrentTransform(currentCtx);\n    if (group.matrix) {\n      currentCtx.transform(...group.matrix);\n    }\n    if (!group.bbox) {\n      throw new Error(\"Bounding box is required.\");\n    }\n\n    // Based on the current transform figure out how big the bounding box\n    // will actually be.\n    let bounds = Util.getAxialAlignedBoundingBox(\n      group.bbox,\n      getCurrentTransform(currentCtx)\n    );\n    // Clip the bounding box to the current canvas.\n    const canvasBounds = [\n      0,\n      0,\n      currentCtx.canvas.width,\n      currentCtx.canvas.height,\n    ];\n    bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n    // Use ceil in case we're between sizes so we don't create canvas that is\n    // too small and make the canvas at least 1x1 pixels.\n    const offsetX = Math.floor(bounds[0]);\n    const offsetY = Math.floor(bounds[1]);\n    const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n    const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n\n    this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]);\n\n    let cacheId = \"groupAt\" + this.groupLevel;\n    if (group.smask) {\n      // Using two cache entries is case if masks are used one after another.\n      cacheId += \"_smask_\" + (this.smaskCounter++ % 2);\n    }\n    const scratchCanvas = this.cachedCanvases.getCanvas(\n      cacheId,\n      drawnWidth,\n      drawnHeight\n    );\n    const groupCtx = scratchCanvas.context;\n\n    // Since we created a new canvas that is just the size of the bounding box\n    // we have to translate the group ctx.\n    groupCtx.translate(-offsetX, -offsetY);\n    groupCtx.transform(...currentTransform);\n\n    if (group.smask) {\n      // Saving state and cached mask to be used in setGState.\n      this.smaskStack.push({\n        canvas: scratchCanvas.canvas,\n        context: groupCtx,\n        offsetX,\n        offsetY,\n        subtype: group.smask.subtype,\n        backdrop: group.smask.backdrop,\n        transferMap: group.smask.transferMap || null,\n        startTransformInverse: null, // used during suspend operation\n      });\n    } else {\n      // Setup the current ctx so when the group is popped we draw it at the\n      // right location.\n      currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n      currentCtx.translate(offsetX, offsetY);\n      currentCtx.save();\n    }\n    // The transparency group inherits all off the current graphics state\n    // except the blend mode, soft mask, and alpha constants.\n    copyCtxState(currentCtx, groupCtx);\n    this.ctx = groupCtx;\n    this.setGState([\n      [\"BM\", \"source-over\"],\n      [\"ca\", 1],\n      [\"CA\", 1],\n    ]);\n    this.groupStack.push(currentCtx);\n    this.groupLevel++;\n  }\n\n  endGroup(group) {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.groupLevel--;\n    const groupCtx = this.ctx;\n    const ctx = this.groupStack.pop();\n    this.ctx = ctx;\n    // Turn off image smoothing to avoid sub pixel interpolation which can\n    // look kind of blurry for some pdfs.\n    this.ctx.imageSmoothingEnabled = false;\n\n    if (group.smask) {\n      this.tempSMask = this.smaskStack.pop();\n      this.restore();\n    } else {\n      this.ctx.restore();\n      const currentMtx = getCurrentTransform(this.ctx);\n      this.restore();\n      this.ctx.save();\n      this.ctx.setTransform(...currentMtx);\n      const dirtyBox = Util.getAxialAlignedBoundingBox(\n        [0, 0, groupCtx.canvas.width, groupCtx.canvas.height],\n        currentMtx\n      );\n      this.ctx.drawImage(groupCtx.canvas, 0, 0);\n      this.ctx.restore();\n      this.compose(dirtyBox);\n    }\n  }\n\n  beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) {\n    // The annotations are drawn just after the page content.\n    // The page content drawing can potentially have set a transform,\n    // a clipping path, whatever...\n    // So in order to have something clean, we restore the initial state.\n    this.#restoreInitialState();\n    resetCtxToDefault(this.ctx);\n\n    this.ctx.save();\n    this.save();\n\n    if (this.baseTransform) {\n      this.ctx.setTransform(...this.baseTransform);\n    }\n\n    if (rect) {\n      const width = rect[2] - rect[0];\n      const height = rect[3] - rect[1];\n\n      if (hasOwnCanvas && this.annotationCanvasMap) {\n        transform = transform.slice();\n        transform[4] -= rect[0];\n        transform[5] -= rect[1];\n\n        rect = rect.slice();\n        rect[0] = rect[1] = 0;\n        rect[2] = width;\n        rect[3] = height;\n\n        const [scaleX, scaleY] = Util.singularValueDecompose2dScale(\n          getCurrentTransform(this.ctx)\n        );\n        const { viewportScale } = this;\n        const canvasWidth = Math.ceil(\n          width * this.outputScaleX * viewportScale\n        );\n        const canvasHeight = Math.ceil(\n          height * this.outputScaleY * viewportScale\n        );\n\n        this.annotationCanvas = this.canvasFactory.create(\n          canvasWidth,\n          canvasHeight\n        );\n        const { canvas, context } = this.annotationCanvas;\n        this.annotationCanvasMap.set(id, canvas);\n        this.annotationCanvas.savedCtx = this.ctx;\n        this.ctx = context;\n        this.ctx.save();\n        this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY);\n\n        resetCtxToDefault(this.ctx);\n      } else {\n        resetCtxToDefault(this.ctx);\n\n        // Consume a potential path before clipping.\n        this.endPath();\n\n        this.ctx.rect(rect[0], rect[1], width, height);\n        this.ctx.clip();\n        this.ctx.beginPath();\n      }\n    }\n\n    this.current = new CanvasExtraState(\n      this.ctx.canvas.width,\n      this.ctx.canvas.height\n    );\n\n    this.transform(...transform);\n    this.transform(...matrix);\n  }\n\n  endAnnotation() {\n    if (this.annotationCanvas) {\n      this.ctx.restore();\n      this.#drawFilter();\n\n      this.ctx = this.annotationCanvas.savedCtx;\n      delete this.annotationCanvas.savedCtx;\n      delete this.annotationCanvas;\n    }\n  }\n\n  paintImageMaskXObject(img) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const count = img.count;\n    img = this.getObject(img.data, img);\n    img.count = count;\n\n    const ctx = this.ctx;\n    const glyph = this.processingType3;\n\n    if (glyph) {\n      if (glyph.compiled === undefined) {\n        glyph.compiled = compileType3Glyph(img);\n      }\n\n      if (glyph.compiled) {\n        glyph.compiled(ctx);\n        return;\n      }\n    }\n    const mask = this._createMaskCanvas(img);\n    const maskCanvas = mask.canvas;\n\n    ctx.save();\n    // The mask is drawn with the transform applied. Reset the current\n    // transform to draw to the identity.\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY);\n    ctx.restore();\n    this.compose();\n  }\n\n  paintImageMaskXObjectRepeat(\n    img,\n    scaleX,\n    skewX = 0,\n    skewY = 0,\n    scaleY,\n    positions\n  ) {\n    if (!this.contentVisible) {\n      return;\n    }\n\n    img = this.getObject(img.data, img);\n\n    const ctx = this.ctx;\n    ctx.save();\n    const currentTransform = getCurrentTransform(ctx);\n    ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);\n    const mask = this._createMaskCanvas(img);\n\n    ctx.setTransform(\n      1,\n      0,\n      0,\n      1,\n      mask.offsetX - currentTransform[4],\n      mask.offsetY - currentTransform[5]\n    );\n    for (let i = 0, ii = positions.length; i < ii; i += 2) {\n      const trans = Util.transform(currentTransform, [\n        scaleX,\n        skewX,\n        skewY,\n        scaleY,\n        positions[i],\n        positions[i + 1],\n      ]);\n\n      const [x, y] = Util.applyTransform([0, 0], trans);\n      ctx.drawImage(mask.canvas, x, y);\n    }\n    ctx.restore();\n    this.compose();\n  }\n\n  paintImageMaskXObjectGroup(images) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const ctx = this.ctx;\n\n    const fillColor = this.current.fillColor;\n    const isPatternFill = this.current.patternFill;\n\n    for (const image of images) {\n      const { data, width, height, transform } = image;\n\n      const maskCanvas = this.cachedCanvases.getCanvas(\n        \"maskCanvas\",\n        width,\n        height\n      );\n      const maskCtx = maskCanvas.context;\n      maskCtx.save();\n\n      const img = this.getObject(data, image);\n      putBinaryImageMask(maskCtx, img);\n\n      maskCtx.globalCompositeOperation = \"source-in\";\n\n      maskCtx.fillStyle = isPatternFill\n        ? fillColor.getPattern(\n            maskCtx,\n            this,\n            getCurrentTransformInverse(ctx),\n            PathType.FILL\n          )\n        : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n\n      maskCtx.restore();\n\n      ctx.save();\n      ctx.transform(...transform);\n      ctx.scale(1, -1);\n      drawImageAtIntegerCoords(\n        ctx,\n        maskCanvas.canvas,\n        0,\n        0,\n        width,\n        height,\n        0,\n        -1,\n        1,\n        1\n      );\n      ctx.restore();\n    }\n    this.compose();\n  }\n\n  paintImageXObject(objId) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const imgData = this.getObject(objId);\n    if (!imgData) {\n      warn(\"Dependent image isn't ready yet\");\n      return;\n    }\n\n    this.paintInlineImageXObject(imgData);\n  }\n\n  paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const imgData = this.getObject(objId);\n    if (!imgData) {\n      warn(\"Dependent image isn't ready yet\");\n      return;\n    }\n\n    const width = imgData.width;\n    const height = imgData.height;\n    const map = [];\n    for (let i = 0, ii = positions.length; i < ii; i += 2) {\n      map.push({\n        transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],\n        x: 0,\n        y: 0,\n        w: width,\n        h: height,\n      });\n    }\n    this.paintInlineImageXObjectGroup(imgData, map);\n  }\n\n  applyTransferMapsToCanvas(ctx) {\n    if (this.current.transferMaps !== \"none\") {\n      ctx.filter = this.current.transferMaps;\n      ctx.drawImage(ctx.canvas, 0, 0);\n      ctx.filter = \"none\";\n    }\n    return ctx.canvas;\n  }\n\n  applyTransferMapsToBitmap(imgData) {\n    if (this.current.transferMaps === \"none\") {\n      return imgData.bitmap;\n    }\n    const { bitmap, width, height } = imgData;\n    const tmpCanvas = this.cachedCanvases.getCanvas(\n      \"inlineImage\",\n      width,\n      height\n    );\n    const tmpCtx = tmpCanvas.context;\n    tmpCtx.filter = this.current.transferMaps;\n    tmpCtx.drawImage(bitmap, 0, 0);\n    tmpCtx.filter = \"none\";\n\n    return tmpCanvas.canvas;\n  }\n\n  paintInlineImageXObject(imgData) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const width = imgData.width;\n    const height = imgData.height;\n    const ctx = this.ctx;\n\n    this.save();\n\n    if (\n      (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n      !isNodeJS\n    ) {\n      // The filter, if any, will be applied in applyTransferMapsToBitmap.\n      // It must be applied to the image before rescaling else some artifacts\n      // could appear.\n      // The final restore will reset it to its value.\n      const { filter } = ctx;\n      if (filter !== \"none\" && filter !== \"\") {\n        ctx.filter = \"none\";\n      }\n    }\n\n    // scale the image to the unit square\n    ctx.scale(1 / width, -1 / height);\n\n    let imgToPaint;\n    if (imgData.bitmap) {\n      imgToPaint = this.applyTransferMapsToBitmap(imgData);\n    } else if (\n      (typeof HTMLElement === \"function\" && imgData instanceof HTMLElement) ||\n      !imgData.data\n    ) {\n      // typeof check is needed due to node.js support, see issue #8489\n      imgToPaint = imgData;\n    } else {\n      const tmpCanvas = this.cachedCanvases.getCanvas(\n        \"inlineImage\",\n        width,\n        height\n      );\n      const tmpCtx = tmpCanvas.context;\n      putBinaryImageData(tmpCtx, imgData);\n      imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);\n    }\n\n    const scaled = this._scaleImage(\n      imgToPaint,\n      getCurrentTransformInverse(ctx)\n    );\n    ctx.imageSmoothingEnabled = getImageSmoothingEnabled(\n      getCurrentTransform(ctx),\n      imgData.interpolate\n    );\n\n    drawImageAtIntegerCoords(\n      ctx,\n      scaled.img,\n      0,\n      0,\n      scaled.paintWidth,\n      scaled.paintHeight,\n      0,\n      -height,\n      width,\n      height\n    );\n    this.compose();\n    this.restore();\n  }\n\n  paintInlineImageXObjectGroup(imgData, map) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const ctx = this.ctx;\n    let imgToPaint;\n    if (imgData.bitmap) {\n      imgToPaint = imgData.bitmap;\n    } else {\n      const w = imgData.width;\n      const h = imgData.height;\n\n      const tmpCanvas = this.cachedCanvases.getCanvas(\"inlineImage\", w, h);\n      const tmpCtx = tmpCanvas.context;\n      putBinaryImageData(tmpCtx, imgData);\n      imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);\n    }\n\n    for (const entry of map) {\n      ctx.save();\n      ctx.transform(...entry.transform);\n      ctx.scale(1, -1);\n      drawImageAtIntegerCoords(\n        ctx,\n        imgToPaint,\n        entry.x,\n        entry.y,\n        entry.w,\n        entry.h,\n        0,\n        -1,\n        1,\n        1\n      );\n      ctx.restore();\n    }\n    this.compose();\n  }\n\n  paintSolidColorImageMask() {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.ctx.fillRect(0, 0, 1, 1);\n    this.compose();\n  }\n\n  // Marked content\n\n  markPoint(tag) {\n    // TODO Marked content.\n  }\n\n  markPointProps(tag, properties) {\n    // TODO Marked content.\n  }\n\n  beginMarkedContent(tag) {\n    this.markedContentStack.push({\n      visible: true,\n    });\n  }\n\n  beginMarkedContentProps(tag, properties) {\n    if (tag === \"OC\") {\n      this.markedContentStack.push({\n        visible: this.optionalContentConfig.isVisible(properties),\n      });\n    } else {\n      this.markedContentStack.push({\n        visible: true,\n      });\n    }\n    this.contentVisible = this.isContentVisible();\n  }\n\n  endMarkedContent() {\n    this.markedContentStack.pop();\n    this.contentVisible = this.isContentVisible();\n  }\n\n  // Compatibility\n\n  beginCompat() {\n    // TODO ignore undefined operators (should we do that anyway?)\n  }\n\n  endCompat() {\n    // TODO stop ignoring undefined operators\n  }\n\n  // Helper functions\n\n  consumePath(clipBox) {\n    const isEmpty = this.current.isEmptyClip();\n    if (this.pendingClip) {\n      this.current.updateClipFromPath();\n    }\n    if (!this.pendingClip) {\n      this.compose(clipBox);\n    }\n    const ctx = this.ctx;\n    if (this.pendingClip) {\n      if (!isEmpty) {\n        if (this.pendingClip === EO_CLIP) {\n          ctx.clip(\"evenodd\");\n        } else {\n          ctx.clip();\n        }\n      }\n      this.pendingClip = null;\n    }\n    this.current.startNewPathAndClipBox(this.current.clipBox);\n    ctx.beginPath();\n  }\n\n  getSinglePixelWidth() {\n    if (!this._cachedGetSinglePixelWidth) {\n      const m = getCurrentTransform(this.ctx);\n      if (m[1] === 0 && m[2] === 0) {\n        // Fast path\n        this._cachedGetSinglePixelWidth =\n          1 / Math.min(Math.abs(m[0]), Math.abs(m[3]));\n      } else {\n        const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);\n        const normX = Math.hypot(m[0], m[2]);\n        const normY = Math.hypot(m[1], m[3]);\n        this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet;\n      }\n    }\n    return this._cachedGetSinglePixelWidth;\n  }\n\n  getScaleForStroking() {\n    // A pixel has thicknessX = thicknessY = 1;\n    // A transformed pixel is a parallelogram and the thicknesses\n    // corresponds to the heights.\n    // The goal of this function is to rescale before setting the\n    // lineWidth in order to have both thicknesses greater or equal\n    // to 1 after transform.\n    if (this._cachedScaleForStroking[0] === -1) {\n      const { lineWidth } = this.current;\n      const { a, b, c, d } = this.ctx.getTransform();\n      let scaleX, scaleY;\n\n      if (b === 0 && c === 0) {\n        // Fast path\n        const normX = Math.abs(a);\n        const normY = Math.abs(d);\n        if (normX === normY) {\n          if (lineWidth === 0) {\n            scaleX = scaleY = 1 / normX;\n          } else {\n            const scaledLineWidth = normX * lineWidth;\n            scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1;\n          }\n        } else if (lineWidth === 0) {\n          scaleX = 1 / normX;\n          scaleY = 1 / normY;\n        } else {\n          const scaledXLineWidth = normX * lineWidth;\n          const scaledYLineWidth = normY * lineWidth;\n          scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1;\n          scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1;\n        }\n      } else {\n        // A pixel (base (x, y)) is transformed by M into a parallelogram:\n        //  - its area is |det(M)|;\n        //  - heightY (orthogonal to Mx) has a length: |det(M)| / norm(Mx);\n        //  - heightX (orthogonal to My) has a length: |det(M)| / norm(My).\n        // heightX and heightY are the thicknesses of the transformed pixel\n        // and they must be both greater or equal to 1.\n        const absDet = Math.abs(a * d - b * c);\n        const normX = Math.hypot(a, b);\n        const normY = Math.hypot(c, d);\n        if (lineWidth === 0) {\n          scaleX = normY / absDet;\n          scaleY = normX / absDet;\n        } else {\n          const baseArea = lineWidth * absDet;\n          scaleX = normY > baseArea ? normY / baseArea : 1;\n          scaleY = normX > baseArea ? normX / baseArea : 1;\n        }\n      }\n      this._cachedScaleForStroking[0] = scaleX;\n      this._cachedScaleForStroking[1] = scaleY;\n    }\n    return this._cachedScaleForStroking;\n  }\n\n  // Rescale before stroking in order to have a final lineWidth\n  // with both thicknesses greater or equal to 1.\n  rescaleAndStroke(saveRestore) {\n    const { ctx } = this;\n    const { lineWidth } = this.current;\n    const [scaleX, scaleY] = this.getScaleForStroking();\n\n    ctx.lineWidth = lineWidth || 1;\n\n    if (scaleX === 1 && scaleY === 1) {\n      ctx.stroke();\n      return;\n    }\n\n    const dashes = ctx.getLineDash();\n    if (saveRestore) {\n      ctx.save();\n    }\n\n    ctx.scale(scaleX, scaleY);\n\n    // How the dashed line is rendered depends on the current transform...\n    // so we added a rescale to handle too thin lines and consequently\n    // the way the line is dashed will be modified.\n    // If scaleX === scaleY, the dashed lines will be rendered correctly\n    // else we'll have some bugs (but only with too thin lines).\n    // Here we take the max... why not taking the min... or something else.\n    // Anyway, as said it's buggy when scaleX !== scaleY.\n    if (dashes.length > 0) {\n      const scale = Math.max(scaleX, scaleY);\n      ctx.setLineDash(dashes.map(x => x / scale));\n      ctx.lineDashOffset /= scale;\n    }\n\n    ctx.stroke();\n\n    if (saveRestore) {\n      ctx.restore();\n    }\n  }\n\n  isContentVisible() {\n    for (let i = this.markedContentStack.length - 1; i >= 0; i--) {\n      if (!this.markedContentStack[i].visible) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n\nfor (const op in OPS) {\n  if (CanvasGraphics.prototype[op] !== undefined) {\n    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];\n  }\n}\n\nexport { CanvasGraphics };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass GlobalWorkerOptions {\n  static #port = null;\n\n  static #src = \"\";\n\n  /**\n   * @type {Worker | null}\n   */\n  static get workerPort() {\n    return this.#port;\n  }\n\n  /**\n   * @param {Worker | null} workerPort - Defines global port for worker process.\n   *   Overrides the `workerSrc` option.\n   */\n  static set workerPort(val) {\n    if (\n      !(typeof Worker !== \"undefined\" && val instanceof Worker) &&\n      val !== null\n    ) {\n      throw new Error(\"Invalid `workerPort` type.\");\n    }\n    this.#port = val;\n  }\n\n  /**\n   * @type {string}\n   */\n  static get workerSrc() {\n    return this.#src;\n  }\n\n  /**\n   * @param {string} workerSrc - A string containing the path and filename of\n   *   the worker file.\n   *\n   *   NOTE: The `workerSrc` option should always be set, in order to prevent\n   *         any issues when using the PDF.js library.\n   */\n  static set workerSrc(val) {\n    if (typeof val !== \"string\") {\n      throw new Error(\"Invalid `workerSrc` type.\");\n    }\n    this.#src = val;\n  }\n}\n\nexport { GlobalWorkerOptions };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { objectFromMap } from \"../shared/util.js\";\n\nclass Metadata {\n  #metadataMap;\n\n  #data;\n\n  constructor({ parsedData, rawData }) {\n    this.#metadataMap = parsedData;\n    this.#data = rawData;\n  }\n\n  getRaw() {\n    return this.#data;\n  }\n\n  get(name) {\n    return this.#metadataMap.get(name) ?? null;\n  }\n\n  getAll() {\n    return objectFromMap(this.#metadataMap);\n  }\n\n  has(name) {\n    return this.#metadataMap.has(name);\n  }\n}\n\nexport { Metadata };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  info,\n  objectFromMap,\n  RenderingIntentFlag,\n  unreachable,\n  warn,\n} from \"../shared/util.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\n\nconst INTERNAL = Symbol(\"INTERNAL\");\n\nclass OptionalContentGroup {\n  #isDisplay = false;\n\n  #isPrint = false;\n\n  #userSet = false;\n\n  #visible = true;\n\n  constructor(renderingIntent, { name, intent, usage, rbGroups }) {\n    this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY);\n    this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n\n    this.name = name;\n    this.intent = intent;\n    this.usage = usage;\n    this.rbGroups = rbGroups;\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get visible() {\n    if (this.#userSet) {\n      return this.#visible;\n    }\n    if (!this.#visible) {\n      return false;\n    }\n    const { print, view } = this.usage;\n\n    if (this.#isDisplay) {\n      return view?.viewState !== \"OFF\";\n    } else if (this.#isPrint) {\n      return print?.printState !== \"OFF\";\n    }\n    return true;\n  }\n\n  /**\n   * @ignore\n   */\n  _setVisible(internal, visible, userSet = false) {\n    if (internal !== INTERNAL) {\n      unreachable(\"Internal method `_setVisible` called.\");\n    }\n    this.#userSet = userSet;\n    this.#visible = visible;\n  }\n}\n\nclass OptionalContentConfig {\n  #cachedGetHash = null;\n\n  #groups = new Map();\n\n  #initialHash = null;\n\n  #order = null;\n\n  constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) {\n    this.renderingIntent = renderingIntent;\n\n    this.name = null;\n    this.creator = null;\n\n    if (data === null) {\n      return;\n    }\n    this.name = data.name;\n    this.creator = data.creator;\n    this.#order = data.order;\n    for (const group of data.groups) {\n      this.#groups.set(\n        group.id,\n        new OptionalContentGroup(renderingIntent, group)\n      );\n    }\n\n    if (data.baseState === \"OFF\") {\n      for (const group of this.#groups.values()) {\n        group._setVisible(INTERNAL, false);\n      }\n    }\n\n    for (const on of data.on) {\n      this.#groups.get(on)._setVisible(INTERNAL, true);\n    }\n\n    for (const off of data.off) {\n      this.#groups.get(off)._setVisible(INTERNAL, false);\n    }\n\n    // The following code must always run *last* in the constructor.\n    this.#initialHash = this.getHash();\n  }\n\n  #evaluateVisibilityExpression(array) {\n    const length = array.length;\n    if (length < 2) {\n      return true;\n    }\n    const operator = array[0];\n    for (let i = 1; i < length; i++) {\n      const element = array[i];\n      let state;\n      if (Array.isArray(element)) {\n        state = this.#evaluateVisibilityExpression(element);\n      } else if (this.#groups.has(element)) {\n        state = this.#groups.get(element).visible;\n      } else {\n        warn(`Optional content group not found: ${element}`);\n        return true;\n      }\n      switch (operator) {\n        case \"And\":\n          if (!state) {\n            return false;\n          }\n          break;\n        case \"Or\":\n          if (state) {\n            return true;\n          }\n          break;\n        case \"Not\":\n          return !state;\n        default:\n          return true;\n      }\n    }\n    return operator === \"And\";\n  }\n\n  isVisible(group) {\n    if (this.#groups.size === 0) {\n      return true;\n    }\n    if (!group) {\n      info(\"Optional content group not defined.\");\n      return true;\n    }\n    if (group.type === \"OCG\") {\n      if (!this.#groups.has(group.id)) {\n        warn(`Optional content group not found: ${group.id}`);\n        return true;\n      }\n      return this.#groups.get(group.id).visible;\n    } else if (group.type === \"OCMD\") {\n      // Per the spec, the expression should be preferred if available.\n      if (group.expression) {\n        return this.#evaluateVisibilityExpression(group.expression);\n      }\n      if (!group.policy || group.policy === \"AnyOn\") {\n        // Default\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (this.#groups.get(id).visible) {\n            return true;\n          }\n        }\n        return false;\n      } else if (group.policy === \"AllOn\") {\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (!this.#groups.get(id).visible) {\n            return false;\n          }\n        }\n        return true;\n      } else if (group.policy === \"AnyOff\") {\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (!this.#groups.get(id).visible) {\n            return true;\n          }\n        }\n        return false;\n      } else if (group.policy === \"AllOff\") {\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (this.#groups.get(id).visible) {\n            return false;\n          }\n        }\n        return true;\n      }\n      warn(`Unknown optional content policy ${group.policy}.`);\n      return true;\n    }\n    warn(`Unknown group type ${group.type}.`);\n    return true;\n  }\n\n  setVisibility(id, visible = true, preserveRB = true) {\n    const group = this.#groups.get(id);\n    if (!group) {\n      warn(`Optional content group not found: ${id}`);\n      return;\n    }\n\n    // If the visibility is about to be set to `true` and the group belongs to\n    // any radiobutton groups, hide all other OCGs in these radiobutton groups,\n    // provided that radiobutton state relationships are to be preserved.\n    if (preserveRB && visible && group.rbGroups.length) {\n      for (const rbGroup of group.rbGroups) {\n        for (const otherId of rbGroup) {\n          if (otherId !== id) {\n            this.#groups.get(otherId)?._setVisible(INTERNAL, false, true);\n          }\n        }\n      }\n    }\n\n    group._setVisible(INTERNAL, !!visible, /* userSet = */ true);\n\n    this.#cachedGetHash = null;\n  }\n\n  setOCGState({ state, preserveRB }) {\n    let operator;\n\n    for (const elem of state) {\n      switch (elem) {\n        case \"ON\":\n        case \"OFF\":\n        case \"Toggle\":\n          operator = elem;\n          continue;\n      }\n\n      const group = this.#groups.get(elem);\n      if (!group) {\n        continue;\n      }\n      switch (operator) {\n        case \"ON\":\n          this.setVisibility(elem, true, preserveRB);\n          break;\n        case \"OFF\":\n          this.setVisibility(elem, false, preserveRB);\n          break;\n        case \"Toggle\":\n          this.setVisibility(elem, !group.visible, preserveRB);\n          break;\n      }\n    }\n\n    this.#cachedGetHash = null;\n  }\n\n  get hasInitialVisibility() {\n    return this.#initialHash === null || this.getHash() === this.#initialHash;\n  }\n\n  getOrder() {\n    if (!this.#groups.size) {\n      return null;\n    }\n    if (this.#order) {\n      return this.#order.slice();\n    }\n    return [...this.#groups.keys()];\n  }\n\n  getGroups() {\n    return this.#groups.size > 0 ? objectFromMap(this.#groups) : null;\n  }\n\n  getGroup(id) {\n    return this.#groups.get(id) || null;\n  }\n\n  getHash() {\n    if (this.#cachedGetHash !== null) {\n      return this.#cachedGetHash;\n    }\n    const hash = new MurmurHash3_64();\n\n    for (const [id, group] of this.#groups) {\n      hash.update(`${id}:${group.visible}`);\n    }\n    return (this.#cachedGetHash = hash.hexdigest());\n  }\n}\n\nexport { OptionalContentConfig };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../interfaces\").IPDFStream} IPDFStream */\n/** @typedef {import(\"../interfaces\").IPDFStreamReader} IPDFStreamReader */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../interfaces\").IPDFStreamRangeReader} IPDFStreamRangeReader */\n\nimport { assert } from \"../shared/util.js\";\nimport { isPdfFile } from \"./display_utils.js\";\n\n/** @implements {IPDFStream} */\nclass PDFDataTransportStream {\n  constructor(\n    pdfDataRangeTransport,\n    { disableRange = false, disableStream = false }\n  ) {\n    assert(\n      pdfDataRangeTransport,\n      'PDFDataTransportStream - missing required \"pdfDataRangeTransport\" argument.'\n    );\n    const { length, initialData, progressiveDone, contentDispositionFilename } =\n      pdfDataRangeTransport;\n\n    this._queuedChunks = [];\n    this._progressiveDone = progressiveDone;\n    this._contentDispositionFilename = contentDispositionFilename;\n\n    if (initialData?.length > 0) {\n      // Prevent any possible issues by only transferring a Uint8Array that\n      // completely \"utilizes\" its underlying ArrayBuffer.\n      const buffer =\n        initialData instanceof Uint8Array &&\n        initialData.byteLength === initialData.buffer.byteLength\n          ? initialData.buffer\n          : new Uint8Array(initialData).buffer;\n      this._queuedChunks.push(buffer);\n    }\n\n    this._pdfDataRangeTransport = pdfDataRangeTransport;\n    this._isStreamingSupported = !disableStream;\n    this._isRangeSupported = !disableRange;\n    this._contentLength = length;\n\n    this._fullRequestReader = null;\n    this._rangeReaders = [];\n\n    pdfDataRangeTransport.addRangeListener((begin, chunk) => {\n      this._onReceiveData({ begin, chunk });\n    });\n\n    pdfDataRangeTransport.addProgressListener((loaded, total) => {\n      this._onProgress({ loaded, total });\n    });\n\n    pdfDataRangeTransport.addProgressiveReadListener(chunk => {\n      this._onReceiveData({ chunk });\n    });\n\n    pdfDataRangeTransport.addProgressiveDoneListener(() => {\n      this._onProgressiveDone();\n    });\n\n    pdfDataRangeTransport.transportReady();\n  }\n\n  _onReceiveData({ begin, chunk }) {\n    // Prevent any possible issues by only transferring a Uint8Array that\n    // completely \"utilizes\" its underlying ArrayBuffer.\n    const buffer =\n      chunk instanceof Uint8Array &&\n      chunk.byteLength === chunk.buffer.byteLength\n        ? chunk.buffer\n        : new Uint8Array(chunk).buffer;\n\n    if (begin === undefined) {\n      if (this._fullRequestReader) {\n        this._fullRequestReader._enqueue(buffer);\n      } else {\n        this._queuedChunks.push(buffer);\n      }\n    } else {\n      const found = this._rangeReaders.some(function (rangeReader) {\n        if (rangeReader._begin !== begin) {\n          return false;\n        }\n        rangeReader._enqueue(buffer);\n        return true;\n      });\n      assert(\n        found,\n        \"_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.\"\n      );\n    }\n  }\n\n  get _progressiveDataLength() {\n    return this._fullRequestReader?._loaded ?? 0;\n  }\n\n  _onProgress(evt) {\n    if (evt.total === undefined) {\n      // Reporting to first range reader, if it exists.\n      this._rangeReaders[0]?.onProgress?.({ loaded: evt.loaded });\n    } else {\n      this._fullRequestReader?.onProgress?.({\n        loaded: evt.loaded,\n        total: evt.total,\n      });\n    }\n  }\n\n  _onProgressiveDone() {\n    this._fullRequestReader?.progressiveDone();\n    this._progressiveDone = true;\n  }\n\n  _removeRangeReader(reader) {\n    const i = this._rangeReaders.indexOf(reader);\n    if (i >= 0) {\n      this._rangeReaders.splice(i, 1);\n    }\n  }\n\n  getFullReader() {\n    assert(\n      !this._fullRequestReader,\n      \"PDFDataTransportStream.getFullReader can only be called once.\"\n    );\n    const queuedChunks = this._queuedChunks;\n    this._queuedChunks = null;\n    return new PDFDataTransportStreamReader(\n      this,\n      queuedChunks,\n      this._progressiveDone,\n      this._contentDispositionFilename\n    );\n  }\n\n  getRangeReader(begin, end) {\n    if (end <= this._progressiveDataLength) {\n      return null;\n    }\n    const reader = new PDFDataTransportStreamRangeReader(this, begin, end);\n    this._pdfDataRangeTransport.requestDataRange(begin, end);\n    this._rangeReaders.push(reader);\n    return reader;\n  }\n\n  cancelAllRequests(reason) {\n    this._fullRequestReader?.cancel(reason);\n\n    for (const reader of this._rangeReaders.slice(0)) {\n      reader.cancel(reason);\n    }\n    this._pdfDataRangeTransport.abort();\n  }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFDataTransportStreamReader {\n  constructor(\n    stream,\n    queuedChunks,\n    progressiveDone = false,\n    contentDispositionFilename = null\n  ) {\n    this._stream = stream;\n    this._done = progressiveDone || false;\n    this._filename = isPdfFile(contentDispositionFilename)\n      ? contentDispositionFilename\n      : null;\n    this._queuedChunks = queuedChunks || [];\n    this._loaded = 0;\n    for (const chunk of this._queuedChunks) {\n      this._loaded += chunk.byteLength;\n    }\n    this._requests = [];\n    this._headersReady = Promise.resolve();\n    stream._fullRequestReader = this;\n\n    this.onProgress = null;\n  }\n\n  _enqueue(chunk) {\n    if (this._done) {\n      return; // Ignore new data.\n    }\n    if (this._requests.length > 0) {\n      const requestCapability = this._requests.shift();\n      requestCapability.resolve({ value: chunk, done: false });\n    } else {\n      this._queuedChunks.push(chunk);\n    }\n    this._loaded += chunk.byteLength;\n  }\n\n  get headersReady() {\n    return this._headersReady;\n  }\n\n  get filename() {\n    return this._filename;\n  }\n\n  get isRangeSupported() {\n    return this._stream._isRangeSupported;\n  }\n\n  get isStreamingSupported() {\n    return this._stream._isStreamingSupported;\n  }\n\n  get contentLength() {\n    return this._stream._contentLength;\n  }\n\n  async read() {\n    if (this._queuedChunks.length > 0) {\n      const chunk = this._queuedChunks.shift();\n      return { value: chunk, done: false };\n    }\n    if (this._done) {\n      return { value: undefined, done: true };\n    }\n    const requestCapability = Promise.withResolvers();\n    this._requests.push(requestCapability);\n    return requestCapability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n    for (const requestCapability of this._requests) {\n      requestCapability.resolve({ value: undefined, done: true });\n    }\n    this._requests.length = 0;\n  }\n\n  progressiveDone() {\n    if (this._done) {\n      return;\n    }\n    this._done = true;\n  }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFDataTransportStreamRangeReader {\n  constructor(stream, begin, end) {\n    this._stream = stream;\n    this._begin = begin;\n    this._end = end;\n    this._queuedChunk = null;\n    this._requests = [];\n    this._done = false;\n\n    this.onProgress = null;\n  }\n\n  _enqueue(chunk) {\n    if (this._done) {\n      return; // ignore new data\n    }\n    if (this._requests.length === 0) {\n      this._queuedChunk = chunk;\n    } else {\n      const requestsCapability = this._requests.shift();\n      requestsCapability.resolve({ value: chunk, done: false });\n      for (const requestCapability of this._requests) {\n        requestCapability.resolve({ value: undefined, done: true });\n      }\n      this._requests.length = 0;\n    }\n    this._done = true;\n    this._stream._removeRangeReader(this);\n  }\n\n  get isStreamingSupported() {\n    return false;\n  }\n\n  async read() {\n    if (this._queuedChunk) {\n      const chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return { value: chunk, done: false };\n    }\n    if (this._done) {\n      return { value: undefined, done: true };\n    }\n    const requestCapability = Promise.withResolvers();\n    this._requests.push(requestCapability);\n    return requestCapability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n    for (const requestCapability of this._requests) {\n      requestCapability.resolve({ value: undefined, done: true });\n    }\n    this._requests.length = 0;\n    this._stream._removeRangeReader(this);\n  }\n}\n\nexport { PDFDataTransportStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert,\n  MissingPDFException,\n  UnexpectedResponseException,\n} from \"../shared/util.js\";\nimport { getFilenameFromContentDispositionHeader } from \"./content_disposition.js\";\nimport { isPdfFile } from \"./display_utils.js\";\n\nfunction createHeaders(isHttp, httpHeaders) {\n  const headers = new Headers();\n\n  if (!isHttp || !httpHeaders || typeof httpHeaders !== \"object\") {\n    return headers;\n  }\n  for (const key in httpHeaders) {\n    const val = httpHeaders[key];\n    if (val !== undefined) {\n      headers.append(key, val);\n    }\n  }\n  return headers;\n}\n\nfunction getResponseOrigin(url) {\n  try {\n    return new URL(url).origin;\n  } catch {\n    // `new URL()` will throw on incorrect data.\n  }\n  // Notably, null is distinct from \"null\" string (e.g. from file:-URLs).\n  return null;\n}\n\nfunction validateRangeRequestCapabilities({\n  responseHeaders,\n  isHttp,\n  rangeChunkSize,\n  disableRange,\n}) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    assert(\n      Number.isInteger(rangeChunkSize) && rangeChunkSize > 0,\n      \"rangeChunkSize must be an integer larger than zero.\"\n    );\n  }\n  const returnValues = {\n    allowRangeRequests: false,\n    suggestedLength: undefined,\n  };\n\n  const length = parseInt(responseHeaders.get(\"Content-Length\"), 10);\n  if (!Number.isInteger(length)) {\n    return returnValues;\n  }\n\n  returnValues.suggestedLength = length;\n\n  if (length <= 2 * rangeChunkSize) {\n    // The file size is smaller than the size of two chunks, so it does not\n    // make any sense to abort the request and retry with a range request.\n    return returnValues;\n  }\n\n  if (disableRange || !isHttp) {\n    return returnValues;\n  }\n  if (responseHeaders.get(\"Accept-Ranges\") !== \"bytes\") {\n    return returnValues;\n  }\n\n  const contentEncoding = responseHeaders.get(\"Content-Encoding\") || \"identity\";\n  if (contentEncoding !== \"identity\") {\n    return returnValues;\n  }\n\n  returnValues.allowRangeRequests = true;\n  return returnValues;\n}\n\nfunction extractFilenameFromHeader(responseHeaders) {\n  const contentDisposition = responseHeaders.get(\"Content-Disposition\");\n  if (contentDisposition) {\n    let filename = getFilenameFromContentDispositionHeader(contentDisposition);\n    if (filename.includes(\"%\")) {\n      try {\n        filename = decodeURIComponent(filename);\n      } catch {}\n    }\n    if (isPdfFile(filename)) {\n      return filename;\n    }\n  }\n  return null;\n}\n\nfunction createResponseStatusError(status, url) {\n  if (status === 404 || (status === 0 && url.startsWith(\"file:\"))) {\n    return new MissingPDFException('Missing PDF \"' + url + '\".');\n  }\n  return new UnexpectedResponseException(\n    `Unexpected server response (${status}) while retrieving PDF \"${url}\".`,\n    status\n  );\n}\n\nfunction validateResponseStatus(status) {\n  return status === 200 || status === 206;\n}\n\nexport {\n  createHeaders,\n  createResponseStatusError,\n  extractFilenameFromHeader,\n  getResponseOrigin,\n  validateRangeRequestCapabilities,\n  validateResponseStatus,\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringToBytes } from \"../shared/util.js\";\n\n// This getFilenameFromContentDispositionHeader function is adapted from\n// https://github.com/Rob--W/open-in-browser/blob/7e2e35a38b8b4e981b11da7b2f01df0149049e92/extension/content-disposition.js\n// with the following changes:\n// - Modified to conform to PDF.js's coding style.\n// - Move return to the end of the function to prevent Babel from dropping the\n//   function declarations.\n\n/**\n * Extract file name from the Content-Disposition HTTP response header.\n *\n * @param {string} contentDisposition\n * @returns {string} Filename, if found in the Content-Disposition header.\n */\nfunction getFilenameFromContentDispositionHeader(contentDisposition) {\n  let needsEncodingFixup = true;\n\n  // filename*=ext-value (\"ext-value\" from RFC 5987, referenced by RFC 6266).\n  let tmp = toParamRegExp(\"filename\\\\*\", \"i\").exec(contentDisposition);\n  if (tmp) {\n    tmp = tmp[1];\n    let filename = rfc2616unquote(tmp);\n    filename = unescape(filename);\n    filename = rfc5987decode(filename);\n    filename = rfc2047decode(filename);\n    return fixupEncoding(filename);\n  }\n\n  // Continuations (RFC 2231 section 3, referenced by RFC 5987 section 3.1).\n  // filename*n*=part\n  // filename*n=part\n  tmp = rfc2231getparam(contentDisposition);\n  if (tmp) {\n    // RFC 2047, section\n    const filename = rfc2047decode(tmp);\n    return fixupEncoding(filename);\n  }\n\n  // filename=value (RFC 5987, section 4.1).\n  tmp = toParamRegExp(\"filename\", \"i\").exec(contentDisposition);\n  if (tmp) {\n    tmp = tmp[1];\n    let filename = rfc2616unquote(tmp);\n    filename = rfc2047decode(filename);\n    return fixupEncoding(filename);\n  }\n\n  // After this line there are only function declarations. We cannot put\n  // \"return\" here for readability because babel would then drop the function\n  // declarations...\n  function toParamRegExp(attributePattern, flags) {\n    return new RegExp(\n      \"(?:^|;)\\\\s*\" +\n        attributePattern +\n        \"\\\\s*=\\\\s*\" +\n        // Captures: value = token | quoted-string\n        // (RFC 2616, section 3.6 and referenced by RFC 6266 4.1)\n        \"(\" +\n        '[^\";\\\\s][^;\\\\s]*' +\n        \"|\" +\n        '\"(?:[^\"\\\\\\\\]|\\\\\\\\\"?)+\"?' +\n        \")\",\n      flags\n    );\n  }\n  function textdecode(encoding, value) {\n    if (encoding) {\n      if (!/^[\\x00-\\xFF]+$/.test(value)) {\n        return value;\n      }\n      try {\n        const decoder = new TextDecoder(encoding, { fatal: true });\n        const buffer = stringToBytes(value);\n        value = decoder.decode(buffer);\n        needsEncodingFixup = false;\n      } catch {\n        // TextDecoder constructor threw - unrecognized encoding.\n      }\n    }\n    return value;\n  }\n  function fixupEncoding(value) {\n    if (needsEncodingFixup && /[\\x80-\\xff]/.test(value)) {\n      // Maybe multi-byte UTF-8.\n      value = textdecode(\"utf-8\", value);\n      if (needsEncodingFixup) {\n        // Try iso-8859-1 encoding.\n        value = textdecode(\"iso-8859-1\", value);\n      }\n    }\n    return value;\n  }\n  function rfc2231getparam(contentDispositionStr) {\n    const matches = [];\n    let match;\n    // Iterate over all filename*n= and filename*n*= with n being an integer\n    // of at least zero. Any non-zero number must not start with '0'.\n    const iter = toParamRegExp(\"filename\\\\*((?!0\\\\d)\\\\d+)(\\\\*?)\", \"ig\");\n    while ((match = iter.exec(contentDispositionStr)) !== null) {\n      let [, n, quot, part] = match; // eslint-disable-line prefer-const\n      n = parseInt(n, 10);\n      if (n in matches) {\n        // Ignore anything after the invalid second filename*0.\n        if (n === 0) {\n          break;\n        }\n        continue;\n      }\n      matches[n] = [quot, part];\n    }\n    const parts = [];\n    for (let n = 0; n < matches.length; ++n) {\n      if (!(n in matches)) {\n        // Numbers must be consecutive. Truncate when there is a hole.\n        break;\n      }\n      let [quot, part] = matches[n]; // eslint-disable-line prefer-const\n      part = rfc2616unquote(part);\n      if (quot) {\n        part = unescape(part);\n        if (n === 0) {\n          part = rfc5987decode(part);\n        }\n      }\n      parts.push(part);\n    }\n    return parts.join(\"\");\n  }\n  function rfc2616unquote(value) {\n    if (value.startsWith('\"')) {\n      const parts = value.slice(1).split('\\\\\"');\n      // Find the first unescaped \" and terminate there.\n      for (let i = 0; i < parts.length; ++i) {\n        const quotindex = parts[i].indexOf('\"');\n        if (quotindex !== -1) {\n          parts[i] = parts[i].slice(0, quotindex);\n          parts.length = i + 1; // Truncates and stop the iteration.\n        }\n        parts[i] = parts[i].replaceAll(/\\\\(.)/g, \"$1\");\n      }\n      value = parts.join('\"');\n    }\n    return value;\n  }\n  function rfc5987decode(extvalue) {\n    // Decodes \"ext-value\" from RFC 5987.\n    const encodingend = extvalue.indexOf(\"'\");\n    if (encodingend === -1) {\n      // Some servers send \"filename*=\" without encoding 'language' prefix,\n      // e.g. in https://github.com/Rob--W/open-in-browser/issues/26\n      // Let's accept the value like Firefox (57) (Chrome 62 rejects it).\n      return extvalue;\n    }\n    const encoding = extvalue.slice(0, encodingend);\n    const langvalue = extvalue.slice(encodingend + 1);\n    // Ignore language (RFC 5987 section 3.2.1, and RFC 6266 section 4.1 ).\n    const value = langvalue.replace(/^[^']*'/, \"\");\n    return textdecode(encoding, value);\n  }\n  function rfc2047decode(value) {\n    // RFC 2047-decode the result. Firefox tried to drop support for it, but\n    // backed out because some servers use it - https://bugzil.la/875615\n    // Firefox's condition for decoding is here: https://searchfox.org/mozilla-central/rev/4a590a5a15e35d88a3b23dd6ac3c471cf85b04a8/netwerk/mime/nsMIMEHeaderParamImpl.cpp#742-748\n\n    // We are more strict and only recognize RFC 2047-encoding if the value\n    // starts with \"=?\", since then it is likely that the full value is\n    // RFC 2047-encoded.\n\n    // Firefox also decodes words even where RFC 2047 section 5 states:\n    // \"An 'encoded-word' MUST NOT appear within a 'quoted-string'.\"\n    if (!value.startsWith(\"=?\") || /[\\x00-\\x19\\x80-\\xff]/.test(value)) {\n      return value;\n    }\n    // RFC 2047, section 2.4\n    // encoded-word = \"=?\" charset \"?\" encoding \"?\" encoded-text \"?=\"\n    // charset = token (but let's restrict to characters that denote a\n    //       possibly valid encoding).\n    // encoding = q or b\n    // encoded-text = any printable ASCII character other than ? or space.\n    //        ... but Firefox permits ? and space.\n    return value.replaceAll(\n      /=\\?([\\w-]*)\\?([QqBb])\\?((?:[^?]|\\?(?!=))*)\\?=/g,\n      function (matches, charset, encoding, text) {\n        if (encoding === \"q\" || encoding === \"Q\") {\n          // RFC 2047 section 4.2.\n          text = text.replaceAll(\"_\", \" \");\n          text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) {\n            return String.fromCharCode(parseInt(hex, 16));\n          });\n          return textdecode(charset, text);\n        } // else encoding is b or B - base64 (RFC 2047 section 4.1)\n        try {\n          text = atob(text);\n        } catch {}\n        return textdecode(charset, text);\n      }\n    );\n  }\n\n  return \"\";\n}\n\nexport { getFilenameFromContentDispositionHeader };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AbortException, assert, warn } from \"../shared/util.js\";\nimport {\n  createHeaders,\n  createResponseStatusError,\n  extractFilenameFromHeader,\n  getResponseOrigin,\n  validateRangeRequestCapabilities,\n  validateResponseStatus,\n} from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n  throw new Error(\n    'Module \"./fetch_stream.js\" shall not be used with MOZCENTRAL builds.'\n  );\n}\n\nfunction createFetchOptions(headers, withCredentials, abortController) {\n  return {\n    method: \"GET\",\n    headers,\n    signal: abortController.signal,\n    mode: \"cors\",\n    credentials: withCredentials ? \"include\" : \"same-origin\",\n    redirect: \"follow\",\n  };\n}\n\nfunction getArrayBuffer(val) {\n  if (val instanceof Uint8Array) {\n    return val.buffer;\n  }\n  if (val instanceof ArrayBuffer) {\n    return val;\n  }\n  warn(`getArrayBuffer - unexpected data format: ${val}`);\n  return new Uint8Array(val).buffer;\n}\n\n/** @implements {IPDFStream} */\nclass PDFFetchStream {\n  _responseOrigin = null;\n\n  constructor(source) {\n    this.source = source;\n    this.isHttp = /^https?:/i.test(source.url);\n    this.headers = createHeaders(this.isHttp, source.httpHeaders);\n\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n\n  get _progressiveDataLength() {\n    return this._fullRequestReader?._loaded ?? 0;\n  }\n\n  getFullReader() {\n    assert(\n      !this._fullRequestReader,\n      \"PDFFetchStream.getFullReader can only be called once.\"\n    );\n    this._fullRequestReader = new PDFFetchStreamReader(this);\n    return this._fullRequestReader;\n  }\n\n  getRangeReader(begin, end) {\n    if (end <= this._progressiveDataLength) {\n      return null;\n    }\n    const reader = new PDFFetchStreamRangeReader(this, begin, end);\n    this._rangeRequestReaders.push(reader);\n    return reader;\n  }\n\n  cancelAllRequests(reason) {\n    this._fullRequestReader?.cancel(reason);\n\n    for (const reader of this._rangeRequestReaders.slice(0)) {\n      reader.cancel(reason);\n    }\n  }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFFetchStreamReader {\n  constructor(stream) {\n    this._stream = stream;\n    this._reader = null;\n    this._loaded = 0;\n    this._filename = null;\n    const source = stream.source;\n    this._withCredentials = source.withCredentials || false;\n    this._contentLength = source.length;\n    this._headersCapability = Promise.withResolvers();\n    this._disableRange = source.disableRange || false;\n    this._rangeChunkSize = source.rangeChunkSize;\n    if (!this._rangeChunkSize && !this._disableRange) {\n      this._disableRange = true;\n    }\n\n    this._abortController = new AbortController();\n    this._isStreamingSupported = !source.disableStream;\n    this._isRangeSupported = !source.disableRange;\n    // Always create a copy of the headers.\n    const headers = new Headers(stream.headers);\n\n    const url = source.url;\n    fetch(\n      url,\n      createFetchOptions(headers, this._withCredentials, this._abortController)\n    )\n      .then(response => {\n        stream._responseOrigin = getResponseOrigin(response.url);\n\n        if (!validateResponseStatus(response.status)) {\n          throw createResponseStatusError(response.status, url);\n        }\n        this._reader = response.body.getReader();\n        this._headersCapability.resolve();\n\n        const responseHeaders = response.headers;\n\n        const { allowRangeRequests, suggestedLength } =\n          validateRangeRequestCapabilities({\n            responseHeaders,\n            isHttp: stream.isHttp,\n            rangeChunkSize: this._rangeChunkSize,\n            disableRange: this._disableRange,\n          });\n\n        this._isRangeSupported = allowRangeRequests;\n        // Setting right content length.\n        this._contentLength = suggestedLength || this._contentLength;\n\n        this._filename = extractFilenameFromHeader(responseHeaders);\n\n        // We need to stop reading when range is supported and streaming is\n        // disabled.\n        if (!this._isStreamingSupported && this._isRangeSupported) {\n          this.cancel(new AbortException(\"Streaming is disabled.\"));\n        }\n      })\n      .catch(this._headersCapability.reject);\n\n    this.onProgress = null;\n  }\n\n  get headersReady() {\n    return this._headersCapability.promise;\n  }\n\n  get filename() {\n    return this._filename;\n  }\n\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._headersCapability.promise;\n    const { value, done } = await this._reader.read();\n    if (done) {\n      return { value, done };\n    }\n    this._loaded += value.byteLength;\n    this.onProgress?.({\n      loaded: this._loaded,\n      total: this._contentLength,\n    });\n\n    return { value: getArrayBuffer(value), done: false };\n  }\n\n  cancel(reason) {\n    this._reader?.cancel(reason);\n    this._abortController.abort();\n  }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFFetchStreamRangeReader {\n  constructor(stream, begin, end) {\n    this._stream = stream;\n    this._reader = null;\n    this._loaded = 0;\n    const source = stream.source;\n    this._withCredentials = source.withCredentials || false;\n    this._readCapability = Promise.withResolvers();\n    this._isStreamingSupported = !source.disableStream;\n\n    this._abortController = new AbortController();\n    // Always create a copy of the headers.\n    const headers = new Headers(stream.headers);\n    headers.append(\"Range\", `bytes=${begin}-${end - 1}`);\n\n    const url = source.url;\n    fetch(\n      url,\n      createFetchOptions(headers, this._withCredentials, this._abortController)\n    )\n      .then(response => {\n        const responseOrigin = getResponseOrigin(response.url);\n\n        if (responseOrigin !== stream._responseOrigin) {\n          throw new Error(\n            `Expected range response-origin \"${responseOrigin}\" to match \"${stream._responseOrigin}\".`\n          );\n        }\n        if (!validateResponseStatus(response.status)) {\n          throw createResponseStatusError(response.status, url);\n        }\n        this._readCapability.resolve();\n        this._reader = response.body.getReader();\n      })\n      .catch(this._readCapability.reject);\n\n    this.onProgress = null;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._readCapability.promise;\n    const { value, done } = await this._reader.read();\n    if (done) {\n      return { value, done };\n    }\n    this._loaded += value.byteLength;\n    this.onProgress?.({ loaded: this._loaded });\n\n    return { value: getArrayBuffer(value), done: false };\n  }\n\n  cancel(reason) {\n    this._reader?.cancel(reason);\n    this._abortController.abort();\n  }\n}\n\nexport { PDFFetchStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, stringToBytes, warn } from \"../shared/util.js\";\nimport {\n  createHeaders,\n  createResponseStatusError,\n  extractFilenameFromHeader,\n  getResponseOrigin,\n  validateRangeRequestCapabilities,\n} from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n  throw new Error(\n    'Module \"./network.js\" shall not be used with MOZCENTRAL builds.'\n  );\n}\n\nconst OK_RESPONSE = 200;\nconst PARTIAL_CONTENT_RESPONSE = 206;\n\nfunction getArrayBuffer(xhr) {\n  const data = xhr.response;\n  if (typeof data !== \"string\") {\n    return data;\n  }\n  return stringToBytes(data).buffer;\n}\n\nclass NetworkManager {\n  _responseOrigin = null;\n\n  constructor({ url, httpHeaders, withCredentials }) {\n    this.url = url;\n    this.isHttp = /^https?:/i.test(url);\n    this.headers = createHeaders(this.isHttp, httpHeaders);\n    this.withCredentials = withCredentials || false;\n\n    this.currXhrId = 0;\n    this.pendingRequests = Object.create(null);\n  }\n\n  request(args) {\n    const xhr = new XMLHttpRequest();\n    const xhrId = this.currXhrId++;\n    const pendingRequest = (this.pendingRequests[xhrId] = { xhr });\n\n    xhr.open(\"GET\", this.url);\n    xhr.withCredentials = this.withCredentials;\n    for (const [key, val] of this.headers) {\n      xhr.setRequestHeader(key, val);\n    }\n    if (this.isHttp && \"begin\" in args && \"end\" in args) {\n      xhr.setRequestHeader(\"Range\", `bytes=${args.begin}-${args.end - 1}`);\n      pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE;\n    } else {\n      pendingRequest.expectedStatus = OK_RESPONSE;\n    }\n    xhr.responseType = \"arraybuffer\";\n\n    assert(args.onError, \"Expected `onError` callback to be provided.\");\n    xhr.onerror = () => {\n      args.onError(xhr.status);\n    };\n    xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);\n    xhr.onprogress = this.onProgress.bind(this, xhrId);\n\n    pendingRequest.onHeadersReceived = args.onHeadersReceived;\n    pendingRequest.onDone = args.onDone;\n    pendingRequest.onError = args.onError;\n    pendingRequest.onProgress = args.onProgress;\n\n    xhr.send(null);\n\n    return xhrId;\n  }\n\n  onProgress(xhrId, evt) {\n    const pendingRequest = this.pendingRequests[xhrId];\n    if (!pendingRequest) {\n      return; // Maybe abortRequest was called...\n    }\n    pendingRequest.onProgress?.(evt);\n  }\n\n  onStateChange(xhrId, evt) {\n    const pendingRequest = this.pendingRequests[xhrId];\n    if (!pendingRequest) {\n      return; // Maybe abortRequest was called...\n    }\n\n    const xhr = pendingRequest.xhr;\n    if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n      pendingRequest.onHeadersReceived();\n      delete pendingRequest.onHeadersReceived;\n    }\n\n    if (xhr.readyState !== 4) {\n      return;\n    }\n\n    if (!(xhrId in this.pendingRequests)) {\n      // The XHR request might have been aborted in onHeadersReceived()\n      // callback, in which case we should abort request.\n      return;\n    }\n\n    delete this.pendingRequests[xhrId];\n\n    // Success status == 0 can be on ftp, file and other protocols.\n    if (xhr.status === 0 && this.isHttp) {\n      pendingRequest.onError(xhr.status);\n      return;\n    }\n    const xhrStatus = xhr.status || OK_RESPONSE;\n\n    // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:\n    // \"A server MAY ignore the Range header\". This means it's possible to\n    // get a 200 rather than a 206 response from a range request.\n    const ok_response_on_range_request =\n      xhrStatus === OK_RESPONSE &&\n      pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;\n\n    if (\n      !ok_response_on_range_request &&\n      xhrStatus !== pendingRequest.expectedStatus\n    ) {\n      pendingRequest.onError(xhr.status);\n      return;\n    }\n\n    const chunk = getArrayBuffer(xhr);\n    if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n      const rangeHeader = xhr.getResponseHeader(\"Content-Range\");\n      const matches = /bytes (\\d+)-(\\d+)\\/(\\d+)/.exec(rangeHeader);\n      if (matches) {\n        pendingRequest.onDone({\n          begin: parseInt(matches[1], 10),\n          chunk,\n        });\n      } else {\n        warn(`Missing or invalid \"Content-Range\" header.`);\n        pendingRequest.onError(0);\n      }\n    } else if (chunk) {\n      pendingRequest.onDone({\n        begin: 0,\n        chunk,\n      });\n    } else {\n      pendingRequest.onError(xhr.status);\n    }\n  }\n\n  getRequestXhr(xhrId) {\n    return this.pendingRequests[xhrId].xhr;\n  }\n\n  isPendingRequest(xhrId) {\n    return xhrId in this.pendingRequests;\n  }\n\n  abortRequest(xhrId) {\n    const xhr = this.pendingRequests[xhrId].xhr;\n    delete this.pendingRequests[xhrId];\n    xhr.abort();\n  }\n}\n\n/** @implements {IPDFStream} */\nclass PDFNetworkStream {\n  constructor(source) {\n    this._source = source;\n    this._manager = new NetworkManager(source);\n    this._rangeChunkSize = source.rangeChunkSize;\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n\n  _onRangeRequestReaderClosed(reader) {\n    const i = this._rangeRequestReaders.indexOf(reader);\n    if (i >= 0) {\n      this._rangeRequestReaders.splice(i, 1);\n    }\n  }\n\n  getFullReader() {\n    assert(\n      !this._fullRequestReader,\n      \"PDFNetworkStream.getFullReader can only be called once.\"\n    );\n    this._fullRequestReader = new PDFNetworkStreamFullRequestReader(\n      this._manager,\n      this._source\n    );\n    return this._fullRequestReader;\n  }\n\n  getRangeReader(begin, end) {\n    const reader = new PDFNetworkStreamRangeRequestReader(\n      this._manager,\n      begin,\n      end\n    );\n    reader.onClosed = this._onRangeRequestReaderClosed.bind(this);\n    this._rangeRequestReaders.push(reader);\n    return reader;\n  }\n\n  cancelAllRequests(reason) {\n    this._fullRequestReader?.cancel(reason);\n\n    for (const reader of this._rangeRequestReaders.slice(0)) {\n      reader.cancel(reason);\n    }\n  }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFNetworkStreamFullRequestReader {\n  constructor(manager, source) {\n    this._manager = manager;\n\n    this._url = source.url;\n    this._fullRequestId = manager.request({\n      onHeadersReceived: this._onHeadersReceived.bind(this),\n      onDone: this._onDone.bind(this),\n      onError: this._onError.bind(this),\n      onProgress: this._onProgress.bind(this),\n    });\n    this._headersCapability = Promise.withResolvers();\n    this._disableRange = source.disableRange || false;\n    this._contentLength = source.length; // Optional\n    this._rangeChunkSize = source.rangeChunkSize;\n    if (!this._rangeChunkSize && !this._disableRange) {\n      this._disableRange = true;\n    }\n\n    this._isStreamingSupported = false;\n    this._isRangeSupported = false;\n\n    this._cachedChunks = [];\n    this._requests = [];\n    this._done = false;\n    this._storedError = undefined;\n    this._filename = null;\n\n    this.onProgress = null;\n  }\n\n  _onHeadersReceived() {\n    const fullRequestXhrId = this._fullRequestId;\n    const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);\n\n    this._manager._responseOrigin = getResponseOrigin(\n      fullRequestXhr.responseURL\n    );\n\n    const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders();\n    const responseHeaders = new Headers(\n      rawResponseHeaders\n        ? rawResponseHeaders\n            .trimStart()\n            .replace(/[^\\S ]+$/, \"\") // Not `trimEnd`, to keep regular spaces.\n            .split(/[\\r\\n]+/)\n            .map(x => {\n              const [key, ...val] = x.split(\": \");\n              return [key, val.join(\": \")];\n            })\n        : []\n    );\n\n    const { allowRangeRequests, suggestedLength } =\n      validateRangeRequestCapabilities({\n        responseHeaders,\n        isHttp: this._manager.isHttp,\n        rangeChunkSize: this._rangeChunkSize,\n        disableRange: this._disableRange,\n      });\n\n    if (allowRangeRequests) {\n      this._isRangeSupported = true;\n    }\n    // Setting right content length.\n    this._contentLength = suggestedLength || this._contentLength;\n\n    this._filename = extractFilenameFromHeader(responseHeaders);\n\n    if (this._isRangeSupported) {\n      // NOTE: by cancelling the full request, and then issuing range\n      // requests, there will be an issue for sites where you can only\n      // request the pdf once. However, if this is the case, then the\n      // server should not be returning that it can support range requests.\n      this._manager.abortRequest(fullRequestXhrId);\n    }\n\n    this._headersCapability.resolve();\n  }\n\n  _onDone(data) {\n    if (data) {\n      if (this._requests.length > 0) {\n        const requestCapability = this._requests.shift();\n        requestCapability.resolve({ value: data.chunk, done: false });\n      } else {\n        this._cachedChunks.push(data.chunk);\n      }\n    }\n    this._done = true;\n    if (this._cachedChunks.length > 0) {\n      return;\n    }\n    for (const requestCapability of this._requests) {\n      requestCapability.resolve({ value: undefined, done: true });\n    }\n    this._requests.length = 0;\n  }\n\n  _onError(status) {\n    this._storedError = createResponseStatusError(status, this._url);\n    this._headersCapability.reject(this._storedError);\n    for (const requestCapability of this._requests) {\n      requestCapability.reject(this._storedError);\n    }\n    this._requests.length = 0;\n    this._cachedChunks.length = 0;\n  }\n\n  _onProgress(evt) {\n    this.onProgress?.({\n      loaded: evt.loaded,\n      total: evt.lengthComputable ? evt.total : this._contentLength,\n    });\n  }\n\n  get filename() {\n    return this._filename;\n  }\n\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  get headersReady() {\n    return this._headersCapability.promise;\n  }\n\n  async read() {\n    await this._headersCapability.promise;\n\n    if (this._storedError) {\n      throw this._storedError;\n    }\n    if (this._cachedChunks.length > 0) {\n      const chunk = this._cachedChunks.shift();\n      return { value: chunk, done: false };\n    }\n    if (this._done) {\n      return { value: undefined, done: true };\n    }\n    const requestCapability = Promise.withResolvers();\n    this._requests.push(requestCapability);\n    return requestCapability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n    this._headersCapability.reject(reason);\n    for (const requestCapability of this._requests) {\n      requestCapability.resolve({ value: undefined, done: true });\n    }\n    this._requests.length = 0;\n    if (this._manager.isPendingRequest(this._fullRequestId)) {\n      this._manager.abortRequest(this._fullRequestId);\n    }\n    this._fullRequestReader = null;\n  }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFNetworkStreamRangeRequestReader {\n  constructor(manager, begin, end) {\n    this._manager = manager;\n\n    this._url = manager.url;\n    this._requestId = manager.request({\n      begin,\n      end,\n      onHeadersReceived: this._onHeadersReceived.bind(this),\n      onDone: this._onDone.bind(this),\n      onError: this._onError.bind(this),\n      onProgress: this._onProgress.bind(this),\n    });\n    this._requests = [];\n    this._queuedChunk = null;\n    this._done = false;\n    this._storedError = undefined;\n\n    this.onProgress = null;\n    this.onClosed = null;\n  }\n\n  _onHeadersReceived() {\n    const responseOrigin = getResponseOrigin(\n      this._manager.getRequestXhr(this._requestId)?.responseURL\n    );\n\n    if (responseOrigin !== this._manager._responseOrigin) {\n      this._storedError = new Error(\n        `Expected range response-origin \"${responseOrigin}\" to match \"${this._manager._responseOrigin}\".`\n      );\n      this._onError(0);\n    }\n  }\n\n  _close() {\n    this.onClosed?.(this);\n  }\n\n  _onDone(data) {\n    const chunk = data.chunk;\n    if (this._requests.length > 0) {\n      const requestCapability = this._requests.shift();\n      requestCapability.resolve({ value: chunk, done: false });\n    } else {\n      this._queuedChunk = chunk;\n    }\n    this._done = true;\n    for (const requestCapability of this._requests) {\n      requestCapability.resolve({ value: undefined, done: true });\n    }\n    this._requests.length = 0;\n    this._close();\n  }\n\n  _onError(status) {\n    this._storedError ??= createResponseStatusError(status, this._url);\n    for (const requestCapability of this._requests) {\n      requestCapability.reject(this._storedError);\n    }\n    this._requests.length = 0;\n    this._queuedChunk = null;\n  }\n\n  _onProgress(evt) {\n    if (!this.isStreamingSupported) {\n      this.onProgress?.({ loaded: evt.loaded });\n    }\n  }\n\n  get isStreamingSupported() {\n    return false;\n  }\n\n  async read() {\n    if (this._storedError) {\n      throw this._storedError;\n    }\n    if (this._queuedChunk !== null) {\n      const chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return { value: chunk, done: false };\n    }\n    if (this._done) {\n      return { value: undefined, done: true };\n    }\n    const requestCapability = Promise.withResolvers();\n    this._requests.push(requestCapability);\n    return requestCapability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n    for (const requestCapability of this._requests) {\n      requestCapability.resolve({ value: undefined, done: true });\n    }\n    this._requests.length = 0;\n    if (this._manager.isPendingRequest(this._requestId)) {\n      this._manager.abortRequest(this._requestId);\n    }\n    this._close();\n  }\n}\n\nexport { PDFNetworkStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\nimport { AbortException, assert, MissingPDFException } from \"../shared/util.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n  throw new Error(\n    'Module \"./node_stream.js\" shall not be used with MOZCENTRAL builds.'\n  );\n}\n\nconst urlRegex = /^[a-z][a-z0-9\\-+.]+:/i;\n\nfunction parseUrlOrPath(sourceUrl) {\n  if (urlRegex.test(sourceUrl)) {\n    return new URL(sourceUrl);\n  }\n  const url = process.getBuiltinModule(\"url\");\n  return new URL(url.pathToFileURL(sourceUrl));\n}\n\nclass PDFNodeStream {\n  constructor(source) {\n    this.source = source;\n    this.url = parseUrlOrPath(source.url);\n    assert(\n      this.url.protocol === \"file:\",\n      \"PDFNodeStream only supports file:// URLs.\"\n    );\n\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n\n  get _progressiveDataLength() {\n    return this._fullRequestReader?._loaded ?? 0;\n  }\n\n  getFullReader() {\n    assert(\n      !this._fullRequestReader,\n      \"PDFNodeStream.getFullReader can only be called once.\"\n    );\n    this._fullRequestReader = new PDFNodeStreamFsFullReader(this);\n    return this._fullRequestReader;\n  }\n\n  getRangeReader(start, end) {\n    if (end <= this._progressiveDataLength) {\n      return null;\n    }\n    const rangeReader = new PDFNodeStreamFsRangeReader(this, start, end);\n    this._rangeRequestReaders.push(rangeReader);\n    return rangeReader;\n  }\n\n  cancelAllRequests(reason) {\n    this._fullRequestReader?.cancel(reason);\n\n    for (const reader of this._rangeRequestReaders.slice(0)) {\n      reader.cancel(reason);\n    }\n  }\n}\n\nclass PDFNodeStreamFsFullReader {\n  constructor(stream) {\n    this._url = stream.url;\n    this._done = false;\n    this._storedError = null;\n    this.onProgress = null;\n    const source = stream.source;\n    this._contentLength = source.length; // optional\n    this._loaded = 0;\n    this._filename = null;\n\n    this._disableRange = source.disableRange || false;\n    this._rangeChunkSize = source.rangeChunkSize;\n    if (!this._rangeChunkSize && !this._disableRange) {\n      this._disableRange = true;\n    }\n\n    this._isStreamingSupported = !source.disableStream;\n    this._isRangeSupported = !source.disableRange;\n\n    this._readableStream = null;\n    this._readCapability = Promise.withResolvers();\n    this._headersCapability = Promise.withResolvers();\n\n    const fs = process.getBuiltinModule(\"fs\");\n    fs.promises.lstat(this._url).then(\n      stat => {\n        // Setting right content length.\n        this._contentLength = stat.size;\n\n        this._setReadableStream(fs.createReadStream(this._url));\n        this._headersCapability.resolve();\n      },\n      error => {\n        if (error.code === \"ENOENT\") {\n          error = new MissingPDFException(`Missing PDF \"${this._url}\".`);\n        }\n        this._storedError = error;\n        this._headersCapability.reject(error);\n      }\n    );\n  }\n\n  get headersReady() {\n    return this._headersCapability.promise;\n  }\n\n  get filename() {\n    return this._filename;\n  }\n\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._readCapability.promise;\n    if (this._done) {\n      return { value: undefined, done: true };\n    }\n    if (this._storedError) {\n      throw this._storedError;\n    }\n\n    const chunk = this._readableStream.read();\n    if (chunk === null) {\n      this._readCapability = Promise.withResolvers();\n      return this.read();\n    }\n    this._loaded += chunk.length;\n    this.onProgress?.({\n      loaded: this._loaded,\n      total: this._contentLength,\n    });\n\n    // Ensure that `read()` method returns ArrayBuffer.\n    const buffer = new Uint8Array(chunk).buffer;\n    return { value: buffer, done: false };\n  }\n\n  cancel(reason) {\n    // Call `this._error()` method when cancel is called\n    // before _readableStream is set.\n    if (!this._readableStream) {\n      this._error(reason);\n      return;\n    }\n    this._readableStream.destroy(reason);\n  }\n\n  _error(reason) {\n    this._storedError = reason;\n    this._readCapability.resolve();\n  }\n\n  _setReadableStream(readableStream) {\n    this._readableStream = readableStream;\n    readableStream.on(\"readable\", () => {\n      this._readCapability.resolve();\n    });\n\n    readableStream.on(\"end\", () => {\n      // Destroy readable to minimize resource usage.\n      readableStream.destroy();\n      this._done = true;\n      this._readCapability.resolve();\n    });\n\n    readableStream.on(\"error\", reason => {\n      this._error(reason);\n    });\n\n    // We need to stop reading when range is supported and streaming is\n    // disabled.\n    if (!this._isStreamingSupported && this._isRangeSupported) {\n      this._error(new AbortException(\"streaming is disabled\"));\n    }\n\n    // Destroy ReadableStream if already in errored state.\n    if (this._storedError) {\n      this._readableStream.destroy(this._storedError);\n    }\n  }\n}\n\nclass PDFNodeStreamFsRangeReader {\n  constructor(stream, start, end) {\n    this._url = stream.url;\n    this._done = false;\n    this._storedError = null;\n    this.onProgress = null;\n    this._loaded = 0;\n    this._readableStream = null;\n    this._readCapability = Promise.withResolvers();\n    const source = stream.source;\n    this._isStreamingSupported = !source.disableStream;\n\n    const fs = process.getBuiltinModule(\"fs\");\n    this._setReadableStream(\n      fs.createReadStream(this._url, { start, end: end - 1 })\n    );\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._readCapability.promise;\n    if (this._done) {\n      return { value: undefined, done: true };\n    }\n    if (this._storedError) {\n      throw this._storedError;\n    }\n\n    const chunk = this._readableStream.read();\n    if (chunk === null) {\n      this._readCapability = Promise.withResolvers();\n      return this.read();\n    }\n    this._loaded += chunk.length;\n    this.onProgress?.({ loaded: this._loaded });\n\n    // Ensure that `read()` method returns ArrayBuffer.\n    const buffer = new Uint8Array(chunk).buffer;\n    return { value: buffer, done: false };\n  }\n\n  cancel(reason) {\n    // Call `this._error()` method when cancel is called\n    // before _readableStream is set.\n    if (!this._readableStream) {\n      this._error(reason);\n      return;\n    }\n    this._readableStream.destroy(reason);\n  }\n\n  _error(reason) {\n    this._storedError = reason;\n    this._readCapability.resolve();\n  }\n\n  _setReadableStream(readableStream) {\n    this._readableStream = readableStream;\n    readableStream.on(\"readable\", () => {\n      this._readCapability.resolve();\n    });\n\n    readableStream.on(\"end\", () => {\n      // Destroy readableStream to minimize resource usage.\n      readableStream.destroy();\n      this._done = true;\n      this._readCapability.resolve();\n    });\n\n    readableStream.on(\"error\", reason => {\n      this._error(reason);\n    });\n\n    // Destroy readableStream if already in errored state.\n    if (this._storedError) {\n      this._readableStream.destroy(this._storedError);\n    }\n  }\n}\n\nexport { PDFNodeStream };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./display_utils\").PageViewport} PageViewport */\n/** @typedef {import(\"./api\").TextContent} TextContent */\n\nimport {\n  AbortException,\n  FeatureTest,\n  shadow,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport { setLayerDimensions } from \"./display_utils.js\";\n\n/**\n * @typedef {Object} TextLayerParameters\n * @property {ReadableStream | TextContent} textContentSource - Text content to\n *   render, i.e. the value returned by the page's `streamTextContent` or\n *   `getTextContent` method.\n * @property {HTMLElement} container - The DOM node that will contain the text\n *   runs.\n * @property {PageViewport} viewport - The target viewport to properly layout\n *   the text runs.\n */\n\n/**\n * @typedef {Object} TextLayerUpdateParameters\n * @property {PageViewport} viewport - The target viewport to properly layout\n *   the text runs.\n * @property {function} [onBefore] - Callback invoked before the textLayer is\n *   updated in the DOM.\n */\n\nconst MAX_TEXT_DIVS_TO_RENDER = 100000;\nconst DEFAULT_FONT_SIZE = 30;\nconst DEFAULT_FONT_ASCENT = 0.8;\n\nclass TextLayer {\n  #capability = Promise.withResolvers();\n\n  #container = null;\n\n  #disableProcessItems = false;\n\n  #fontInspectorEnabled = !!globalThis.FontInspector?.enabled;\n\n  #lang = null;\n\n  #layoutTextParams = null;\n\n  #pageHeight = 0;\n\n  #pageWidth = 0;\n\n  #reader = null;\n\n  #rootContainer = null;\n\n  #rotation = 0;\n\n  #scale = 0;\n\n  #styleCache = Object.create(null);\n\n  #textContentItemsStr = [];\n\n  #textContentSource = null;\n\n  #textDivs = [];\n\n  #textDivProperties = new WeakMap();\n\n  #transform = null;\n\n  static #ascentCache = new Map();\n\n  static #canvasContexts = new Map();\n\n  static #canvasCtxFonts = new WeakMap();\n\n  static #minFontSize = null;\n\n  static #pendingTextLayers = new Set();\n\n  /**\n   * @param {TextLayerParameters} options\n   */\n  constructor({ textContentSource, container, viewport }) {\n    if (textContentSource instanceof ReadableStream) {\n      this.#textContentSource = textContentSource;\n    } else if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      typeof textContentSource === \"object\"\n    ) {\n      this.#textContentSource = new ReadableStream({\n        start(controller) {\n          controller.enqueue(textContentSource);\n          controller.close();\n        },\n      });\n    } else {\n      throw new Error('No \"textContentSource\" parameter specified.');\n    }\n    this.#container = this.#rootContainer = container;\n\n    this.#scale = viewport.scale * (globalThis.devicePixelRatio || 1);\n    this.#rotation = viewport.rotation;\n    this.#layoutTextParams = {\n      div: null,\n      properties: null,\n      ctx: null,\n    };\n    const { pageWidth, pageHeight, pageX, pageY } = viewport.rawDims;\n    this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight];\n    this.#pageWidth = pageWidth;\n    this.#pageHeight = pageHeight;\n\n    TextLayer.#ensureMinFontSizeComputed();\n\n    setLayerDimensions(container, viewport);\n\n    // Always clean-up the temporary canvas once rendering is no longer pending.\n    this.#capability.promise\n      .finally(() => {\n        TextLayer.#pendingTextLayers.delete(this);\n        this.#layoutTextParams = null;\n        this.#styleCache = null;\n      })\n      .catch(() => {\n        // Avoid \"Uncaught promise\" messages in the console.\n      });\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"pageWidth\", {\n        get() {\n          return this.#pageWidth;\n        },\n      });\n      Object.defineProperty(this, \"pageHeight\", {\n        get() {\n          return this.#pageHeight;\n        },\n      });\n    }\n  }\n\n  static get fontFamilyMap() {\n    const { isWindows, isFirefox } = FeatureTest.platform;\n    return shadow(\n      this,\n      \"fontFamilyMap\",\n      new Map([\n        [\n          \"sans-serif\",\n          `${isWindows && isFirefox ? \"Calibri, \" : \"\"}sans-serif`,\n        ],\n        [\n          \"monospace\",\n          `${isWindows && isFirefox ? \"Lucida Console, \" : \"\"}monospace`,\n        ],\n      ])\n    );\n  }\n\n  /**\n   * Render the textLayer.\n   * @returns {Promise}\n   */\n  render() {\n    const pump = () => {\n      this.#reader.read().then(({ value, done }) => {\n        if (done) {\n          this.#capability.resolve();\n          return;\n        }\n        this.#lang ??= value.lang;\n        Object.assign(this.#styleCache, value.styles);\n        this.#processItems(value.items);\n        pump();\n      }, this.#capability.reject);\n    };\n    this.#reader = this.#textContentSource.getReader();\n    TextLayer.#pendingTextLayers.add(this);\n    pump();\n\n    return this.#capability.promise;\n  }\n\n  /**\n   * Update a previously rendered textLayer, if necessary.\n   * @param {TextLayerUpdateParameters} options\n   * @returns {undefined}\n   */\n  update({ viewport, onBefore = null }) {\n    const scale = viewport.scale * (globalThis.devicePixelRatio || 1);\n    const rotation = viewport.rotation;\n\n    if (rotation !== this.#rotation) {\n      onBefore?.();\n      this.#rotation = rotation;\n      setLayerDimensions(this.#rootContainer, { rotation });\n    }\n\n    if (scale !== this.#scale) {\n      onBefore?.();\n      this.#scale = scale;\n      const params = {\n        div: null,\n        properties: null,\n        ctx: TextLayer.#getCtx(this.#lang),\n      };\n      for (const div of this.#textDivs) {\n        params.properties = this.#textDivProperties.get(div);\n        params.div = div;\n        this.#layout(params);\n      }\n    }\n  }\n\n  /**\n   * Cancel rendering of the textLayer.\n   * @returns {undefined}\n   */\n  cancel() {\n    const abortEx = new AbortException(\"TextLayer task cancelled.\");\n\n    this.#reader?.cancel(abortEx).catch(() => {\n      // Avoid \"Uncaught promise\" messages in the console.\n    });\n    this.#reader = null;\n\n    this.#capability.reject(abortEx);\n  }\n\n  /**\n   * @type {Array<HTMLElement>} HTML elements that correspond to the text items\n   *   of the textContent input.\n   *   This is output and will initially be set to an empty array.\n   */\n  get textDivs() {\n    return this.#textDivs;\n  }\n\n  /**\n   * @type {Array<string>} Strings that correspond to the `str` property of\n   *   the text items of the textContent input.\n   *   This is output and will initially be set to an empty array\n   */\n  get textContentItemsStr() {\n    return this.#textContentItemsStr;\n  }\n\n  #processItems(items) {\n    if (this.#disableProcessItems) {\n      return;\n    }\n    this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang);\n\n    const textDivs = this.#textDivs,\n      textContentItemsStr = this.#textContentItemsStr;\n\n    for (const item of items) {\n      // No point in rendering many divs as it would make the browser\n      // unusable even after the divs are rendered.\n      if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) {\n        warn(\"Ignoring additional textDivs for performance reasons.\");\n\n        this.#disableProcessItems = true; // Avoid multiple warnings for one page.\n        return;\n      }\n\n      if (item.str === undefined) {\n        if (\n          item.type === \"beginMarkedContentProps\" ||\n          item.type === \"beginMarkedContent\"\n        ) {\n          const parent = this.#container;\n          this.#container = document.createElement(\"span\");\n          this.#container.classList.add(\"markedContent\");\n          if (item.id !== null) {\n            this.#container.setAttribute(\"id\", `${item.id}`);\n          }\n          parent.append(this.#container);\n        } else if (item.type === \"endMarkedContent\") {\n          this.#container = this.#container.parentNode;\n        }\n        continue;\n      }\n      textContentItemsStr.push(item.str);\n      this.#appendText(item);\n    }\n  }\n\n  #appendText(geom) {\n    // Initialize all used properties to keep the caches monomorphic.\n    const textDiv = document.createElement(\"span\");\n    const textDivProperties = {\n      angle: 0,\n      canvasWidth: 0,\n      hasText: geom.str !== \"\",\n      hasEOL: geom.hasEOL,\n      fontSize: 0,\n    };\n    this.#textDivs.push(textDiv);\n\n    const tx = Util.transform(this.#transform, geom.transform);\n    let angle = Math.atan2(tx[1], tx[0]);\n    const style = this.#styleCache[geom.fontName];\n    if (style.vertical) {\n      angle += Math.PI / 2;\n    }\n\n    let fontFamily =\n      (this.#fontInspectorEnabled && style.fontSubstitution) ||\n      style.fontFamily;\n\n    // Workaround for bug 1922063.\n    fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily;\n    const fontHeight = Math.hypot(tx[2], tx[3]);\n    const fontAscent =\n      fontHeight * TextLayer.#getAscent(fontFamily, this.#lang);\n\n    let left, top;\n    if (angle === 0) {\n      left = tx[4];\n      top = tx[5] - fontAscent;\n    } else {\n      left = tx[4] + fontAscent * Math.sin(angle);\n      top = tx[5] - fontAscent * Math.cos(angle);\n    }\n\n    const scaleFactorStr = \"calc(var(--scale-factor)*\";\n    const divStyle = textDiv.style;\n    // Setting the style properties individually, rather than all at once,\n    // should be OK since the `textDiv` isn't appended to the document yet.\n    if (this.#container === this.#rootContainer) {\n      divStyle.left = `${((100 * left) / this.#pageWidth).toFixed(2)}%`;\n      divStyle.top = `${((100 * top) / this.#pageHeight).toFixed(2)}%`;\n    } else {\n      // We're in a marked content span, hence we can't use percents.\n      divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`;\n      divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`;\n    }\n    // We multiply the font size by #minFontSize, and then #layout will\n    // scale the element by 1/#minFontSize. This allows us to effectively\n    // ignore the minimum font size enforced by the browser, so that the text\n    // layer <span>s can always match the size of the text in the canvas.\n    divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`;\n    divStyle.fontFamily = fontFamily;\n\n    textDivProperties.fontSize = fontHeight;\n\n    // Keeps screen readers from pausing on every new text span.\n    textDiv.setAttribute(\"role\", \"presentation\");\n\n    textDiv.textContent = geom.str;\n    // geom.dir may be 'ttb' for vertical texts.\n    textDiv.dir = geom.dir;\n\n    // `fontName` is only used by the FontInspector, and we only use `dataset`\n    // here to make the font name available in the debugger.\n    if (this.#fontInspectorEnabled) {\n      textDiv.dataset.fontName =\n        style.fontSubstitutionLoadedName || geom.fontName;\n    }\n    if (angle !== 0) {\n      textDivProperties.angle = angle * (180 / Math.PI);\n    }\n    // We don't bother scaling single-char text divs, because it has very\n    // little effect on text highlighting. This makes scrolling on docs with\n    // lots of such divs a lot faster.\n    let shouldScaleText = false;\n    if (geom.str.length > 1) {\n      shouldScaleText = true;\n    } else if (geom.str !== \" \" && geom.transform[0] !== geom.transform[3]) {\n      const absScaleX = Math.abs(geom.transform[0]),\n        absScaleY = Math.abs(geom.transform[3]);\n      // When the horizontal/vertical scaling differs significantly, also scale\n      // even single-char text to improve highlighting (fixes issue11713.pdf).\n      if (\n        absScaleX !== absScaleY &&\n        Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5\n      ) {\n        shouldScaleText = true;\n      }\n    }\n    if (shouldScaleText) {\n      textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width;\n    }\n    this.#textDivProperties.set(textDiv, textDivProperties);\n\n    // Finally, layout and append the text to the DOM.\n    this.#layoutTextParams.div = textDiv;\n    this.#layoutTextParams.properties = textDivProperties;\n    this.#layout(this.#layoutTextParams);\n\n    if (textDivProperties.hasText) {\n      this.#container.append(textDiv);\n    }\n    if (textDivProperties.hasEOL) {\n      const br = document.createElement(\"br\");\n      br.setAttribute(\"role\", \"presentation\");\n      this.#container.append(br);\n    }\n  }\n\n  #layout(params) {\n    const { div, properties, ctx } = params;\n    const { style } = div;\n\n    let transform = \"\";\n    if (TextLayer.#minFontSize > 1) {\n      transform = `scale(${1 / TextLayer.#minFontSize})`;\n    }\n\n    if (properties.canvasWidth !== 0 && properties.hasText) {\n      const { fontFamily } = style;\n      const { canvasWidth, fontSize } = properties;\n\n      TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily);\n      // Only measure the width for multi-char text divs, see `appendText`.\n      const { width } = ctx.measureText(div.textContent);\n\n      if (width > 0) {\n        transform = `scaleX(${(canvasWidth * this.#scale) / width}) ${transform}`;\n      }\n    }\n    if (properties.angle !== 0) {\n      transform = `rotate(${properties.angle}deg) ${transform}`;\n    }\n    if (transform.length > 0) {\n      style.transform = transform;\n    }\n  }\n\n  /**\n   * Clean-up global textLayer data.\n   * @returns {undefined}\n   */\n  static cleanup() {\n    if (this.#pendingTextLayers.size > 0) {\n      return;\n    }\n    this.#ascentCache.clear();\n\n    for (const { canvas } of this.#canvasContexts.values()) {\n      canvas.remove();\n    }\n    this.#canvasContexts.clear();\n  }\n\n  static #getCtx(lang = null) {\n    let ctx = this.#canvasContexts.get((lang ||= \"\"));\n    if (!ctx) {\n      // We don't use an OffscreenCanvas here because we use serif/sans serif\n      // fonts with it and they depends on the locale.\n      // In Firefox, the <html> element get a lang attribute that depends on\n      // what Fluent returns for the locale and the OffscreenCanvas uses\n      // the OS locale.\n      // Those two locales can be different and consequently the used fonts will\n      // be different (see bug 1869001).\n      // Ideally, we should use in the text layer the fonts we've in the pdf (or\n      // their replacements when they aren't embedded) and then we can use an\n      // OffscreenCanvas.\n      const canvas = document.createElement(\"canvas\");\n      canvas.className = \"hiddenCanvasElement\";\n      canvas.lang = lang;\n      document.body.append(canvas);\n      ctx = canvas.getContext(\"2d\", {\n        alpha: false,\n        willReadFrequently: true,\n      });\n      this.#canvasContexts.set(lang, ctx);\n\n      // Also, initialize state for the `#ensureCtxFont` method.\n      this.#canvasCtxFonts.set(ctx, { size: 0, family: \"\" });\n    }\n    return ctx;\n  }\n\n  static #ensureCtxFont(ctx, size, family) {\n    const cached = this.#canvasCtxFonts.get(ctx);\n    if (size === cached.size && family === cached.family) {\n      return; // The font is already set.\n    }\n    ctx.font = `${size}px ${family}`;\n    cached.size = size;\n    cached.family = family;\n  }\n\n  /**\n   * Compute the minimum font size enforced by the browser.\n   */\n  static #ensureMinFontSizeComputed() {\n    if (this.#minFontSize !== null) {\n      return;\n    }\n    const div = document.createElement(\"div\");\n    div.style.opacity = 0;\n    div.style.lineHeight = 1;\n    div.style.fontSize = \"1px\";\n    div.style.position = \"absolute\";\n    div.textContent = \"X\";\n    document.body.append(div);\n    // In `display:block` elements contain a single line of text,\n    // the height matches the line height (which, when set to 1,\n    // matches the actual font size).\n    this.#minFontSize = div.getBoundingClientRect().height;\n    div.remove();\n  }\n\n  static #getAscent(fontFamily, lang) {\n    const cachedAscent = this.#ascentCache.get(fontFamily);\n    if (cachedAscent) {\n      return cachedAscent;\n    }\n    const ctx = this.#getCtx(lang);\n\n    ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE;\n    this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily);\n    const metrics = ctx.measureText(\"\");\n\n    // Both properties aren't available by default in Firefox.\n    let ascent = metrics.fontBoundingBoxAscent;\n    let descent = Math.abs(metrics.fontBoundingBoxDescent);\n    if (ascent) {\n      const ratio = ascent / (ascent + descent);\n      this.#ascentCache.set(fontFamily, ratio);\n\n      ctx.canvas.width = ctx.canvas.height = 0;\n      return ratio;\n    }\n\n    // Try basic heuristic to guess ascent/descent.\n    // Draw a g with baseline at 0,0 and then get the line\n    // number where a pixel has non-null red component (starting\n    // from bottom).\n    ctx.strokeStyle = \"red\";\n    ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);\n    ctx.strokeText(\"g\", 0, 0);\n    let pixels = ctx.getImageData(\n      0,\n      0,\n      DEFAULT_FONT_SIZE,\n      DEFAULT_FONT_SIZE\n    ).data;\n    descent = 0;\n    for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) {\n      if (pixels[i] > 0) {\n        descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE);\n        break;\n      }\n    }\n\n    // Draw an A with baseline at 0,DEFAULT_FONT_SIZE and then get the line\n    // number where a pixel has non-null red component (starting\n    // from top).\n    ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);\n    ctx.strokeText(\"A\", 0, DEFAULT_FONT_SIZE);\n    pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data;\n    ascent = 0;\n    for (let i = 0, ii = pixels.length; i < ii; i += 4) {\n      if (pixels[i] > 0) {\n        ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE);\n        break;\n      }\n    }\n\n    ctx.canvas.width = ctx.canvas.height = 0;\n\n    const ratio = ascent ? ascent / (ascent + descent) : DEFAULT_FONT_ASCENT;\n    this.#ascentCache.set(fontFamily, ratio);\n    return ratio;\n  }\n}\n\nexport { TextLayer };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./api\").TextContent} TextContent */\n\nclass XfaText {\n  /**\n   * Walk an XFA tree and create an array of text nodes that is compatible\n   * with a regular PDFs TextContent. Currently, only TextItem.str is supported,\n   * all other fields and styles haven't been implemented.\n   *\n   * @param {Object} xfa - An XFA fake DOM object.\n   *\n   * @returns {TextContent}\n   */\n  static textContent(xfa) {\n    const items = [];\n    const output = {\n      items,\n      styles: Object.create(null),\n    };\n    function walk(node) {\n      if (!node) {\n        return;\n      }\n      let str = null;\n      const name = node.name;\n      if (name === \"#text\") {\n        str = node.value;\n      } else if (!XfaText.shouldBuildText(name)) {\n        return;\n      } else if (node?.attributes?.textContent) {\n        str = node.attributes.textContent;\n      } else if (node.value) {\n        str = node.value;\n      }\n      if (str !== null) {\n        items.push({\n          str,\n        });\n      }\n      if (!node.children) {\n        return;\n      }\n      for (const child of node.children) {\n        walk(child);\n      }\n    }\n    walk(xfa);\n    return output;\n  }\n\n  /**\n   * @param {string} name - DOM node name. (lower case)\n   *\n   * @returns {boolean} true if the DOM node should have a corresponding text\n   * node.\n   */\n  static shouldBuildText(name) {\n    return !(\n      name === \"textarea\" ||\n      name === \"input\" ||\n      name === \"option\" ||\n      name === \"select\"\n    );\n  }\n}\n\nexport { XfaText };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @module pdfjsLib\n */\n\nimport {\n  AbortException,\n  AnnotationMode,\n  assert,\n  FeatureTest,\n  getVerbosityLevel,\n  info,\n  isNodeJS,\n  MAX_IMAGE_SIZE_TO_CACHE,\n  RenderingIntentFlag,\n  setVerbosityLevel,\n  shadow,\n  stringToBytes,\n  unreachable,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  AnnotationStorage,\n  PrintAnnotationStorage,\n  SerializableEmpty,\n} from \"./annotation_storage.js\";\nimport { FontFaceObject, FontLoader } from \"./font_loader.js\";\nimport {\n  isDataScheme,\n  isValidFetchUrl,\n  PageViewport,\n  RenderingCancelledException,\n  StatTimer,\n} from \"./display_utils.js\";\nimport { MessageHandler, wrapReason } from \"../shared/message_handler.js\";\nimport {\n  NodeCanvasFactory,\n  NodeCMapReaderFactory,\n  NodeFilterFactory,\n  NodeStandardFontDataFactory,\n} from \"display-node_utils\";\nimport { CanvasGraphics } from \"./canvas.js\";\nimport { DOMCanvasFactory } from \"./canvas_factory.js\";\nimport { DOMCMapReaderFactory } from \"display-cmap_reader_factory\";\nimport { DOMFilterFactory } from \"./filter_factory.js\";\nimport { DOMStandardFontDataFactory } from \"display-standard_fontdata_factory\";\nimport { GlobalWorkerOptions } from \"./worker_options.js\";\nimport { Metadata } from \"./metadata.js\";\nimport { OptionalContentConfig } from \"./optional_content_config.js\";\nimport { PDFDataTransportStream } from \"./transport_stream.js\";\nimport { PDFFetchStream } from \"display-fetch_stream\";\nimport { PDFNetworkStream } from \"display-network\";\nimport { PDFNodeStream } from \"display-node_stream\";\nimport { TextLayer } from \"./text_layer.js\";\nimport { XfaText } from \"./xfa_text.js\";\n\nconst DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536\nconst RENDERING_CANCELLED_TIMEOUT = 100; // ms\nconst DELAYED_CLEANUP_TIMEOUT = 5000; // ms\n\nconst DefaultCanvasFactory =\n  typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n    ? NodeCanvasFactory\n    : DOMCanvasFactory;\nconst DefaultCMapReaderFactory =\n  typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n    ? NodeCMapReaderFactory\n    : DOMCMapReaderFactory;\nconst DefaultFilterFactory =\n  typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n    ? NodeFilterFactory\n    : DOMFilterFactory;\nconst DefaultStandardFontDataFactory =\n  typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n    ? NodeStandardFontDataFactory\n    : DOMStandardFontDataFactory;\n\n/**\n * @typedef { Int8Array | Uint8Array | Uint8ClampedArray |\n *            Int16Array | Uint16Array |\n *            Int32Array | Uint32Array | Float32Array |\n *            Float64Array\n * } TypedArray\n */\n\n/**\n * @typedef {Object} RefProxy\n * @property {number} num\n * @property {number} gen\n */\n\n/**\n * Document initialization / loading parameters object.\n *\n * @typedef {Object} DocumentInitParameters\n * @property {string | URL} [url] - The URL of the PDF.\n * @property {TypedArray | ArrayBuffer | Array<number> | string} [data] -\n *   Binary PDF data.\n *   Use TypedArrays (Uint8Array) to improve the memory usage. If PDF data is\n *   BASE64-encoded, use `atob()` to convert it to a binary string first.\n *\n *   NOTE: If TypedArrays are used they will generally be transferred to the\n *   worker-thread. This will help reduce main-thread memory usage, however\n *   it will take ownership of the TypedArrays.\n * @property {Object} [httpHeaders] - Basic authentication headers.\n * @property {boolean} [withCredentials] - Indicates whether or not\n *   cross-site Access-Control requests should be made using credentials such\n *   as cookies or authorization headers. The default is `false`.\n * @property {string} [password] - For decrypting password-protected PDFs.\n * @property {number} [length] - The PDF file length. It's used for progress\n *   reports and range requests operations.\n * @property {PDFDataRangeTransport} [range] - Allows for using a custom range\n *   transport implementation.\n * @property {number} [rangeChunkSize] - Specify maximum number of bytes fetched\n *   per range request. The default value is {@link DEFAULT_RANGE_CHUNK_SIZE}.\n * @property {PDFWorker} [worker] - The worker that will be used for loading and\n *   parsing the PDF data.\n * @property {number} [verbosity] - Controls the logging level; the constants\n *   from {@link VerbosityLevel} should be used.\n * @property {string} [docBaseUrl] - The base URL of the document, used when\n *   attempting to recover valid absolute URLs for annotations, and outline\n *   items, that (incorrectly) only specify relative URLs.\n * @property {string} [cMapUrl] - The URL where the predefined Adobe CMaps are\n *   located. Include the trailing slash.\n * @property {boolean} [cMapPacked] - Specifies if the Adobe CMaps are binary\n *   packed or not. The default value is `true`.\n * @property {Object} [CMapReaderFactory] - The factory that will be used when\n *   reading built-in CMap files. Providing a custom factory is useful for\n *   environments without Fetch API or `XMLHttpRequest` support, such as\n *   Node.js. The default value is {DOMCMapReaderFactory}.\n * @property {boolean} [useSystemFonts] - When `true`, fonts that aren't\n *   embedded in the PDF document will fallback to a system font.\n *   The default value is `true` in web environments and `false` in Node.js;\n *   unless `disableFontFace === true` in which case this defaults to `false`\n *   regardless of the environment (to prevent completely broken fonts).\n * @property {string} [standardFontDataUrl] - The URL where the standard font\n *   files are located. Include the trailing slash.\n * @property {Object} [StandardFontDataFactory] - The factory that will be used\n *   when reading the standard font files. Providing a custom factory is useful\n *   for environments without Fetch API or `XMLHttpRequest` support, such as\n *   Node.js. The default value is {DOMStandardFontDataFactory}.\n * @property {boolean} [useWorkerFetch] - Enable using the Fetch API in the\n *   worker-thread when reading CMap and standard font files. When `true`,\n *   the `CMapReaderFactory` and `StandardFontDataFactory` options are ignored.\n *   The default value is `true` in web environments and `false` in Node.js.\n * @property {boolean} [stopAtErrors] - Reject certain promises, e.g.\n *   `getOperatorList`, `getTextContent`, and `RenderTask`, when the associated\n *   PDF data cannot be successfully parsed, instead of attempting to recover\n *   whatever possible of the data. The default value is `false`.\n * @property {number} [maxImageSize] - The maximum allowed image size in total\n *   pixels, i.e. width * height. Images above this value will not be rendered.\n *   Use -1 for no limit, which is also the default value.\n * @property {boolean} [isEvalSupported] - Determines if we can evaluate strings\n *   as JavaScript. Primarily used to improve performance of PDF functions.\n *   The default value is `true`.\n * @property {boolean} [isOffscreenCanvasSupported] - Determines if we can use\n *   `OffscreenCanvas` in the worker. Primarily used to improve performance of\n *   image conversion/rendering.\n *   The default value is `true` in web environments and `false` in Node.js.\n * @property {boolean} [isImageDecoderSupported] - Determines if we can use\n *   `ImageDecoder` in the worker. Primarily used to improve performance of\n *   image conversion/rendering.\n *   The default value is `true` in web environments and `false` in Node.js.\n *\n *   NOTE: Also temporarily disabled in Chromium browsers, until we no longer\n *   support the affected browser versions, because of various bugs:\n *\n *    - Crashes when using the BMP decoder with huge images, e.g. issue6741.pdf;\n *      see https://issues.chromium.org/issues/374807001\n *\n *    - Broken images when using the JPEG decoder with images that have custom\n *      colour profiles, e.g. GitHub discussion 19030;\n *      see https://issues.chromium.org/issues/378869810\n *\n * @property {number} [canvasMaxAreaInBytes] - The integer value is used to\n *   know when an image must be resized (uses `OffscreenCanvas` in the worker).\n *   If it's -1 then a possibly slow algorithm is used to guess the max value.\n * @property {boolean} [disableFontFace] - By default fonts are converted to\n *   OpenType fonts and loaded via the Font Loading API or `@font-face` rules.\n *   If disabled, fonts will be rendered using a built-in font renderer that\n *   constructs the glyphs with primitive path commands.\n *   The default value is `false` in web environments and `true` in Node.js.\n * @property {boolean} [fontExtraProperties] - Include additional properties,\n *   which are unused during rendering of PDF documents, when exporting the\n *   parsed font data from the worker-thread. This may be useful for debugging\n *   purposes (and backwards compatibility), but note that it will lead to\n *   increased memory usage. The default value is `false`.\n * @property {boolean} [enableXfa] - Render Xfa forms if any.\n *   The default value is `false`.\n * @property {HTMLDocument} [ownerDocument] - Specify an explicit document\n *   context to create elements with and to load resources, such as fonts,\n *   into. Defaults to the current document.\n * @property {boolean} [disableRange] - Disable range request loading of PDF\n *   files. When enabled, and if the server supports partial content requests,\n *   then the PDF will be fetched in chunks. The default value is `false`.\n * @property {boolean} [disableStream] - Disable streaming of PDF file data.\n *   By default PDF.js attempts to load PDF files in chunks. The default value\n *   is `false`.\n * @property {boolean} [disableAutoFetch] - Disable pre-fetching of PDF file\n *   data. When range requests are enabled PDF.js will automatically keep\n *   fetching more data even if it isn't needed to display the current page.\n *   The default value is `false`.\n *\n *   NOTE: It is also necessary to disable streaming, see above, in order for\n *   disabling of pre-fetching to work correctly.\n * @property {boolean} [pdfBug] - Enables special hooks for debugging PDF.js\n *   (see `web/debugger.js`). The default value is `false`.\n * @property {Object} [CanvasFactory] - The factory that will be used when\n *    creating canvases. The default value is {DOMCanvasFactory}.\n * @property {Object} [FilterFactory] - The factory that will be used to\n *    create SVG filters when rendering some images on the main canvas.\n *    The default value is {DOMFilterFactory}.\n * @property {boolean} [enableHWA] - Enables hardware acceleration for\n *   rendering. The default value is `false`.\n */\n\n/**\n * This is the main entry point for loading a PDF and interacting with it.\n *\n * NOTE: If a URL is used to fetch the PDF data a standard Fetch API call (or\n * XHR as fallback) is used, which means it must follow same origin rules,\n * e.g. no cross-domain requests without CORS.\n *\n * @param {string | URL | TypedArray | ArrayBuffer | DocumentInitParameters}\n *   src - Can be a URL where a PDF file is located, a typed array (Uint8Array)\n *         already populated with data, or a parameter object.\n * @returns {PDFDocumentLoadingTask}\n */\nfunction getDocument(src = {}) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n    if (typeof src === \"string\" || src instanceof URL) {\n      src = { url: src };\n    } else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) {\n      src = { data: src };\n    }\n  }\n  const task = new PDFDocumentLoadingTask();\n  const { docId } = task;\n\n  const url = src.url ? getUrlProp(src.url) : null;\n  const data = src.data ? getDataProp(src.data) : null;\n  const httpHeaders = src.httpHeaders || null;\n  const withCredentials = src.withCredentials === true;\n  const password = src.password ?? null;\n  const rangeTransport =\n    src.range instanceof PDFDataRangeTransport ? src.range : null;\n  const rangeChunkSize =\n    Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0\n      ? src.rangeChunkSize\n      : DEFAULT_RANGE_CHUNK_SIZE;\n  let worker = src.worker instanceof PDFWorker ? src.worker : null;\n  const verbosity = src.verbosity;\n  // Ignore \"data:\"-URLs, since they can't be used to recover valid absolute\n  // URLs anyway. We want to avoid sending them to the worker-thread, since\n  // they contain the *entire* PDF document and can thus be arbitrarily long.\n  const docBaseUrl =\n    typeof src.docBaseUrl === \"string\" && !isDataScheme(src.docBaseUrl)\n      ? src.docBaseUrl\n      : null;\n  const cMapUrl = typeof src.cMapUrl === \"string\" ? src.cMapUrl : null;\n  const cMapPacked = src.cMapPacked !== false;\n  const CMapReaderFactory = src.CMapReaderFactory || DefaultCMapReaderFactory;\n  const standardFontDataUrl =\n    typeof src.standardFontDataUrl === \"string\"\n      ? src.standardFontDataUrl\n      : null;\n  const StandardFontDataFactory =\n    src.StandardFontDataFactory || DefaultStandardFontDataFactory;\n  const ignoreErrors = src.stopAtErrors !== true;\n  const maxImageSize =\n    Number.isInteger(src.maxImageSize) && src.maxImageSize > -1\n      ? src.maxImageSize\n      : -1;\n  const isEvalSupported = src.isEvalSupported !== false;\n  const isOffscreenCanvasSupported =\n    typeof src.isOffscreenCanvasSupported === \"boolean\"\n      ? src.isOffscreenCanvasSupported\n      : !isNodeJS;\n  const isImageDecoderSupported =\n    // eslint-disable-next-line no-nested-ternary\n    typeof src.isImageDecoderSupported === \"boolean\"\n      ? src.isImageDecoderSupported\n      : // eslint-disable-next-line no-nested-ternary\n        typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n        ? true\n        : typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")\n          ? false\n          : !isNodeJS && (FeatureTest.platform.isFirefox || !globalThis.chrome);\n  const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes)\n    ? src.canvasMaxAreaInBytes\n    : -1;\n  const disableFontFace =\n    typeof src.disableFontFace === \"boolean\" ? src.disableFontFace : isNodeJS;\n  const fontExtraProperties = src.fontExtraProperties === true;\n  const enableXfa = src.enableXfa === true;\n  const ownerDocument = src.ownerDocument || globalThis.document;\n  const disableRange = src.disableRange === true;\n  const disableStream = src.disableStream === true;\n  const disableAutoFetch = src.disableAutoFetch === true;\n  const pdfBug = src.pdfBug === true;\n  const CanvasFactory = src.CanvasFactory || DefaultCanvasFactory;\n  const FilterFactory = src.FilterFactory || DefaultFilterFactory;\n  const enableHWA = src.enableHWA === true;\n\n  // Parameters whose default values depend on other parameters.\n  const length = rangeTransport ? rangeTransport.length : (src.length ?? NaN);\n  const useSystemFonts =\n    typeof src.useSystemFonts === \"boolean\"\n      ? src.useSystemFonts\n      : !isNodeJS && !disableFontFace;\n  const useWorkerFetch =\n    typeof src.useWorkerFetch === \"boolean\"\n      ? src.useWorkerFetch\n      : (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n        (CMapReaderFactory === DOMCMapReaderFactory &&\n          StandardFontDataFactory === DOMStandardFontDataFactory &&\n          cMapUrl &&\n          standardFontDataUrl &&\n          isValidFetchUrl(cMapUrl, document.baseURI) &&\n          isValidFetchUrl(standardFontDataUrl, document.baseURI));\n\n  // Parameters only intended for development/testing purposes.\n  const styleElement =\n    typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")\n      ? src.styleElement\n      : null;\n\n  // Set the main-thread verbosity level.\n  setVerbosityLevel(verbosity);\n\n  // Ensure that the various factories can be initialized, when necessary,\n  // since the user may provide *custom* ones.\n  const transportFactory = {\n    canvasFactory: new CanvasFactory({ ownerDocument, enableHWA }),\n    filterFactory: new FilterFactory({ docId, ownerDocument }),\n    cMapReaderFactory:\n      (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n      useWorkerFetch\n        ? null\n        : new CMapReaderFactory({ baseUrl: cMapUrl, isCompressed: cMapPacked }),\n    standardFontDataFactory:\n      (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n      useWorkerFetch\n        ? null\n        : new StandardFontDataFactory({ baseUrl: standardFontDataUrl }),\n  };\n\n  if (!worker) {\n    const workerParams = {\n      verbosity,\n      port: GlobalWorkerOptions.workerPort,\n    };\n    // Worker was not provided -- creating and owning our own. If message port\n    // is specified in global worker options, using it.\n    worker = workerParams.port\n      ? PDFWorker.fromPort(workerParams)\n      : new PDFWorker(workerParams);\n    task._worker = worker;\n  }\n\n  const docParams = {\n    docId,\n    apiVersion:\n      typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"TESTING\")\n        ? PDFJSDev.eval(\"BUNDLE_VERSION\")\n        : null,\n    data,\n    password,\n    disableAutoFetch,\n    rangeChunkSize,\n    length,\n    docBaseUrl,\n    enableXfa,\n    evaluatorOptions: {\n      maxImageSize,\n      disableFontFace,\n      ignoreErrors,\n      isEvalSupported,\n      isOffscreenCanvasSupported,\n      isImageDecoderSupported,\n      canvasMaxAreaInBytes,\n      fontExtraProperties,\n      useSystemFonts,\n      cMapUrl: useWorkerFetch ? cMapUrl : null,\n      standardFontDataUrl: useWorkerFetch ? standardFontDataUrl : null,\n    },\n  };\n  const transportParams = {\n    disableFontFace,\n    fontExtraProperties,\n    ownerDocument,\n    pdfBug,\n    styleElement,\n    loadingParams: {\n      disableAutoFetch,\n      enableXfa,\n    },\n  };\n\n  worker.promise\n    .then(function () {\n      if (task.destroyed) {\n        throw new Error(\"Loading aborted\");\n      }\n      if (worker.destroyed) {\n        throw new Error(\"Worker was destroyed\");\n      }\n\n      const workerIdPromise = worker.messageHandler.sendWithPromise(\n        \"GetDocRequest\",\n        docParams,\n        data ? [data.buffer] : null\n      );\n\n      let networkStream;\n      if (rangeTransport) {\n        networkStream = new PDFDataTransportStream(rangeTransport, {\n          disableRange,\n          disableStream,\n        });\n      } else if (!data) {\n        if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n          throw new Error(\"Not implemented: NetworkStream\");\n        }\n        if (!url) {\n          throw new Error(\"getDocument - no `url` parameter provided.\");\n        }\n        let NetworkStream;\n\n        if (\n          typeof PDFJSDev !== \"undefined\" &&\n          PDFJSDev.test(\"GENERIC\") &&\n          isNodeJS\n        ) {\n          if (isValidFetchUrl(url)) {\n            if (\n              typeof fetch === \"undefined\" ||\n              typeof Response === \"undefined\" ||\n              !(\"body\" in Response.prototype)\n            ) {\n              throw new Error(\n                \"getDocument - the Fetch API was disabled in Node.js, see `--no-experimental-fetch`.\"\n              );\n            }\n            NetworkStream = PDFFetchStream;\n          } else {\n            NetworkStream = PDFNodeStream;\n          }\n        } else {\n          NetworkStream = isValidFetchUrl(url)\n            ? PDFFetchStream\n            : PDFNetworkStream;\n        }\n\n        networkStream = new NetworkStream({\n          url,\n          length,\n          httpHeaders,\n          withCredentials,\n          rangeChunkSize,\n          disableRange,\n          disableStream,\n        });\n      }\n\n      return workerIdPromise.then(workerId => {\n        if (task.destroyed) {\n          throw new Error(\"Loading aborted\");\n        }\n        if (worker.destroyed) {\n          throw new Error(\"Worker was destroyed\");\n        }\n\n        const messageHandler = new MessageHandler(docId, workerId, worker.port);\n        const transport = new WorkerTransport(\n          messageHandler,\n          task,\n          networkStream,\n          transportParams,\n          transportFactory\n        );\n        task._transport = transport;\n        messageHandler.send(\"Ready\", null);\n      });\n    })\n    .catch(task._capability.reject);\n\n  return task;\n}\n\nfunction getUrlProp(val) {\n  if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n    return null; // The 'url' is unused with `PDFDataRangeTransport`.\n  }\n  if (val instanceof URL) {\n    return val.href;\n  }\n  try {\n    // The full path is required in the 'url' field.\n    return new URL(val, window.location).href;\n  } catch {\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"GENERIC\") &&\n      isNodeJS &&\n      typeof val === \"string\"\n    ) {\n      return val; // Use the url as-is in Node.js environments.\n    }\n  }\n  throw new Error(\n    \"Invalid PDF url data: \" +\n      \"either string or URL-object is expected in the url property.\"\n  );\n}\n\nfunction getDataProp(val) {\n  // Converting string or array-like data to Uint8Array.\n  if (\n    typeof PDFJSDev !== \"undefined\" &&\n    PDFJSDev.test(\"GENERIC\") &&\n    isNodeJS &&\n    typeof Buffer !== \"undefined\" && // eslint-disable-line no-undef\n    val instanceof Buffer // eslint-disable-line no-undef\n  ) {\n    throw new Error(\n      \"Please provide binary data as `Uint8Array`, rather than `Buffer`.\"\n    );\n  }\n  if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) {\n    // Use the data as-is when it's already a Uint8Array that completely\n    // \"utilizes\" its underlying ArrayBuffer, to prevent any possible\n    // issues when transferring it to the worker-thread.\n    return val;\n  }\n  if (typeof val === \"string\") {\n    return stringToBytes(val);\n  }\n  if (\n    val instanceof ArrayBuffer ||\n    ArrayBuffer.isView(val) ||\n    (typeof val === \"object\" && !isNaN(val?.length))\n  ) {\n    return new Uint8Array(val);\n  }\n  throw new Error(\n    \"Invalid PDF binary data: either TypedArray, \" +\n      \"string, or array-like object is expected in the data property.\"\n  );\n}\n\nfunction isRefProxy(ref) {\n  return (\n    typeof ref === \"object\" &&\n    Number.isInteger(ref?.num) &&\n    ref.num >= 0 &&\n    Number.isInteger(ref?.gen) &&\n    ref.gen >= 0\n  );\n}\n\n/**\n * @typedef {Object} OnProgressParameters\n * @property {number} loaded - Currently loaded number of bytes.\n * @property {number} total - Total number of bytes in the PDF file.\n */\n\n/**\n * The loading task controls the operations required to load a PDF document\n * (such as network requests) and provides a way to listen for completion,\n * after which individual pages can be rendered.\n */\nclass PDFDocumentLoadingTask {\n  static #docId = 0;\n\n  constructor() {\n    this._capability = Promise.withResolvers();\n    this._transport = null;\n    this._worker = null;\n\n    /**\n     * Unique identifier for the document loading task.\n     * @type {string}\n     */\n    this.docId = `d${PDFDocumentLoadingTask.#docId++}`;\n\n    /**\n     * Whether the loading task is destroyed or not.\n     * @type {boolean}\n     */\n    this.destroyed = false;\n\n    /**\n     * Callback to request a password if a wrong or no password was provided.\n     * The callback receives two parameters: a function that should be called\n     * with the new password, and a reason (see {@link PasswordResponses}).\n     * @type {function}\n     */\n    this.onPassword = null;\n\n    /**\n     * Callback to be able to monitor the loading progress of the PDF file\n     * (necessary to implement e.g. a loading bar).\n     * The callback receives an {@link OnProgressParameters} argument.\n     * @type {function}\n     */\n    this.onProgress = null;\n  }\n\n  /**\n   * Promise for document loading task completion.\n   * @type {Promise<PDFDocumentProxy>}\n   */\n  get promise() {\n    return this._capability.promise;\n  }\n\n  /**\n   * Abort all network requests and destroy the worker.\n   * @returns {Promise<void>} A promise that is resolved when destruction is\n   *   completed.\n   */\n  async destroy() {\n    this.destroyed = true;\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      await this._transport?.destroy();\n    } else {\n      try {\n        if (this._worker?.port) {\n          this._worker._pendingDestroy = true;\n        }\n        await this._transport?.destroy();\n      } catch (ex) {\n        if (this._worker?.port) {\n          delete this._worker._pendingDestroy;\n        }\n        throw ex;\n      }\n    }\n    this._transport = null;\n\n    this._worker?.destroy();\n    this._worker = null;\n  }\n}\n\n/**\n * Abstract class to support range requests file loading.\n *\n * NOTE: The TypedArrays passed to the constructor and relevant methods below\n * will generally be transferred to the worker-thread. This will help reduce\n * main-thread memory usage, however it will take ownership of the TypedArrays.\n */\nclass PDFDataRangeTransport {\n  /**\n   * @param {number} length\n   * @param {Uint8Array|null} initialData\n   * @param {boolean} [progressiveDone]\n   * @param {string} [contentDispositionFilename]\n   */\n  constructor(\n    length,\n    initialData,\n    progressiveDone = false,\n    contentDispositionFilename = null\n  ) {\n    this.length = length;\n    this.initialData = initialData;\n    this.progressiveDone = progressiveDone;\n    this.contentDispositionFilename = contentDispositionFilename;\n\n    this._rangeListeners = [];\n    this._progressListeners = [];\n    this._progressiveReadListeners = [];\n    this._progressiveDoneListeners = [];\n    this._readyCapability = Promise.withResolvers();\n  }\n\n  /**\n   * @param {function} listener\n   */\n  addRangeListener(listener) {\n    this._rangeListeners.push(listener);\n  }\n\n  /**\n   * @param {function} listener\n   */\n  addProgressListener(listener) {\n    this._progressListeners.push(listener);\n  }\n\n  /**\n   * @param {function} listener\n   */\n  addProgressiveReadListener(listener) {\n    this._progressiveReadListeners.push(listener);\n  }\n\n  /**\n   * @param {function} listener\n   */\n  addProgressiveDoneListener(listener) {\n    this._progressiveDoneListeners.push(listener);\n  }\n\n  /**\n   * @param {number} begin\n   * @param {Uint8Array|null} chunk\n   */\n  onDataRange(begin, chunk) {\n    for (const listener of this._rangeListeners) {\n      listener(begin, chunk);\n    }\n  }\n\n  /**\n   * @param {number} loaded\n   * @param {number|undefined} total\n   */\n  onDataProgress(loaded, total) {\n    this._readyCapability.promise.then(() => {\n      for (const listener of this._progressListeners) {\n        listener(loaded, total);\n      }\n    });\n  }\n\n  /**\n   * @param {Uint8Array|null} chunk\n   */\n  onDataProgressiveRead(chunk) {\n    this._readyCapability.promise.then(() => {\n      for (const listener of this._progressiveReadListeners) {\n        listener(chunk);\n      }\n    });\n  }\n\n  onDataProgressiveDone() {\n    this._readyCapability.promise.then(() => {\n      for (const listener of this._progressiveDoneListeners) {\n        listener();\n      }\n    });\n  }\n\n  transportReady() {\n    this._readyCapability.resolve();\n  }\n\n  /**\n   * @param {number} begin\n   * @param {number} end\n   */\n  requestDataRange(begin, end) {\n    unreachable(\"Abstract method PDFDataRangeTransport.requestDataRange\");\n  }\n\n  abort() {}\n}\n\n/**\n * Proxy to a `PDFDocument` in the worker thread.\n */\nclass PDFDocumentProxy {\n  constructor(pdfInfo, transport) {\n    this._pdfInfo = pdfInfo;\n    this._transport = transport;\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"getNetworkStreamName\", {\n        value: () => this._transport.getNetworkStreamName(),\n      });\n      Object.defineProperty(this, \"getXFADatasets\", {\n        value: () => this._transport.getXFADatasets(),\n      });\n      Object.defineProperty(this, \"getXRefPrevValue\", {\n        value: () => this._transport.getXRefPrevValue(),\n      });\n      Object.defineProperty(this, \"getStartXRefPos\", {\n        value: () => this._transport.getStartXRefPos(),\n      });\n      Object.defineProperty(this, \"getAnnotArray\", {\n        value: pageIndex => this._transport.getAnnotArray(pageIndex),\n      });\n    }\n  }\n\n  /**\n   * @type {AnnotationStorage} Storage for annotation data in forms.\n   */\n  get annotationStorage() {\n    return this._transport.annotationStorage;\n  }\n\n  /**\n   * @type {Object} The canvas factory instance.\n   */\n  get canvasFactory() {\n    return this._transport.canvasFactory;\n  }\n\n  /**\n   * @type {Object} The filter factory instance.\n   */\n  get filterFactory() {\n    return this._transport.filterFactory;\n  }\n\n  /**\n   * @type {number} Total number of pages in the PDF file.\n   */\n  get numPages() {\n    return this._pdfInfo.numPages;\n  }\n\n  /**\n   * @type {Array<string | null>} A (not guaranteed to be) unique ID to identify\n   *   the PDF document.\n   *   NOTE: The first element will always be defined for all PDF documents,\n   *   whereas the second element is only defined for *modified* PDF documents.\n   */\n  get fingerprints() {\n    return this._pdfInfo.fingerprints;\n  }\n\n  /**\n   * @type {boolean} True if only XFA form.\n   */\n  get isPureXfa() {\n    return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n  }\n\n  /**\n   * NOTE: This is (mostly) intended to support printing of XFA forms.\n   *\n   * @type {Object | null} An object representing a HTML tree structure\n   *   to render the XFA, or `null` when no XFA form exists.\n   */\n  get allXfaHtml() {\n    return this._transport._htmlForXfa;\n  }\n\n  /**\n   * @param {number} pageNumber - The page number to get. The first page is 1.\n   * @returns {Promise<PDFPageProxy>} A promise that is resolved with\n   *   a {@link PDFPageProxy} object.\n   */\n  getPage(pageNumber) {\n    return this._transport.getPage(pageNumber);\n  }\n\n  /**\n   * @param {RefProxy} ref - The page reference.\n   * @returns {Promise<number>} A promise that is resolved with the page index,\n   *   starting from zero, that is associated with the reference.\n   */\n  getPageIndex(ref) {\n    return this._transport.getPageIndex(ref);\n  }\n\n  /**\n   * @returns {Promise<Object<string, Array<any>>>} A promise that is resolved\n   *   with a mapping from named destinations to references.\n   *\n   * This can be slow for large documents. Use `getDestination` instead.\n   */\n  getDestinations() {\n    return this._transport.getDestinations();\n  }\n\n  /**\n   * @param {string} id - The named destination to get.\n   * @returns {Promise<Array<any> | null>} A promise that is resolved with all\n   *   information of the given named destination, or `null` when the named\n   *   destination is not present in the PDF file.\n   */\n  getDestination(id) {\n    return this._transport.getDestination(id);\n  }\n\n  /**\n   * @returns {Promise<Array<string> | null>} A promise that is resolved with\n   *   an {Array} containing the page labels that correspond to the page\n   *   indexes, or `null` when no page labels are present in the PDF file.\n   */\n  getPageLabels() {\n    return this._transport.getPageLabels();\n  }\n\n  /**\n   * @returns {Promise<string>} A promise that is resolved with a {string}\n   *   containing the page layout name.\n   */\n  getPageLayout() {\n    return this._transport.getPageLayout();\n  }\n\n  /**\n   * @returns {Promise<string>} A promise that is resolved with a {string}\n   *   containing the page mode name.\n   */\n  getPageMode() {\n    return this._transport.getPageMode();\n  }\n\n  /**\n   * @returns {Promise<Object | null>} A promise that is resolved with an\n   *   {Object} containing the viewer preferences, or `null` when no viewer\n   *   preferences are present in the PDF file.\n   */\n  getViewerPreferences() {\n    return this._transport.getViewerPreferences();\n  }\n\n  /**\n   * @returns {Promise<any | null>} A promise that is resolved with an {Array}\n   *   containing the destination, or `null` when no open action is present\n   *   in the PDF.\n   */\n  getOpenAction() {\n    return this._transport.getOpenAction();\n  }\n\n  /**\n   * @returns {Promise<any>} A promise that is resolved with a lookup table\n   *   for mapping named attachments to their content.\n   */\n  getAttachments() {\n    return this._transport.getAttachments();\n  }\n\n  /**\n   * @returns {Promise<Object | null>} A promise that is resolved with\n   *   an {Object} with the JavaScript actions:\n   *     - from the name tree.\n   *     - from A or AA entries in the catalog dictionary.\n   *   , or `null` if no JavaScript exists.\n   */\n  getJSActions() {\n    return this._transport.getDocJSActions();\n  }\n\n  /**\n   * @typedef {Object} OutlineNode\n   * @property {string} title\n   * @property {boolean} bold\n   * @property {boolean} italic\n   * @property {Uint8ClampedArray} color - The color in RGB format to use for\n   *   display purposes.\n   * @property {string | Array<any> | null} dest\n   * @property {string | null} url\n   * @property {string | undefined} unsafeUrl\n   * @property {boolean | undefined} newWindow\n   * @property {number | undefined} count\n   * @property {Array<OutlineNode>} items\n   */\n\n  /**\n   * @returns {Promise<Array<OutlineNode>>} A promise that is resolved with an\n   *   {Array} that is a tree outline (if it has one) of the PDF file.\n   */\n  getOutline() {\n    return this._transport.getOutline();\n  }\n\n  /**\n   * @typedef {Object} GetOptionalContentConfigParameters\n   * @property {string} [intent] - Determines the optional content groups that\n   *   are visible by default; valid values are:\n   *    - 'display' (viewable groups).\n   *    - 'print' (printable groups).\n   *    - 'any' (all groups).\n   *   The default value is 'display'.\n   */\n\n  /**\n   * @param {GetOptionalContentConfigParameters} [params] - Optional content\n   *   config parameters.\n   * @returns {Promise<OptionalContentConfig>} A promise that is resolved with\n   *   an {@link OptionalContentConfig} that contains all the optional content\n   *   groups (assuming that the document has any).\n   */\n  getOptionalContentConfig({ intent = \"display\" } = {}) {\n    const { renderingIntent } = this._transport.getRenderingIntent(intent);\n\n    return this._transport.getOptionalContentConfig(renderingIntent);\n  }\n\n  /**\n   * @returns {Promise<Array<number> | null>} A promise that is resolved with\n   *   an {Array} that contains the permission flags for the PDF document, or\n   *   `null` when no permissions are present in the PDF file.\n   */\n  getPermissions() {\n    return this._transport.getPermissions();\n  }\n\n  /**\n   * @returns {Promise<{ info: Object, metadata: Metadata }>} A promise that is\n   *   resolved with an {Object} that has `info` and `metadata` properties.\n   *   `info` is an {Object} filled with anything available in the information\n   *   dictionary and similarly `metadata` is a {Metadata} object with\n   *   information from the metadata section of the PDF.\n   */\n  getMetadata() {\n    return this._transport.getMetadata();\n  }\n\n  /**\n   * @typedef {Object} MarkInfo\n   * Properties correspond to Table 321 of the PDF 32000-1:2008 spec.\n   * @property {boolean} Marked\n   * @property {boolean} UserProperties\n   * @property {boolean} Suspects\n   */\n\n  /**\n   * @returns {Promise<MarkInfo | null>} A promise that is resolved with\n   *   a {MarkInfo} object that contains the MarkInfo flags for the PDF\n   *   document, or `null` when no MarkInfo values are present in the PDF file.\n   */\n  getMarkInfo() {\n    return this._transport.getMarkInfo();\n  }\n\n  /**\n   * @returns {Promise<Uint8Array>} A promise that is resolved with a\n   *   {Uint8Array} containing the raw data of the PDF document.\n   */\n  getData() {\n    return this._transport.getData();\n  }\n\n  /**\n   * @returns {Promise<Uint8Array>} A promise that is resolved with a\n   *   {Uint8Array} containing the full data of the saved document.\n   */\n  saveDocument() {\n    return this._transport.saveDocument();\n  }\n\n  /**\n   * @returns {Promise<{ length: number }>} A promise that is resolved when the\n   *   document's data is loaded. It is resolved with an {Object} that contains\n   *   the `length` property that indicates size of the PDF data in bytes.\n   */\n  getDownloadInfo() {\n    return this._transport.downloadInfoCapability.promise;\n  }\n\n  /**\n   * Cleans up resources allocated by the document on both the main and worker\n   * threads.\n   *\n   * NOTE: Do not, under any circumstances, call this method when rendering is\n   * currently ongoing since that may lead to rendering errors.\n   *\n   * @param {boolean} [keepLoadedFonts] - Let fonts remain attached to the DOM.\n   *   NOTE: This will increase persistent memory usage, hence don't use this\n   *   option unless absolutely necessary. The default value is `false`.\n   * @returns {Promise} A promise that is resolved when clean-up has finished.\n   */\n  cleanup(keepLoadedFonts = false) {\n    return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);\n  }\n\n  /**\n   * Destroys the current document instance and terminates the worker.\n   */\n  destroy() {\n    return this.loadingTask.destroy();\n  }\n\n  /**\n   * @param {RefProxy} ref - The page reference.\n   * @returns {number | null} The page number, if it's cached.\n   */\n  cachedPageNumber(ref) {\n    return this._transport.cachedPageNumber(ref);\n  }\n\n  /**\n   * @type {DocumentInitParameters} A subset of the current\n   *   {DocumentInitParameters}, which are needed in the viewer.\n   */\n  get loadingParams() {\n    return this._transport.loadingParams;\n  }\n\n  /**\n   * @type {PDFDocumentLoadingTask} The loadingTask for the current document.\n   */\n  get loadingTask() {\n    return this._transport.loadingTask;\n  }\n\n  /**\n   * @returns {Promise<Object<string, Array<Object>> | null>} A promise that is\n   *   resolved with an {Object} containing /AcroForm field data for the JS\n   *   sandbox, or `null` when no field data is present in the PDF file.\n   */\n  getFieldObjects() {\n    return this._transport.getFieldObjects();\n  }\n\n  /**\n   * @returns {Promise<boolean>} A promise that is resolved with `true`\n   *   if some /AcroForm fields have JavaScript actions.\n   */\n  hasJSActions() {\n    return this._transport.hasJSActions();\n  }\n\n  /**\n   * @returns {Promise<Array<string> | null>} A promise that is resolved with an\n   *   {Array<string>} containing IDs of annotations that have a calculation\n   *   action, or `null` when no such annotations are present in the PDF file.\n   */\n  getCalculationOrderIds() {\n    return this._transport.getCalculationOrderIds();\n  }\n}\n\n/**\n * Page getViewport parameters.\n *\n * @typedef {Object} GetViewportParameters\n * @property {number} scale - The desired scale of the viewport.\n * @property {number} [rotation] - The desired rotation, in degrees, of\n *   the viewport. If omitted it defaults to the page rotation.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset.\n *   The default value is `0`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset.\n *   The default value is `0`.\n * @property {boolean} [dontFlip] - If true, the y-axis will not be\n *   flipped. The default value is `false`.\n */\n\n/**\n * Page getTextContent parameters.\n *\n * @typedef {Object} getTextContentParameters\n * @property {boolean} [includeMarkedContent] - When true include marked\n *   content items in the items array of TextContent. The default is `false`.\n * @property {boolean} [disableNormalization] - When true the text is *not*\n *   normalized in the worker-thread. The default is `false`.\n */\n\n/**\n * Page text content.\n *\n * @typedef {Object} TextContent\n * @property {Array<TextItem | TextMarkedContent>} items - Array of\n *   {@link TextItem} and {@link TextMarkedContent} objects. TextMarkedContent\n *   items are included when includeMarkedContent is true.\n * @property {Object<string, TextStyle>} styles - {@link TextStyle} objects,\n *   indexed by font name.\n * @property {string | null} lang - The document /Lang attribute.\n */\n\n/**\n * Page text content part.\n *\n * @typedef {Object} TextItem\n * @property {string} str - Text content.\n * @property {string} dir - Text direction: 'ttb', 'ltr' or 'rtl'.\n * @property {Array<any>} transform - Transformation matrix.\n * @property {number} width - Width in device space.\n * @property {number} height - Height in device space.\n * @property {string} fontName - Font name used by PDF.js for converted font.\n * @property {boolean} hasEOL - Indicating if the text content is followed by a\n *   line-break.\n */\n\n/**\n * Page text marked content part.\n *\n * @typedef {Object} TextMarkedContent\n * @property {string} type - Either 'beginMarkedContent',\n *   'beginMarkedContentProps', or 'endMarkedContent'.\n * @property {string} id - The marked content identifier. Only used for type\n *   'beginMarkedContentProps'.\n */\n\n/**\n * Text style.\n *\n * @typedef {Object} TextStyle\n * @property {number} ascent - Font ascent.\n * @property {number} descent - Font descent.\n * @property {boolean} vertical - Whether or not the text is in vertical mode.\n * @property {string} fontFamily - The possible font family.\n */\n\n/**\n * Page annotation parameters.\n *\n * @typedef {Object} GetAnnotationsParameters\n * @property {string} [intent] - Determines the annotations that are fetched,\n *   can be 'display' (viewable annotations), 'print' (printable annotations),\n *   or 'any' (all annotations). The default value is 'display'.\n */\n\n/**\n * Page render parameters.\n *\n * @typedef {Object} RenderParameters\n * @property {CanvasRenderingContext2D} canvasContext - A 2D context of a DOM\n *   Canvas object.\n * @property {PageViewport} viewport - Rendering viewport obtained by calling\n *   the `PDFPageProxy.getViewport` method.\n * @property {string} [intent] - Rendering intent, can be 'display', 'print',\n *   or 'any'. The default value is 'display'.\n * @property {number} [annotationMode] Controls which annotations are rendered\n *   onto the canvas, for annotations with appearance-data; the values from\n *   {@link AnnotationMode} should be used. The following values are supported:\n *    - `AnnotationMode.DISABLE`, which disables all annotations.\n *    - `AnnotationMode.ENABLE`, which includes all possible annotations (thus\n *      it also depends on the `intent`-option, see above).\n *    - `AnnotationMode.ENABLE_FORMS`, which excludes annotations that contain\n *      interactive form elements (those will be rendered in the display layer).\n *    - `AnnotationMode.ENABLE_STORAGE`, which includes all possible annotations\n *      (as above) but where interactive form elements are updated with data\n *      from the {@link AnnotationStorage}-instance; useful e.g. for printing.\n *   The default value is `AnnotationMode.ENABLE`.\n * @property {Array<any>} [transform] - Additional transform, applied just\n *   before viewport transform.\n * @property {CanvasGradient | CanvasPattern | string} [background] - Background\n *   to use for the canvas.\n *   Any valid `canvas.fillStyle` can be used: a `DOMString` parsed as CSS\n *   <color> value, a `CanvasGradient` object (a linear or radial gradient) or\n *   a `CanvasPattern` object (a repetitive image). The default value is\n *   'rgb(255,255,255)'.\n *\n *   NOTE: This option may be partially, or completely, ignored when the\n *   `pageColors`-option is used.\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n *   with user defined ones in order to improve readability in high contrast\n *   mode.\n * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] -\n *   A promise that should resolve with an {@link OptionalContentConfig}\n *   created from `PDFDocumentProxy.getOptionalContentConfig`. If `null`,\n *   the configuration will be fetched automatically with the default visibility\n *   states set.\n * @property {Map<string, HTMLCanvasElement>} [annotationCanvasMap] - Map some\n *   annotation ids with canvases used to render them.\n * @property {PrintAnnotationStorage} [printAnnotationStorage]\n * @property {boolean} [isEditing] - Render the page in editing mode.\n */\n\n/**\n * Page getOperatorList parameters.\n *\n * @typedef {Object} GetOperatorListParameters\n * @property {string} [intent] - Rendering intent, can be 'display', 'print',\n *   or 'any'. The default value is 'display'.\n * @property {number} [annotationMode] Controls which annotations are included\n *   in the operatorList, for annotations with appearance-data; the values from\n *   {@link AnnotationMode} should be used. The following values are supported:\n *    - `AnnotationMode.DISABLE`, which disables all annotations.\n *    - `AnnotationMode.ENABLE`, which includes all possible annotations (thus\n *      it also depends on the `intent`-option, see above).\n *    - `AnnotationMode.ENABLE_FORMS`, which excludes annotations that contain\n *      interactive form elements (those will be rendered in the display layer).\n *    - `AnnotationMode.ENABLE_STORAGE`, which includes all possible annotations\n *      (as above) but where interactive form elements are updated with data\n *      from the {@link AnnotationStorage}-instance; useful e.g. for printing.\n *   The default value is `AnnotationMode.ENABLE`.\n * @property {PrintAnnotationStorage} [printAnnotationStorage]\n * @property {boolean} [isEditing] - Render the page in editing mode.\n */\n\n/**\n * Structure tree node. The root node will have a role \"Root\".\n *\n * @typedef {Object} StructTreeNode\n * @property {Array<StructTreeNode | StructTreeContent>} children - Array of\n *   {@link StructTreeNode} and {@link StructTreeContent} objects.\n * @property {string} role - element's role, already mapped if a role map exists\n * in the PDF.\n */\n\n/**\n * Structure tree content.\n *\n * @typedef {Object} StructTreeContent\n * @property {string} type - either \"content\" for page and stream structure\n *   elements or \"object\" for object references.\n * @property {string} id - unique id that will map to the text layer.\n */\n\n/**\n * PDF page operator list.\n *\n * @typedef {Object} PDFOperatorList\n * @property {Array<number>} fnArray - Array containing the operator functions.\n * @property {Array<any>} argsArray - Array containing the arguments of the\n *   functions.\n */\n\n/**\n * Proxy to a `PDFPage` in the worker thread.\n */\nclass PDFPageProxy {\n  #delayedCleanupTimeout = null;\n\n  #pendingCleanup = false;\n\n  constructor(pageIndex, pageInfo, transport, pdfBug = false) {\n    this._pageIndex = pageIndex;\n    this._pageInfo = pageInfo;\n    this._transport = transport;\n    this._stats = pdfBug ? new StatTimer() : null;\n    this._pdfBug = pdfBug;\n    /** @type {PDFObjects} */\n    this.commonObjs = transport.commonObjs;\n    this.objs = new PDFObjects();\n\n    this._maybeCleanupAfterRender = false;\n    this._intentStates = new Map();\n    this.destroyed = false;\n  }\n\n  /**\n   * @type {number} Page number of the page. First page is 1.\n   */\n  get pageNumber() {\n    return this._pageIndex + 1;\n  }\n\n  /**\n   * @type {number} The number of degrees the page is rotated clockwise.\n   */\n  get rotate() {\n    return this._pageInfo.rotate;\n  }\n\n  /**\n   * @type {RefProxy | null} The reference that points to this page.\n   */\n  get ref() {\n    return this._pageInfo.ref;\n  }\n\n  /**\n   * @type {number} The default size of units in 1/72nds of an inch.\n   */\n  get userUnit() {\n    return this._pageInfo.userUnit;\n  }\n\n  /**\n   * @type {Array<number>} An array of the visible portion of the PDF page in\n   *   user space units [x1, y1, x2, y2].\n   */\n  get view() {\n    return this._pageInfo.view;\n  }\n\n  /**\n   * @param {GetViewportParameters} params - Viewport parameters.\n   * @returns {PageViewport} Contains 'width' and 'height' properties\n   *   along with transforms required for rendering.\n   */\n  getViewport({\n    scale,\n    rotation = this.rotate,\n    offsetX = 0,\n    offsetY = 0,\n    dontFlip = false,\n  } = {}) {\n    return new PageViewport({\n      viewBox: this.view,\n      userUnit: this.userUnit,\n      scale,\n      rotation,\n      offsetX,\n      offsetY,\n      dontFlip,\n    });\n  }\n\n  /**\n   * @param {GetAnnotationsParameters} [params] - Annotation parameters.\n   * @returns {Promise<Array<any>>} A promise that is resolved with an\n   *   {Array} of the annotation objects.\n   */\n  getAnnotations({ intent = \"display\" } = {}) {\n    const { renderingIntent } = this._transport.getRenderingIntent(intent);\n\n    return this._transport.getAnnotations(this._pageIndex, renderingIntent);\n  }\n\n  /**\n   * @returns {Promise<Object>} A promise that is resolved with an\n   *   {Object} with JS actions.\n   */\n  getJSActions() {\n    return this._transport.getPageJSActions(this._pageIndex);\n  }\n\n  /**\n   * @type {Object} The filter factory instance.\n   */\n  get filterFactory() {\n    return this._transport.filterFactory;\n  }\n\n  /**\n   * @type {boolean} True if only XFA form.\n   */\n  get isPureXfa() {\n    return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n  }\n\n  /**\n   * @returns {Promise<Object | null>} A promise that is resolved with\n   *   an {Object} with a fake DOM object (a tree structure where elements\n   *   are {Object} with a name, attributes (class, style, ...), value and\n   *   children, very similar to a HTML DOM tree), or `null` if no XFA exists.\n   */\n  async getXfa() {\n    return this._transport._htmlForXfa?.children[this._pageIndex] || null;\n  }\n\n  /**\n   * Begins the process of rendering a page to the desired context.\n   *\n   * @param {RenderParameters} params - Page render parameters.\n   * @returns {RenderTask} An object that contains a promise that is\n   *   resolved when the page finishes rendering.\n   */\n  render({\n    canvasContext,\n    viewport,\n    intent = \"display\",\n    annotationMode = AnnotationMode.ENABLE,\n    transform = null,\n    background = null,\n    optionalContentConfigPromise = null,\n    annotationCanvasMap = null,\n    pageColors = null,\n    printAnnotationStorage = null,\n    isEditing = false,\n  }) {\n    this._stats?.time(\"Overall\");\n\n    const intentArgs = this._transport.getRenderingIntent(\n      intent,\n      annotationMode,\n      printAnnotationStorage,\n      isEditing\n    );\n    const { renderingIntent, cacheKey } = intentArgs;\n    // If there was a pending destroy, cancel it so no cleanup happens during\n    // this call to render...\n    this.#pendingCleanup = false;\n    // ... and ensure that a delayed cleanup is always aborted.\n    this.#abortDelayedCleanup();\n\n    optionalContentConfigPromise ||=\n      this._transport.getOptionalContentConfig(renderingIntent);\n\n    let intentState = this._intentStates.get(cacheKey);\n    if (!intentState) {\n      intentState = Object.create(null);\n      this._intentStates.set(cacheKey, intentState);\n    }\n\n    // Ensure that a pending `streamReader` cancel timeout is always aborted.\n    if (intentState.streamReaderCancelTimeout) {\n      clearTimeout(intentState.streamReaderCancelTimeout);\n      intentState.streamReaderCancelTimeout = null;\n    }\n\n    const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n\n    // If there's no displayReadyCapability yet, then the operatorList\n    // was never requested before. Make the request and create the promise.\n    if (!intentState.displayReadyCapability) {\n      intentState.displayReadyCapability = Promise.withResolvers();\n      intentState.operatorList = {\n        fnArray: [],\n        argsArray: [],\n        lastChunk: false,\n        separateAnnots: null,\n      };\n\n      this._stats?.time(\"Page Request\");\n      this._pumpOperatorList(intentArgs);\n    }\n\n    const complete = error => {\n      intentState.renderTasks.delete(internalRenderTask);\n\n      // Attempt to reduce memory usage during *printing*, by always running\n      // cleanup immediately once rendering has finished.\n      if (this._maybeCleanupAfterRender || intentPrint) {\n        this.#pendingCleanup = true;\n      }\n      this.#tryCleanup(/* delayed = */ !intentPrint);\n\n      if (error) {\n        internalRenderTask.capability.reject(error);\n\n        this._abortOperatorList({\n          intentState,\n          reason: error instanceof Error ? error : new Error(error),\n        });\n      } else {\n        internalRenderTask.capability.resolve();\n      }\n\n      if (this._stats) {\n        this._stats.timeEnd(\"Rendering\");\n        this._stats.timeEnd(\"Overall\");\n\n        if (globalThis.Stats?.enabled) {\n          globalThis.Stats.add(this.pageNumber, this._stats);\n        }\n      }\n    };\n\n    const internalRenderTask = new InternalRenderTask({\n      callback: complete,\n      // Only include the required properties, and *not* the entire object.\n      params: {\n        canvasContext,\n        viewport,\n        transform,\n        background,\n      },\n      objs: this.objs,\n      commonObjs: this.commonObjs,\n      annotationCanvasMap,\n      operatorList: intentState.operatorList,\n      pageIndex: this._pageIndex,\n      canvasFactory: this._transport.canvasFactory,\n      filterFactory: this._transport.filterFactory,\n      useRequestAnimationFrame: !intentPrint,\n      pdfBug: this._pdfBug,\n      pageColors,\n    });\n\n    (intentState.renderTasks ||= new Set()).add(internalRenderTask);\n    const renderTask = internalRenderTask.task;\n\n    Promise.all([\n      intentState.displayReadyCapability.promise,\n      optionalContentConfigPromise,\n    ])\n      .then(([transparency, optionalContentConfig]) => {\n        if (this.destroyed) {\n          complete();\n          return;\n        }\n        this._stats?.time(\"Rendering\");\n\n        if (!(optionalContentConfig.renderingIntent & renderingIntent)) {\n          throw new Error(\n            \"Must use the same `intent`-argument when calling the `PDFPageProxy.render` \" +\n              \"and `PDFDocumentProxy.getOptionalContentConfig` methods.\"\n          );\n        }\n        internalRenderTask.initializeGraphics({\n          transparency,\n          optionalContentConfig,\n        });\n        internalRenderTask.operatorListChanged();\n      })\n      .catch(complete);\n\n    return renderTask;\n  }\n\n  /**\n   * @param {GetOperatorListParameters} params - Page getOperatorList\n   *   parameters.\n   * @returns {Promise<PDFOperatorList>} A promise resolved with an\n   *   {@link PDFOperatorList} object that represents the page's operator list.\n   */\n  getOperatorList({\n    intent = \"display\",\n    annotationMode = AnnotationMode.ENABLE,\n    printAnnotationStorage = null,\n    isEditing = false,\n  } = {}) {\n    if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n      throw new Error(\"Not implemented: getOperatorList\");\n    }\n    function operatorListChanged() {\n      if (intentState.operatorList.lastChunk) {\n        intentState.opListReadCapability.resolve(intentState.operatorList);\n\n        intentState.renderTasks.delete(opListTask);\n      }\n    }\n\n    const intentArgs = this._transport.getRenderingIntent(\n      intent,\n      annotationMode,\n      printAnnotationStorage,\n      isEditing,\n      /* isOpList = */ true\n    );\n    let intentState = this._intentStates.get(intentArgs.cacheKey);\n    if (!intentState) {\n      intentState = Object.create(null);\n      this._intentStates.set(intentArgs.cacheKey, intentState);\n    }\n    let opListTask;\n\n    if (!intentState.opListReadCapability) {\n      opListTask = Object.create(null);\n      opListTask.operatorListChanged = operatorListChanged;\n      intentState.opListReadCapability = Promise.withResolvers();\n      (intentState.renderTasks ||= new Set()).add(opListTask);\n      intentState.operatorList = {\n        fnArray: [],\n        argsArray: [],\n        lastChunk: false,\n        separateAnnots: null,\n      };\n\n      this._stats?.time(\"Page Request\");\n      this._pumpOperatorList(intentArgs);\n    }\n    return intentState.opListReadCapability.promise;\n  }\n\n  /**\n   * NOTE: All occurrences of whitespace will be replaced by\n   * standard spaces (0x20).\n   *\n   * @param {getTextContentParameters} params - getTextContent parameters.\n   * @returns {ReadableStream} Stream for reading text content chunks.\n   */\n  streamTextContent({\n    includeMarkedContent = false,\n    disableNormalization = false,\n  } = {}) {\n    const TEXT_CONTENT_CHUNK_SIZE = 100;\n\n    return this._transport.messageHandler.sendWithStream(\n      \"GetTextContent\",\n      {\n        pageIndex: this._pageIndex,\n        includeMarkedContent: includeMarkedContent === true,\n        disableNormalization: disableNormalization === true,\n      },\n      {\n        highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n        size(textContent) {\n          return textContent.items.length;\n        },\n      }\n    );\n  }\n\n  /**\n   * NOTE: All occurrences of whitespace will be replaced by\n   * standard spaces (0x20).\n   *\n   * @param {getTextContentParameters} params - getTextContent parameters.\n   * @returns {Promise<TextContent>} A promise that is resolved with a\n   *   {@link TextContent} object that represents the page's text content.\n   */\n  getTextContent(params = {}) {\n    if (this._transport._htmlForXfa) {\n      // TODO: We need to revisit this once the XFA foreground patch lands and\n      // only do this for non-foreground XFA.\n      return this.getXfa().then(xfa => XfaText.textContent(xfa));\n    }\n    const readableStream = this.streamTextContent(params);\n\n    return new Promise(function (resolve, reject) {\n      function pump() {\n        reader.read().then(function ({ value, done }) {\n          if (done) {\n            resolve(textContent);\n            return;\n          }\n          textContent.lang ??= value.lang;\n          Object.assign(textContent.styles, value.styles);\n          textContent.items.push(...value.items);\n          pump();\n        }, reject);\n      }\n\n      const reader = readableStream.getReader();\n      const textContent = {\n        items: [],\n        styles: Object.create(null),\n        lang: null,\n      };\n      pump();\n    });\n  }\n\n  /**\n   * @returns {Promise<StructTreeNode>} A promise that is resolved with a\n   *   {@link StructTreeNode} object that represents the page's structure tree,\n   *   or `null` when no structure tree is present for the current page.\n   */\n  getStructTree() {\n    return this._transport.getStructTree(this._pageIndex);\n  }\n\n  /**\n   * Destroys the page object.\n   * @private\n   */\n  _destroy() {\n    this.destroyed = true;\n\n    const waitOn = [];\n    for (const intentState of this._intentStates.values()) {\n      this._abortOperatorList({\n        intentState,\n        reason: new Error(\"Page was destroyed.\"),\n        force: true,\n      });\n\n      if (intentState.opListReadCapability) {\n        // Avoid errors below, since the renderTasks are just stubs.\n        continue;\n      }\n      for (const internalRenderTask of intentState.renderTasks) {\n        waitOn.push(internalRenderTask.completed);\n        internalRenderTask.cancel();\n      }\n    }\n    this.objs.clear();\n    this.#pendingCleanup = false;\n    this.#abortDelayedCleanup();\n\n    return Promise.all(waitOn);\n  }\n\n  /**\n   * Cleans up resources allocated by the page.\n   *\n   * @param {boolean} [resetStats] - Reset page stats, if enabled.\n   *   The default value is `false`.\n   * @returns {boolean} Indicates if clean-up was successfully run.\n   */\n  cleanup(resetStats = false) {\n    this.#pendingCleanup = true;\n    const success = this.#tryCleanup(/* delayed = */ false);\n\n    if (resetStats && success) {\n      this._stats &&= new StatTimer();\n    }\n    return success;\n  }\n\n  /**\n   * Attempts to clean up if rendering is in a state where that's possible.\n   * @param {boolean} [delayed] - Delay the cleanup, to e.g. improve zooming\n   *   performance in documents with large images.\n   *   The default value is `false`.\n   * @returns {boolean} Indicates if clean-up was successfully run.\n   */\n  #tryCleanup(delayed = false) {\n    this.#abortDelayedCleanup();\n\n    if (!this.#pendingCleanup || this.destroyed) {\n      return false;\n    }\n    if (delayed) {\n      this.#delayedCleanupTimeout = setTimeout(() => {\n        this.#delayedCleanupTimeout = null;\n        this.#tryCleanup(/* delayed = */ false);\n      }, DELAYED_CLEANUP_TIMEOUT);\n\n      return false;\n    }\n    for (const { renderTasks, operatorList } of this._intentStates.values()) {\n      if (renderTasks.size > 0 || !operatorList.lastChunk) {\n        return false;\n      }\n    }\n    this._intentStates.clear();\n    this.objs.clear();\n    this.#pendingCleanup = false;\n    return true;\n  }\n\n  #abortDelayedCleanup() {\n    if (this.#delayedCleanupTimeout) {\n      clearTimeout(this.#delayedCleanupTimeout);\n      this.#delayedCleanupTimeout = null;\n    }\n  }\n\n  /**\n   * @private\n   */\n  _startRenderPage(transparency, cacheKey) {\n    const intentState = this._intentStates.get(cacheKey);\n    if (!intentState) {\n      return; // Rendering was cancelled.\n    }\n    this._stats?.timeEnd(\"Page Request\");\n\n    // TODO Refactor RenderPageRequest to separate rendering\n    // and operator list logic\n    intentState.displayReadyCapability?.resolve(transparency);\n  }\n\n  /**\n   * @private\n   */\n  _renderPageChunk(operatorListChunk, intentState) {\n    // Add the new chunk to the current operator list.\n    for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {\n      intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n      intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);\n    }\n    intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n    intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots;\n\n    // Notify all the rendering tasks there are more operators to be consumed.\n    for (const internalRenderTask of intentState.renderTasks) {\n      internalRenderTask.operatorListChanged();\n    }\n\n    if (operatorListChunk.lastChunk) {\n      this.#tryCleanup(/* delayed = */ true);\n    }\n  }\n\n  /**\n   * @private\n   */\n  _pumpOperatorList({\n    renderingIntent,\n    cacheKey,\n    annotationStorageSerializable,\n    modifiedIds,\n  }) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        Number.isInteger(renderingIntent) && renderingIntent > 0,\n        '_pumpOperatorList: Expected valid \"renderingIntent\" argument.'\n      );\n    }\n    const { map, transfer } = annotationStorageSerializable;\n\n    const readableStream = this._transport.messageHandler.sendWithStream(\n      \"GetOperatorList\",\n      {\n        pageIndex: this._pageIndex,\n        intent: renderingIntent,\n        cacheKey,\n        annotationStorage: map,\n        modifiedIds,\n      },\n      transfer\n    );\n    const reader = readableStream.getReader();\n\n    const intentState = this._intentStates.get(cacheKey);\n    intentState.streamReader = reader;\n\n    const pump = () => {\n      reader.read().then(\n        ({ value, done }) => {\n          if (done) {\n            intentState.streamReader = null;\n            return;\n          }\n          if (this._transport.destroyed) {\n            return; // Ignore any pending requests if the worker was terminated.\n          }\n          this._renderPageChunk(value, intentState);\n          pump();\n        },\n        reason => {\n          intentState.streamReader = null;\n\n          if (this._transport.destroyed) {\n            return; // Ignore any pending requests if the worker was terminated.\n          }\n          if (intentState.operatorList) {\n            // Mark operator list as complete.\n            intentState.operatorList.lastChunk = true;\n\n            for (const internalRenderTask of intentState.renderTasks) {\n              internalRenderTask.operatorListChanged();\n            }\n            this.#tryCleanup(/* delayed = */ true);\n          }\n\n          if (intentState.displayReadyCapability) {\n            intentState.displayReadyCapability.reject(reason);\n          } else if (intentState.opListReadCapability) {\n            intentState.opListReadCapability.reject(reason);\n          } else {\n            throw reason;\n          }\n        }\n      );\n    };\n    pump();\n  }\n\n  /**\n   * @private\n   */\n  _abortOperatorList({ intentState, reason, force = false }) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        reason instanceof Error,\n        '_abortOperatorList: Expected valid \"reason\" argument.'\n      );\n    }\n\n    if (!intentState.streamReader) {\n      return;\n    }\n    // Ensure that a pending `streamReader` cancel timeout is always aborted.\n    if (intentState.streamReaderCancelTimeout) {\n      clearTimeout(intentState.streamReaderCancelTimeout);\n      intentState.streamReaderCancelTimeout = null;\n    }\n\n    if (!force) {\n      // Ensure that an Error occurring in *only* one `InternalRenderTask`, e.g.\n      // multiple render() calls on the same canvas, won't break all rendering.\n      if (intentState.renderTasks.size > 0) {\n        return;\n      }\n      // Don't immediately abort parsing on the worker-thread when rendering is\n      // cancelled, since that will unnecessarily delay re-rendering when (for\n      // partially parsed pages) e.g. zooming/rotation occurs in the viewer.\n      if (reason instanceof RenderingCancelledException) {\n        let delay = RENDERING_CANCELLED_TIMEOUT;\n        if (reason.extraDelay > 0 && reason.extraDelay < /* ms = */ 1000) {\n          // Above, we prevent the total delay from becoming arbitrarily large.\n          delay += reason.extraDelay;\n        }\n\n        intentState.streamReaderCancelTimeout = setTimeout(() => {\n          intentState.streamReaderCancelTimeout = null;\n          this._abortOperatorList({ intentState, reason, force: true });\n        }, delay);\n        return;\n      }\n    }\n    intentState.streamReader\n      .cancel(new AbortException(reason.message))\n      .catch(() => {\n        // Avoid \"Uncaught promise\" messages in the console.\n      });\n    intentState.streamReader = null;\n\n    if (this._transport.destroyed) {\n      return; // Ignore any pending requests if the worker was terminated.\n    }\n    // Remove the current `intentState`, since a cancelled `getOperatorList`\n    // call on the worker-thread cannot be re-started...\n    for (const [curCacheKey, curIntentState] of this._intentStates) {\n      if (curIntentState === intentState) {\n        this._intentStates.delete(curCacheKey);\n        break;\n      }\n    }\n    // ... and force clean-up to ensure that any old state is always removed.\n    this.cleanup();\n  }\n\n  /**\n   * @type {StatTimer | null} Returns page stats, if enabled; returns `null`\n   *   otherwise.\n   */\n  get stats() {\n    return this._stats;\n  }\n}\n\nclass LoopbackPort {\n  #listeners = new Map();\n\n  #deferred = Promise.resolve();\n\n  postMessage(obj, transfer) {\n    const event = {\n      data: structuredClone(obj, transfer ? { transfer } : null),\n    };\n\n    this.#deferred.then(() => {\n      for (const [listener] of this.#listeners) {\n        listener.call(this, event);\n      }\n    });\n  }\n\n  addEventListener(name, listener, options = null) {\n    let rmAbort = null;\n    if (options?.signal instanceof AbortSignal) {\n      const { signal } = options;\n      if (signal.aborted) {\n        warn(\"LoopbackPort - cannot use an `aborted` signal.\");\n        return;\n      }\n      const onAbort = () => this.removeEventListener(name, listener);\n      rmAbort = () => signal.removeEventListener(\"abort\", onAbort);\n\n      signal.addEventListener(\"abort\", onAbort);\n    }\n    this.#listeners.set(listener, rmAbort);\n  }\n\n  removeEventListener(name, listener) {\n    const rmAbort = this.#listeners.get(listener);\n    rmAbort?.();\n\n    this.#listeners.delete(listener);\n  }\n\n  terminate() {\n    for (const [, rmAbort] of this.#listeners) {\n      rmAbort?.();\n    }\n    this.#listeners.clear();\n  }\n}\n\n/**\n * @typedef {Object} PDFWorkerParameters\n * @property {string} [name] - The name of the worker.\n * @property {Worker} [port] - The `workerPort` object.\n * @property {number} [verbosity] - Controls the logging level;\n *   the constants from {@link VerbosityLevel} should be used.\n */\n\n/**\n * PDF.js web worker abstraction that controls the instantiation of PDF\n * documents. Message handlers are used to pass information from the main\n * thread to the worker thread and vice versa. If the creation of a web\n * worker is not possible, a \"fake\" worker will be used instead.\n *\n * @param {PDFWorkerParameters} params - The worker initialization parameters.\n */\nclass PDFWorker {\n  static #fakeWorkerId = 0;\n\n  static #isWorkerDisabled = false;\n\n  static #workerPorts;\n\n  static {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      if (isNodeJS) {\n        // Workers aren't supported in Node.js, force-disabling them there.\n        this.#isWorkerDisabled = true;\n\n        GlobalWorkerOptions.workerSrc ||= PDFJSDev.test(\"LIB\")\n          ? \"../pdf.worker.js\"\n          : \"./pdf.worker.mjs\";\n      }\n\n      // Check if URLs have the same origin. For non-HTTP based URLs, returns\n      // false.\n      this._isSameOrigin = (baseUrl, otherUrl) => {\n        let base;\n        try {\n          base = new URL(baseUrl);\n          if (!base.origin || base.origin === \"null\") {\n            return false; // non-HTTP url\n          }\n        } catch {\n          return false;\n        }\n        const other = new URL(otherUrl, base);\n        return base.origin === other.origin;\n      };\n\n      this._createCDNWrapper = url => {\n        // We will rely on blob URL's property to specify origin.\n        // We want this function to fail in case if createObjectURL or Blob do\n        // not exist or fail for some reason -- our Worker creation will fail\n        // anyway.\n        const wrapper = `await import(\"${url}\");`;\n        return URL.createObjectURL(\n          new Blob([wrapper], { type: \"text/javascript\" })\n        );\n      };\n    }\n  }\n\n  constructor({\n    name = null,\n    port = null,\n    verbosity = getVerbosityLevel(),\n  } = {}) {\n    this.name = name;\n    this.destroyed = false;\n    this.verbosity = verbosity;\n\n    this._readyCapability = Promise.withResolvers();\n    this._port = null;\n    this._webWorker = null;\n    this._messageHandler = null;\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n      port\n    ) {\n      if (PDFWorker.#workerPorts?.has(port)) {\n        throw new Error(\"Cannot use more than one PDFWorker per port.\");\n      }\n      (PDFWorker.#workerPorts ||= new WeakMap()).set(port, this);\n      this._initializeFromPort(port);\n      return;\n    }\n    this._initialize();\n  }\n\n  /**\n   * Promise for worker initialization completion.\n   * @type {Promise<void>}\n   */\n  get promise() {\n    return this._readyCapability.promise;\n  }\n\n  #resolve() {\n    this._readyCapability.resolve();\n    // Send global setting, e.g. verbosity level.\n    this._messageHandler.send(\"configure\", {\n      verbosity: this.verbosity,\n    });\n  }\n\n  /**\n   * The current `workerPort`, when it exists.\n   * @type {Worker}\n   */\n  get port() {\n    return this._port;\n  }\n\n  /**\n   * The current MessageHandler-instance.\n   * @type {MessageHandler}\n   */\n  get messageHandler() {\n    return this._messageHandler;\n  }\n\n  _initializeFromPort(port) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: _initializeFromPort\");\n    }\n    this._port = port;\n    this._messageHandler = new MessageHandler(\"main\", \"worker\", port);\n    this._messageHandler.on(\"ready\", function () {\n      // Ignoring \"ready\" event -- MessageHandler should already be initialized\n      // and ready to accept messages.\n    });\n    this.#resolve();\n  }\n\n  _initialize() {\n    // If worker support isn't disabled explicit and the browser has worker\n    // support, create a new web worker and test if it/the browser fulfills\n    // all requirements to run parts of pdf.js in a web worker.\n    // Right now, the requirement is, that an Uint8Array is still an\n    // Uint8Array as it arrives on the worker.\n    if (\n      PDFWorker.#isWorkerDisabled ||\n      PDFWorker.#mainThreadWorkerMessageHandler\n    ) {\n      this._setupFakeWorker();\n      return;\n    }\n    let { workerSrc } = PDFWorker;\n\n    try {\n      // Wraps workerSrc path into blob URL, if the former does not belong\n      // to the same origin.\n      if (\n        typeof PDFJSDev !== \"undefined\" &&\n        PDFJSDev.test(\"GENERIC\") &&\n        !PDFWorker._isSameOrigin(window.location.href, workerSrc)\n      ) {\n        workerSrc = PDFWorker._createCDNWrapper(\n          new URL(workerSrc, window.location).href\n        );\n      }\n\n      const worker = new Worker(workerSrc, { type: \"module\" });\n      const messageHandler = new MessageHandler(\"main\", \"worker\", worker);\n      const terminateEarly = () => {\n        ac.abort();\n        messageHandler.destroy();\n        worker.terminate();\n        if (this.destroyed) {\n          this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n        } else {\n          // Fall back to fake worker if the termination is caused by an\n          // error (e.g. NetworkError / SecurityError).\n          this._setupFakeWorker();\n        }\n      };\n\n      const ac = new AbortController();\n      worker.addEventListener(\n        \"error\",\n        () => {\n          if (!this._webWorker) {\n            // Worker failed to initialize due to an error. Clean up and fall\n            // back to the fake worker.\n            terminateEarly();\n          }\n        },\n        { signal: ac.signal }\n      );\n\n      messageHandler.on(\"test\", data => {\n        ac.abort();\n        if (this.destroyed || !data) {\n          terminateEarly();\n          return;\n        }\n        this._messageHandler = messageHandler;\n        this._port = worker;\n        this._webWorker = worker;\n\n        this.#resolve();\n      });\n\n      messageHandler.on(\"ready\", data => {\n        ac.abort();\n        if (this.destroyed) {\n          terminateEarly();\n          return;\n        }\n        try {\n          sendTest();\n        } catch {\n          // We need fallback to a faked worker.\n          this._setupFakeWorker();\n        }\n      });\n\n      const sendTest = () => {\n        const testObj = new Uint8Array();\n        // Ensure that we can use `postMessage` transfers.\n        messageHandler.send(\"test\", testObj, [testObj.buffer]);\n      };\n\n      // It might take time for the worker to initialize. We will try to send\n      // the \"test\" message immediately, and once the \"ready\" message arrives.\n      // The worker shall process only the first received \"test\" message.\n      sendTest();\n      return;\n    } catch {\n      info(\"The worker has been disabled.\");\n    }\n    // Either workers are not supported or have thrown an exception.\n    // Thus, we fallback to a faked worker.\n    this._setupFakeWorker();\n  }\n\n  _setupFakeWorker() {\n    if (!PDFWorker.#isWorkerDisabled) {\n      warn(\"Setting up fake worker.\");\n      PDFWorker.#isWorkerDisabled = true;\n    }\n\n    PDFWorker._setupFakeWorkerGlobal\n      .then(WorkerMessageHandler => {\n        if (this.destroyed) {\n          this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n          return;\n        }\n        const port = new LoopbackPort();\n        this._port = port;\n\n        // All fake workers use the same port, making id unique.\n        const id = `fake${PDFWorker.#fakeWorkerId++}`;\n\n        // If the main thread is our worker, setup the handling for the\n        // messages -- the main thread sends to it self.\n        const workerHandler = new MessageHandler(id + \"_worker\", id, port);\n        WorkerMessageHandler.setup(workerHandler, port);\n\n        this._messageHandler = new MessageHandler(id, id + \"_worker\", port);\n        this.#resolve();\n      })\n      .catch(reason => {\n        this._readyCapability.reject(\n          new Error(`Setting up fake worker failed: \"${reason.message}\".`)\n        );\n      });\n  }\n\n  /**\n   * Destroys the worker instance.\n   */\n  destroy() {\n    this.destroyed = true;\n\n    // We need to terminate only web worker created resource.\n    this._webWorker?.terminate();\n    this._webWorker = null;\n\n    PDFWorker.#workerPorts?.delete(this._port);\n    this._port = null;\n\n    this._messageHandler?.destroy();\n    this._messageHandler = null;\n  }\n\n  /**\n   * @param {PDFWorkerParameters} params - The worker initialization parameters.\n   */\n  static fromPort(params) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: fromPort\");\n    }\n    if (!params?.port) {\n      throw new Error(\"PDFWorker.fromPort - invalid method signature.\");\n    }\n    const cachedPort = this.#workerPorts?.get(params.port);\n    if (cachedPort) {\n      if (cachedPort._pendingDestroy) {\n        throw new Error(\n          \"PDFWorker.fromPort - the worker is being destroyed.\\n\" +\n            \"Please remember to await `PDFDocumentLoadingTask.destroy()`-calls.\"\n        );\n      }\n      return cachedPort;\n    }\n    return new PDFWorker(params);\n  }\n\n  /**\n   * The current `workerSrc`, when it exists.\n   * @type {string}\n   */\n  static get workerSrc() {\n    if (GlobalWorkerOptions.workerSrc) {\n      return GlobalWorkerOptions.workerSrc;\n    }\n    throw new Error('No \"GlobalWorkerOptions.workerSrc\" specified.');\n  }\n\n  static get #mainThreadWorkerMessageHandler() {\n    try {\n      return globalThis.pdfjsWorker?.WorkerMessageHandler || null;\n    } catch {\n      return null;\n    }\n  }\n\n  // Loads worker code into the main-thread.\n  static get _setupFakeWorkerGlobal() {\n    const loader = async () => {\n      if (this.#mainThreadWorkerMessageHandler) {\n        // The worker was already loaded using e.g. a `<script>` tag.\n        return this.#mainThreadWorkerMessageHandler;\n      }\n      const worker =\n        typeof PDFJSDev === \"undefined\"\n          ? await import(\"pdfjs/pdf.worker.js\")\n          : await __non_webpack_import__(this.workerSrc);\n      return worker.WorkerMessageHandler;\n    };\n\n    return shadow(this, \"_setupFakeWorkerGlobal\", loader());\n  }\n}\n\n/**\n * For internal use only.\n * @ignore\n */\nclass WorkerTransport {\n  #methodPromises = new Map();\n\n  #pageCache = new Map();\n\n  #pagePromises = new Map();\n\n  #pageRefCache = new Map();\n\n  #passwordCapability = null;\n\n  constructor(messageHandler, loadingTask, networkStream, params, factory) {\n    this.messageHandler = messageHandler;\n    this.loadingTask = loadingTask;\n    this.commonObjs = new PDFObjects();\n    this.fontLoader = new FontLoader({\n      ownerDocument: params.ownerDocument,\n      styleElement: params.styleElement,\n    });\n    this.loadingParams = params.loadingParams;\n    this._params = params;\n\n    this.canvasFactory = factory.canvasFactory;\n    this.filterFactory = factory.filterFactory;\n    this.cMapReaderFactory = factory.cMapReaderFactory;\n    this.standardFontDataFactory = factory.standardFontDataFactory;\n\n    this.destroyed = false;\n    this.destroyCapability = null;\n\n    this._networkStream = networkStream;\n    this._fullReader = null;\n    this._lastProgress = null;\n    this.downloadInfoCapability = Promise.withResolvers();\n\n    this.setupMessageHandler();\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"getNetworkStreamName\", {\n        value: () => networkStream?.constructor?.name || null,\n      });\n      Object.defineProperty(this, \"getXFADatasets\", {\n        value: () =>\n          this.messageHandler.sendWithPromise(\"GetXFADatasets\", null),\n      });\n      Object.defineProperty(this, \"getXRefPrevValue\", {\n        value: () =>\n          this.messageHandler.sendWithPromise(\"GetXRefPrevValue\", null),\n      });\n      Object.defineProperty(this, \"getStartXRefPos\", {\n        value: () =>\n          this.messageHandler.sendWithPromise(\"GetStartXRefPos\", null),\n      });\n      Object.defineProperty(this, \"getAnnotArray\", {\n        value: pageIndex =>\n          this.messageHandler.sendWithPromise(\"GetAnnotArray\", { pageIndex }),\n      });\n    }\n  }\n\n  #cacheSimpleMethod(name, data = null) {\n    const cachedPromise = this.#methodPromises.get(name);\n    if (cachedPromise) {\n      return cachedPromise;\n    }\n    const promise = this.messageHandler.sendWithPromise(name, data);\n\n    this.#methodPromises.set(name, promise);\n    return promise;\n  }\n\n  get annotationStorage() {\n    return shadow(this, \"annotationStorage\", new AnnotationStorage());\n  }\n\n  getRenderingIntent(\n    intent,\n    annotationMode = AnnotationMode.ENABLE,\n    printAnnotationStorage = null,\n    isEditing = false,\n    isOpList = false\n  ) {\n    let renderingIntent = RenderingIntentFlag.DISPLAY; // Default value.\n    let annotationStorageSerializable = SerializableEmpty;\n\n    switch (intent) {\n      case \"any\":\n        renderingIntent = RenderingIntentFlag.ANY;\n        break;\n      case \"display\":\n        break;\n      case \"print\":\n        renderingIntent = RenderingIntentFlag.PRINT;\n        break;\n      default:\n        warn(`getRenderingIntent - invalid intent: ${intent}`);\n    }\n\n    const annotationStorage =\n      renderingIntent & RenderingIntentFlag.PRINT &&\n      printAnnotationStorage instanceof PrintAnnotationStorage\n        ? printAnnotationStorage\n        : this.annotationStorage;\n\n    switch (annotationMode) {\n      case AnnotationMode.DISABLE:\n        renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE;\n        break;\n      case AnnotationMode.ENABLE:\n        break;\n      case AnnotationMode.ENABLE_FORMS:\n        renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS;\n        break;\n      case AnnotationMode.ENABLE_STORAGE:\n        renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE;\n\n        annotationStorageSerializable = annotationStorage.serializable;\n        break;\n      default:\n        warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`);\n    }\n\n    if (isEditing) {\n      renderingIntent += RenderingIntentFlag.IS_EDITING;\n    }\n    if (isOpList) {\n      renderingIntent += RenderingIntentFlag.OPLIST;\n    }\n\n    const { ids: modifiedIds, hash: modifiedIdsHash } =\n      annotationStorage.modifiedIds;\n\n    const cacheKeyBuf = [\n      renderingIntent,\n      annotationStorageSerializable.hash,\n      modifiedIdsHash,\n    ];\n\n    return {\n      renderingIntent,\n      cacheKey: cacheKeyBuf.join(\"_\"),\n      annotationStorageSerializable,\n      modifiedIds,\n    };\n  }\n\n  destroy() {\n    if (this.destroyCapability) {\n      return this.destroyCapability.promise;\n    }\n\n    this.destroyed = true;\n    this.destroyCapability = Promise.withResolvers();\n\n    this.#passwordCapability?.reject(\n      new Error(\"Worker was destroyed during onPassword callback\")\n    );\n\n    const waitOn = [];\n    // We need to wait for all renderings to be completed, e.g.\n    // timeout/rAF can take a long time.\n    for (const page of this.#pageCache.values()) {\n      waitOn.push(page._destroy());\n    }\n    this.#pageCache.clear();\n    this.#pagePromises.clear();\n    this.#pageRefCache.clear();\n    // Allow `AnnotationStorage`-related clean-up when destroying the document.\n    if (this.hasOwnProperty(\"annotationStorage\")) {\n      this.annotationStorage.resetModified();\n    }\n    // We also need to wait for the worker to finish its long running tasks.\n    const terminated = this.messageHandler.sendWithPromise(\"Terminate\", null);\n    waitOn.push(terminated);\n\n    Promise.all(waitOn).then(() => {\n      this.commonObjs.clear();\n      this.fontLoader.clear();\n      this.#methodPromises.clear();\n      this.filterFactory.destroy();\n      TextLayer.cleanup();\n\n      this._networkStream?.cancelAllRequests(\n        new AbortException(\"Worker was terminated.\")\n      );\n\n      this.messageHandler?.destroy();\n      this.messageHandler = null;\n\n      this.destroyCapability.resolve();\n    }, this.destroyCapability.reject);\n    return this.destroyCapability.promise;\n  }\n\n  setupMessageHandler() {\n    const { messageHandler, loadingTask } = this;\n\n    messageHandler.on(\"GetReader\", (data, sink) => {\n      assert(\n        this._networkStream,\n        \"GetReader - no `IPDFStream` instance available.\"\n      );\n      this._fullReader = this._networkStream.getFullReader();\n      this._fullReader.onProgress = evt => {\n        this._lastProgress = {\n          loaded: evt.loaded,\n          total: evt.total,\n        };\n      };\n      sink.onPull = () => {\n        this._fullReader\n          .read()\n          .then(function ({ value, done }) {\n            if (done) {\n              sink.close();\n              return;\n            }\n            assert(\n              value instanceof ArrayBuffer,\n              \"GetReader - expected an ArrayBuffer.\"\n            );\n            // Enqueue data chunk into sink, and transfer it\n            // to other side as `Transferable` object.\n            sink.enqueue(new Uint8Array(value), 1, [value]);\n          })\n          .catch(reason => {\n            sink.error(reason);\n          });\n      };\n\n      sink.onCancel = reason => {\n        this._fullReader.cancel(reason);\n\n        sink.ready.catch(readyReason => {\n          if (this.destroyed) {\n            return; // Ignore any pending requests if the worker was terminated.\n          }\n          throw readyReason;\n        });\n      };\n    });\n\n    messageHandler.on(\"ReaderHeadersReady\", async data => {\n      await this._fullReader.headersReady;\n\n      const { isStreamingSupported, isRangeSupported, contentLength } =\n        this._fullReader;\n\n      // If stream or range are disabled, it's our only way to report\n      // loading progress.\n      if (!isStreamingSupported || !isRangeSupported) {\n        if (this._lastProgress) {\n          loadingTask.onProgress?.(this._lastProgress);\n        }\n        this._fullReader.onProgress = evt => {\n          loadingTask.onProgress?.({\n            loaded: evt.loaded,\n            total: evt.total,\n          });\n        };\n      }\n\n      return { isStreamingSupported, isRangeSupported, contentLength };\n    });\n\n    messageHandler.on(\"GetRangeReader\", (data, sink) => {\n      assert(\n        this._networkStream,\n        \"GetRangeReader - no `IPDFStream` instance available.\"\n      );\n      const rangeReader = this._networkStream.getRangeReader(\n        data.begin,\n        data.end\n      );\n\n      // When streaming is enabled, it's possible that the data requested here\n      // has already been fetched via the `_fullRequestReader` implementation.\n      // However, given that the PDF data is loaded asynchronously on the\n      // main-thread and then sent via `postMessage` to the worker-thread,\n      // it may not have been available during parsing (hence the attempt to\n      // use range requests here).\n      //\n      // To avoid wasting time and resources here, we'll thus *not* dispatch\n      // range requests if the data was already loaded but has not been sent to\n      // the worker-thread yet (which will happen via the `_fullRequestReader`).\n      if (!rangeReader) {\n        sink.close();\n        return;\n      }\n\n      sink.onPull = () => {\n        rangeReader\n          .read()\n          .then(function ({ value, done }) {\n            if (done) {\n              sink.close();\n              return;\n            }\n            assert(\n              value instanceof ArrayBuffer,\n              \"GetRangeReader - expected an ArrayBuffer.\"\n            );\n            sink.enqueue(new Uint8Array(value), 1, [value]);\n          })\n          .catch(reason => {\n            sink.error(reason);\n          });\n      };\n\n      sink.onCancel = reason => {\n        rangeReader.cancel(reason);\n\n        sink.ready.catch(readyReason => {\n          if (this.destroyed) {\n            return; // Ignore any pending requests if the worker was terminated.\n          }\n          throw readyReason;\n        });\n      };\n    });\n\n    messageHandler.on(\"GetDoc\", ({ pdfInfo }) => {\n      this._numPages = pdfInfo.numPages;\n      this._htmlForXfa = pdfInfo.htmlForXfa;\n      delete pdfInfo.htmlForXfa;\n      loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this));\n    });\n\n    messageHandler.on(\"DocException\", ex => {\n      loadingTask._capability.reject(wrapReason(ex));\n    });\n\n    messageHandler.on(\"PasswordRequest\", ex => {\n      this.#passwordCapability = Promise.withResolvers();\n\n      try {\n        if (!loadingTask.onPassword) {\n          throw wrapReason(ex);\n        }\n\n        const updatePassword = password => {\n          if (password instanceof Error) {\n            this.#passwordCapability.reject(password);\n          } else {\n            this.#passwordCapability.resolve({ password });\n          }\n        };\n        loadingTask.onPassword(updatePassword, ex.code);\n      } catch (err) {\n        this.#passwordCapability.reject(err);\n      }\n      return this.#passwordCapability.promise;\n    });\n\n    messageHandler.on(\"DataLoaded\", data => {\n      // For consistency: Ensure that progress is always reported when the\n      // entire PDF file has been loaded, regardless of how it was fetched.\n      loadingTask.onProgress?.({\n        loaded: data.length,\n        total: data.length,\n      });\n\n      this.downloadInfoCapability.resolve(data);\n    });\n\n    messageHandler.on(\"StartRenderPage\", data => {\n      if (this.destroyed) {\n        return; // Ignore any pending requests if the worker was terminated.\n      }\n\n      const page = this.#pageCache.get(data.pageIndex);\n      page._startRenderPage(data.transparency, data.cacheKey);\n    });\n\n    messageHandler.on(\"commonobj\", ([id, type, exportedData]) => {\n      if (this.destroyed) {\n        return null; // Ignore any pending requests if the worker was terminated.\n      }\n\n      if (this.commonObjs.has(id)) {\n        return null;\n      }\n\n      switch (type) {\n        case \"Font\":\n          const { disableFontFace, fontExtraProperties, pdfBug } = this._params;\n\n          if (\"error\" in exportedData) {\n            const exportedError = exportedData.error;\n            warn(`Error during font loading: ${exportedError}`);\n            this.commonObjs.resolve(id, exportedError);\n            break;\n          }\n\n          const inspectFont =\n            pdfBug && globalThis.FontInspector?.enabled\n              ? (font, url) => globalThis.FontInspector.fontAdded(font, url)\n              : null;\n          const font = new FontFaceObject(exportedData, {\n            disableFontFace,\n            fontExtraProperties,\n            inspectFont,\n          });\n\n          this.fontLoader\n            .bind(font)\n            .catch(() => messageHandler.sendWithPromise(\"FontFallback\", { id }))\n            .finally(() => {\n              if (!fontExtraProperties && font.data) {\n                // Immediately release the `font.data` property once the font\n                // has been attached to the DOM, since it's no longer needed,\n                // rather than waiting for a `PDFDocumentProxy.cleanup` call.\n                // Since `font.data` could be very large, e.g. in some cases\n                // multiple megabytes, this will help reduce memory usage.\n                font.data = null;\n              }\n              this.commonObjs.resolve(id, font);\n            });\n          break;\n        case \"CopyLocalImage\":\n          const { imageRef } = exportedData;\n          assert(imageRef, \"The imageRef must be defined.\");\n\n          for (const pageProxy of this.#pageCache.values()) {\n            for (const [, data] of pageProxy.objs) {\n              if (data?.ref !== imageRef) {\n                continue;\n              }\n              if (!data.dataLen) {\n                return null;\n              }\n              this.commonObjs.resolve(id, structuredClone(data));\n              return data.dataLen;\n            }\n          }\n          break;\n        case \"FontPath\":\n        case \"Image\":\n        case \"Pattern\":\n          this.commonObjs.resolve(id, exportedData);\n          break;\n        default:\n          throw new Error(`Got unknown common object type ${type}`);\n      }\n\n      return null;\n    });\n\n    messageHandler.on(\"obj\", ([id, pageIndex, type, imageData]) => {\n      if (this.destroyed) {\n        // Ignore any pending requests if the worker was terminated.\n        return;\n      }\n\n      const pageProxy = this.#pageCache.get(pageIndex);\n      if (pageProxy.objs.has(id)) {\n        return;\n      }\n      // Don't store data *after* cleanup has successfully run, see bug 1854145.\n      if (pageProxy._intentStates.size === 0) {\n        imageData?.bitmap?.close(); // Release any `ImageBitmap` data.\n        return;\n      }\n\n      switch (type) {\n        case \"Image\":\n          pageProxy.objs.resolve(id, imageData);\n\n          // Heuristic that will allow us not to store large data.\n          if (imageData?.dataLen > MAX_IMAGE_SIZE_TO_CACHE) {\n            pageProxy._maybeCleanupAfterRender = true;\n          }\n          break;\n        case \"Pattern\":\n          pageProxy.objs.resolve(id, imageData);\n          break;\n        default:\n          throw new Error(`Got unknown object type ${type}`);\n      }\n    });\n\n    messageHandler.on(\"DocProgress\", data => {\n      if (this.destroyed) {\n        return; // Ignore any pending requests if the worker was terminated.\n      }\n      loadingTask.onProgress?.({\n        loaded: data.loaded,\n        total: data.total,\n      });\n    });\n\n    messageHandler.on(\"FetchBuiltInCMap\", async data => {\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n        throw new Error(\"Not implemented: FetchBuiltInCMap\");\n      }\n      if (this.destroyed) {\n        throw new Error(\"Worker was destroyed.\");\n      }\n      if (!this.cMapReaderFactory) {\n        throw new Error(\n          \"CMapReaderFactory not initialized, see the `useWorkerFetch` parameter.\"\n        );\n      }\n      return this.cMapReaderFactory.fetch(data);\n    });\n\n    messageHandler.on(\"FetchStandardFontData\", async data => {\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n        throw new Error(\"Not implemented: FetchStandardFontData\");\n      }\n      if (this.destroyed) {\n        throw new Error(\"Worker was destroyed.\");\n      }\n      if (!this.standardFontDataFactory) {\n        throw new Error(\n          \"StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter.\"\n        );\n      }\n      return this.standardFontDataFactory.fetch(data);\n    });\n  }\n\n  getData() {\n    return this.messageHandler.sendWithPromise(\"GetData\", null);\n  }\n\n  saveDocument() {\n    if (this.annotationStorage.size <= 0) {\n      warn(\n        \"saveDocument called while `annotationStorage` is empty, \" +\n          \"please use the getData-method instead.\"\n      );\n    }\n    const { map, transfer } = this.annotationStorage.serializable;\n\n    return this.messageHandler\n      .sendWithPromise(\n        \"SaveDocument\",\n        {\n          isPureXfa: !!this._htmlForXfa,\n          numPages: this._numPages,\n          annotationStorage: map,\n          filename: this._fullReader?.filename ?? null,\n        },\n        transfer\n      )\n      .finally(() => {\n        this.annotationStorage.resetModified();\n      });\n  }\n\n  getPage(pageNumber) {\n    if (\n      !Number.isInteger(pageNumber) ||\n      pageNumber <= 0 ||\n      pageNumber > this._numPages\n    ) {\n      return Promise.reject(new Error(\"Invalid page request.\"));\n    }\n\n    const pageIndex = pageNumber - 1,\n      cachedPromise = this.#pagePromises.get(pageIndex);\n    if (cachedPromise) {\n      return cachedPromise;\n    }\n    const promise = this.messageHandler\n      .sendWithPromise(\"GetPage\", {\n        pageIndex,\n      })\n      .then(pageInfo => {\n        if (this.destroyed) {\n          throw new Error(\"Transport destroyed\");\n        }\n        if (pageInfo.refStr) {\n          this.#pageRefCache.set(pageInfo.refStr, pageNumber);\n        }\n\n        const page = new PDFPageProxy(\n          pageIndex,\n          pageInfo,\n          this,\n          this._params.pdfBug\n        );\n        this.#pageCache.set(pageIndex, page);\n        return page;\n      });\n    this.#pagePromises.set(pageIndex, promise);\n    return promise;\n  }\n\n  getPageIndex(ref) {\n    if (!isRefProxy(ref)) {\n      return Promise.reject(new Error(\"Invalid pageIndex request.\"));\n    }\n    return this.messageHandler.sendWithPromise(\"GetPageIndex\", {\n      num: ref.num,\n      gen: ref.gen,\n    });\n  }\n\n  getAnnotations(pageIndex, intent) {\n    return this.messageHandler.sendWithPromise(\"GetAnnotations\", {\n      pageIndex,\n      intent,\n    });\n  }\n\n  getFieldObjects() {\n    return this.#cacheSimpleMethod(\"GetFieldObjects\");\n  }\n\n  hasJSActions() {\n    return this.#cacheSimpleMethod(\"HasJSActions\");\n  }\n\n  getCalculationOrderIds() {\n    return this.messageHandler.sendWithPromise(\"GetCalculationOrderIds\", null);\n  }\n\n  getDestinations() {\n    return this.messageHandler.sendWithPromise(\"GetDestinations\", null);\n  }\n\n  getDestination(id) {\n    if (typeof id !== \"string\") {\n      return Promise.reject(new Error(\"Invalid destination request.\"));\n    }\n    return this.messageHandler.sendWithPromise(\"GetDestination\", {\n      id,\n    });\n  }\n\n  getPageLabels() {\n    return this.messageHandler.sendWithPromise(\"GetPageLabels\", null);\n  }\n\n  getPageLayout() {\n    return this.messageHandler.sendWithPromise(\"GetPageLayout\", null);\n  }\n\n  getPageMode() {\n    return this.messageHandler.sendWithPromise(\"GetPageMode\", null);\n  }\n\n  getViewerPreferences() {\n    return this.messageHandler.sendWithPromise(\"GetViewerPreferences\", null);\n  }\n\n  getOpenAction() {\n    return this.messageHandler.sendWithPromise(\"GetOpenAction\", null);\n  }\n\n  getAttachments() {\n    return this.messageHandler.sendWithPromise(\"GetAttachments\", null);\n  }\n\n  getDocJSActions() {\n    return this.#cacheSimpleMethod(\"GetDocJSActions\");\n  }\n\n  getPageJSActions(pageIndex) {\n    return this.messageHandler.sendWithPromise(\"GetPageJSActions\", {\n      pageIndex,\n    });\n  }\n\n  getStructTree(pageIndex) {\n    return this.messageHandler.sendWithPromise(\"GetStructTree\", {\n      pageIndex,\n    });\n  }\n\n  getOutline() {\n    return this.messageHandler.sendWithPromise(\"GetOutline\", null);\n  }\n\n  getOptionalContentConfig(renderingIntent) {\n    return this.#cacheSimpleMethod(\"GetOptionalContentConfig\").then(\n      data => new OptionalContentConfig(data, renderingIntent)\n    );\n  }\n\n  getPermissions() {\n    return this.messageHandler.sendWithPromise(\"GetPermissions\", null);\n  }\n\n  getMetadata() {\n    const name = \"GetMetadata\",\n      cachedPromise = this.#methodPromises.get(name);\n    if (cachedPromise) {\n      return cachedPromise;\n    }\n    const promise = this.messageHandler\n      .sendWithPromise(name, null)\n      .then(results => ({\n        info: results[0],\n        metadata: results[1] ? new Metadata(results[1]) : null,\n        contentDispositionFilename: this._fullReader?.filename ?? null,\n        contentLength: this._fullReader?.contentLength ?? null,\n      }));\n    this.#methodPromises.set(name, promise);\n    return promise;\n  }\n\n  getMarkInfo() {\n    return this.messageHandler.sendWithPromise(\"GetMarkInfo\", null);\n  }\n\n  async startCleanup(keepLoadedFonts = false) {\n    if (this.destroyed) {\n      return; // No need to manually clean-up when destruction has started.\n    }\n    await this.messageHandler.sendWithPromise(\"Cleanup\", null);\n\n    for (const page of this.#pageCache.values()) {\n      const cleanupSuccessful = page.cleanup();\n\n      if (!cleanupSuccessful) {\n        throw new Error(\n          `startCleanup: Page ${page.pageNumber} is currently rendering.`\n        );\n      }\n    }\n    this.commonObjs.clear();\n    if (!keepLoadedFonts) {\n      this.fontLoader.clear();\n    }\n    this.#methodPromises.clear();\n    this.filterFactory.destroy(/* keepHCM = */ true);\n    TextLayer.cleanup();\n  }\n\n  cachedPageNumber(ref) {\n    if (!isRefProxy(ref)) {\n      return null;\n    }\n    const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`;\n    return this.#pageRefCache.get(refStr) ?? null;\n  }\n}\n\nconst INITIAL_DATA = Symbol(\"INITIAL_DATA\");\n\n/**\n * A PDF document and page is built of many objects. E.g. there are objects for\n * fonts, images, rendering code, etc. These objects may get processed inside of\n * a worker. This class implements some basic methods to manage these objects.\n */\nclass PDFObjects {\n  #objs = Object.create(null);\n\n  /**\n   * Ensures there is an object defined for `objId`.\n   *\n   * @param {string} objId\n   * @returns {Object}\n   */\n  #ensureObj(objId) {\n    return (this.#objs[objId] ||= {\n      ...Promise.withResolvers(),\n      data: INITIAL_DATA,\n    });\n  }\n\n  /**\n   * If called *without* callback, this returns the data of `objId` but the\n   * object needs to be resolved. If it isn't, this method throws.\n   *\n   * If called *with* a callback, the callback is called with the data of the\n   * object once the object is resolved. That means, if you call this method\n   * and the object is already resolved, the callback gets called right away.\n   *\n   * @param {string} objId\n   * @param {function} [callback]\n   * @returns {any}\n   */\n  get(objId, callback = null) {\n    // If there is a callback, then the get can be async and the object is\n    // not required to be resolved right now.\n    if (callback) {\n      const obj = this.#ensureObj(objId);\n      obj.promise.then(() => callback(obj.data));\n      return null;\n    }\n    // If there isn't a callback, the user expects to get the resolved data\n    // directly.\n    const obj = this.#objs[objId];\n    // If there isn't an object yet or the object isn't resolved, then the\n    // data isn't ready yet!\n    if (!obj || obj.data === INITIAL_DATA) {\n      throw new Error(`Requesting object that isn't resolved yet ${objId}.`);\n    }\n    return obj.data;\n  }\n\n  /**\n   * @param {string} objId\n   * @returns {boolean}\n   */\n  has(objId) {\n    const obj = this.#objs[objId];\n    return !!obj && obj.data !== INITIAL_DATA;\n  }\n\n  /**\n   * @param {string} objId\n   * @returns {boolean}\n   */\n  delete(objId) {\n    const obj = this.#objs[objId];\n    if (!obj || obj.data === INITIAL_DATA) {\n      // Only allow removing the object *after* it's been resolved.\n      return false;\n    }\n    delete this.#objs[objId];\n    return true;\n  }\n\n  /**\n   * Resolves the object `objId` with optional `data`.\n   *\n   * @param {string} objId\n   * @param {any} [data]\n   */\n  resolve(objId, data = null) {\n    const obj = this.#ensureObj(objId);\n    obj.data = data;\n    obj.resolve();\n  }\n\n  clear() {\n    for (const objId in this.#objs) {\n      const { data } = this.#objs[objId];\n      data?.bitmap?.close(); // Release any `ImageBitmap` data.\n    }\n    this.#objs = Object.create(null);\n  }\n\n  *[Symbol.iterator]() {\n    for (const objId in this.#objs) {\n      const { data } = this.#objs[objId];\n\n      if (data === INITIAL_DATA) {\n        continue;\n      }\n      yield [objId, data];\n    }\n  }\n}\n\n/**\n * Allows controlling of the rendering tasks.\n */\nclass RenderTask {\n  #internalRenderTask = null;\n\n  constructor(internalRenderTask) {\n    this.#internalRenderTask = internalRenderTask;\n\n    /**\n     * Callback for incremental rendering -- a function that will be called\n     * each time the rendering is paused.  To continue rendering call the\n     * function that is the first argument to the callback.\n     * @type {function}\n     */\n    this.onContinue = null;\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"getOperatorList\", {\n        value: () => this.#internalRenderTask.operatorList,\n      });\n    }\n  }\n\n  /**\n   * Promise for rendering task completion.\n   * @type {Promise<void>}\n   */\n  get promise() {\n    return this.#internalRenderTask.capability.promise;\n  }\n\n  /**\n   * Cancels the rendering task. If the task is currently rendering it will\n   * not be cancelled until graphics pauses with a timeout. The promise that\n   * this object extends will be rejected when cancelled.\n   *\n   * @param {number} [extraDelay]\n   */\n  cancel(extraDelay = 0) {\n    this.#internalRenderTask.cancel(/* error = */ null, extraDelay);\n  }\n\n  /**\n   * Whether form fields are rendered separately from the main operatorList.\n   * @type {boolean}\n   */\n  get separateAnnots() {\n    const { separateAnnots } = this.#internalRenderTask.operatorList;\n    if (!separateAnnots) {\n      return false;\n    }\n    const { annotationCanvasMap } = this.#internalRenderTask;\n    return (\n      separateAnnots.form ||\n      (separateAnnots.canvas && annotationCanvasMap?.size > 0)\n    );\n  }\n}\n\n/**\n * For internal use only.\n * @ignore\n */\nclass InternalRenderTask {\n  #rAF = null;\n\n  static #canvasInUse = new WeakSet();\n\n  constructor({\n    callback,\n    params,\n    objs,\n    commonObjs,\n    annotationCanvasMap,\n    operatorList,\n    pageIndex,\n    canvasFactory,\n    filterFactory,\n    useRequestAnimationFrame = false,\n    pdfBug = false,\n    pageColors = null,\n  }) {\n    this.callback = callback;\n    this.params = params;\n    this.objs = objs;\n    this.commonObjs = commonObjs;\n    this.annotationCanvasMap = annotationCanvasMap;\n    this.operatorListIdx = null;\n    this.operatorList = operatorList;\n    this._pageIndex = pageIndex;\n    this.canvasFactory = canvasFactory;\n    this.filterFactory = filterFactory;\n    this._pdfBug = pdfBug;\n    this.pageColors = pageColors;\n\n    this.running = false;\n    this.graphicsReadyCallback = null;\n    this.graphicsReady = false;\n    this._useRequestAnimationFrame =\n      useRequestAnimationFrame === true && typeof window !== \"undefined\";\n    this.cancelled = false;\n    this.capability = Promise.withResolvers();\n    this.task = new RenderTask(this);\n    // caching this-bound methods\n    this._cancelBound = this.cancel.bind(this);\n    this._continueBound = this._continue.bind(this);\n    this._scheduleNextBound = this._scheduleNext.bind(this);\n    this._nextBound = this._next.bind(this);\n    this._canvas = params.canvasContext.canvas;\n  }\n\n  get completed() {\n    return this.capability.promise.catch(function () {\n      // Ignoring errors, since we only want to know when rendering is\n      // no longer pending.\n    });\n  }\n\n  initializeGraphics({ transparency = false, optionalContentConfig }) {\n    if (this.cancelled) {\n      return;\n    }\n    if (this._canvas) {\n      if (InternalRenderTask.#canvasInUse.has(this._canvas)) {\n        throw new Error(\n          \"Cannot use the same canvas during multiple render() operations. \" +\n            \"Use different canvas or ensure previous operations were \" +\n            \"cancelled or completed.\"\n        );\n      }\n      InternalRenderTask.#canvasInUse.add(this._canvas);\n    }\n\n    if (this._pdfBug && globalThis.StepperManager?.enabled) {\n      this.stepper = globalThis.StepperManager.create(this._pageIndex);\n      this.stepper.init(this.operatorList);\n      this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();\n    }\n    const { canvasContext, viewport, transform, background } = this.params;\n\n    this.gfx = new CanvasGraphics(\n      canvasContext,\n      this.commonObjs,\n      this.objs,\n      this.canvasFactory,\n      this.filterFactory,\n      { optionalContentConfig },\n      this.annotationCanvasMap,\n      this.pageColors\n    );\n    this.gfx.beginDrawing({\n      transform,\n      viewport,\n      transparency,\n      background,\n    });\n    this.operatorListIdx = 0;\n    this.graphicsReady = true;\n    this.graphicsReadyCallback?.();\n  }\n\n  cancel(error = null, extraDelay = 0) {\n    this.running = false;\n    this.cancelled = true;\n    this.gfx?.endDrawing();\n    if (this.#rAF) {\n      window.cancelAnimationFrame(this.#rAF);\n      this.#rAF = null;\n    }\n    InternalRenderTask.#canvasInUse.delete(this._canvas);\n\n    this.callback(\n      error ||\n        new RenderingCancelledException(\n          `Rendering cancelled, page ${this._pageIndex + 1}`,\n          extraDelay\n        )\n    );\n  }\n\n  operatorListChanged() {\n    if (!this.graphicsReady) {\n      this.graphicsReadyCallback ||= this._continueBound;\n      return;\n    }\n    this.stepper?.updateOperatorList(this.operatorList);\n\n    if (this.running) {\n      return;\n    }\n    this._continue();\n  }\n\n  _continue() {\n    this.running = true;\n    if (this.cancelled) {\n      return;\n    }\n    if (this.task.onContinue) {\n      this.task.onContinue(this._scheduleNextBound);\n    } else {\n      this._scheduleNext();\n    }\n  }\n\n  _scheduleNext() {\n    if (this._useRequestAnimationFrame) {\n      this.#rAF = window.requestAnimationFrame(() => {\n        this.#rAF = null;\n        this._nextBound().catch(this._cancelBound);\n      });\n    } else {\n      Promise.resolve().then(this._nextBound).catch(this._cancelBound);\n    }\n  }\n\n  async _next() {\n    if (this.cancelled) {\n      return;\n    }\n    this.operatorListIdx = this.gfx.executeOperatorList(\n      this.operatorList,\n      this.operatorListIdx,\n      this._continueBound,\n      this.stepper\n    );\n    if (this.operatorListIdx === this.operatorList.argsArray.length) {\n      this.running = false;\n      if (this.operatorList.lastChunk) {\n        this.gfx.endDrawing();\n        InternalRenderTask.#canvasInUse.delete(this._canvas);\n\n        this.callback();\n      }\n    }\n  }\n}\n\n/** @type {string} */\nconst version =\n  typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_VERSION\") : null;\n/** @type {string} */\nconst build =\n  typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_BUILD\") : null;\n\nexport {\n  build,\n  DefaultCanvasFactory,\n  DefaultCMapReaderFactory,\n  DefaultFilterFactory,\n  DefaultStandardFontDataFactory,\n  getDocument,\n  LoopbackPort,\n  PDFDataRangeTransport,\n  PDFDocumentLoadingTask,\n  PDFDocumentProxy,\n  PDFPageProxy,\n  PDFWorker,\n  RenderTask,\n  version,\n};\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * PLEASE NOTE: This file is currently imported in both the `../display/` and\n *              `../scripting_api/` folders, hence be EXTREMELY careful about\n *              introducing any dependencies here since that can lead to an\n *              unexpected/unnecessary size increase of the *built* files.\n */\n\nfunction makeColorComp(n) {\n  return Math.floor(Math.max(0, Math.min(1, n)) * 255)\n    .toString(16)\n    .padStart(2, \"0\");\n}\n\nfunction scaleAndClamp(x) {\n  return Math.max(0, Math.min(255, 255 * x));\n}\n\n// PDF specifications section 10.3\nclass ColorConverters {\n  static CMYK_G([c, y, m, k]) {\n    return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n  }\n\n  static G_CMYK([g]) {\n    return [\"CMYK\", 0, 0, 0, 1 - g];\n  }\n\n  static G_RGB([g]) {\n    return [\"RGB\", g, g, g];\n  }\n\n  static G_rgb([g]) {\n    g = scaleAndClamp(g);\n    return [g, g, g];\n  }\n\n  static G_HTML([g]) {\n    const G = makeColorComp(g);\n    return `#${G}${G}${G}`;\n  }\n\n  static RGB_G([r, g, b]) {\n    return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\n  }\n\n  static RGB_rgb(color) {\n    return color.map(scaleAndClamp);\n  }\n\n  static RGB_HTML(color) {\n    return `#${color.map(makeColorComp).join(\"\")}`;\n  }\n\n  static T_HTML() {\n    return \"#00000000\";\n  }\n\n  static T_rgb() {\n    return [null];\n  }\n\n  static CMYK_RGB([c, y, m, k]) {\n    return [\n      \"RGB\",\n      1 - Math.min(1, c + k),\n      1 - Math.min(1, m + k),\n      1 - Math.min(1, y + k),\n    ];\n  }\n\n  static CMYK_rgb([c, y, m, k]) {\n    return [\n      scaleAndClamp(1 - Math.min(1, c + k)),\n      scaleAndClamp(1 - Math.min(1, m + k)),\n      scaleAndClamp(1 - Math.min(1, y + k)),\n    ];\n  }\n\n  static CMYK_HTML(components) {\n    const rgb = this.CMYK_RGB(components).slice(1);\n    return this.RGB_HTML(rgb);\n  }\n\n  static RGB_CMYK([r, g, b]) {\n    const c = 1 - r;\n    const m = 1 - g;\n    const y = 1 - b;\n    const k = Math.min(c, m, y);\n    return [\"CMYK\", c, m, y, k];\n  }\n}\n\nexport { ColorConverters };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SVG_NS } from \"./display_utils.js\";\nimport { unreachable } from \"../shared/util.js\";\n\nclass BaseSVGFactory {\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseSVGFactory\n    ) {\n      unreachable(\"Cannot initialize BaseSVGFactory.\");\n    }\n  }\n\n  create(width, height, skipDimensions = false) {\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid SVG dimensions\");\n    }\n    const svg = this._createSVG(\"svg:svg\");\n    svg.setAttribute(\"version\", \"1.1\");\n\n    if (!skipDimensions) {\n      svg.setAttribute(\"width\", `${width}px`);\n      svg.setAttribute(\"height\", `${height}px`);\n    }\n\n    svg.setAttribute(\"preserveAspectRatio\", \"none\");\n    svg.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n\n    return svg;\n  }\n\n  createElement(type) {\n    if (typeof type !== \"string\") {\n      throw new Error(\"Invalid SVG element type\");\n    }\n    return this._createSVG(type);\n  }\n\n  /**\n   * @ignore\n   */\n  _createSVG(type) {\n    unreachable(\"Abstract method `_createSVG` called.\");\n  }\n}\n\nclass DOMSVGFactory extends BaseSVGFactory {\n  /**\n   * @ignore\n   */\n  _createSVG(type) {\n    return document.createElementNS(SVG_NS, type);\n  }\n}\n\nexport { BaseSVGFactory, DOMSVGFactory };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_storage\").AnnotationStorage} AnnotationStorage */\n/** @typedef {import(\"./display_utils\").PageViewport} PageViewport */\n/** @typedef {import(\"../../web/interfaces\").IPDFLinkService} IPDFLinkService */\n\nimport { XfaText } from \"./xfa_text.js\";\n\n/**\n * @typedef {Object} XfaLayerParameters\n * @property {PageViewport} viewport\n * @property {HTMLDivElement} div\n * @property {Object} xfaHtml\n * @property {AnnotationStorage} [annotationStorage]\n * @property {IPDFLinkService} linkService\n * @property {string} [intent] - (default value is 'display').\n */\n\nclass XfaLayer {\n  static setupStorage(html, id, element, storage, intent) {\n    const storedData = storage.getValue(id, { value: null });\n    switch (element.name) {\n      case \"textarea\":\n        if (storedData.value !== null) {\n          html.textContent = storedData.value;\n        }\n        if (intent === \"print\") {\n          break;\n        }\n        html.addEventListener(\"input\", event => {\n          storage.setValue(id, { value: event.target.value });\n        });\n        break;\n      case \"input\":\n        if (\n          element.attributes.type === \"radio\" ||\n          element.attributes.type === \"checkbox\"\n        ) {\n          if (storedData.value === element.attributes.xfaOn) {\n            html.setAttribute(\"checked\", true);\n          } else if (storedData.value === element.attributes.xfaOff) {\n            // The checked attribute may have been set when opening the file,\n            // unset through the UI and we're here because of printing.\n            html.removeAttribute(\"checked\");\n          }\n          if (intent === \"print\") {\n            break;\n          }\n          html.addEventListener(\"change\", event => {\n            storage.setValue(id, {\n              value: event.target.checked\n                ? event.target.getAttribute(\"xfaOn\")\n                : event.target.getAttribute(\"xfaOff\"),\n            });\n          });\n        } else {\n          if (storedData.value !== null) {\n            html.setAttribute(\"value\", storedData.value);\n          }\n          if (intent === \"print\") {\n            break;\n          }\n          html.addEventListener(\"input\", event => {\n            storage.setValue(id, { value: event.target.value });\n          });\n        }\n        break;\n      case \"select\":\n        if (storedData.value !== null) {\n          html.setAttribute(\"value\", storedData.value);\n          for (const option of element.children) {\n            if (option.attributes.value === storedData.value) {\n              option.attributes.selected = true;\n            } else if (option.attributes.hasOwnProperty(\"selected\")) {\n              delete option.attributes.selected;\n            }\n          }\n        }\n        html.addEventListener(\"input\", event => {\n          const options = event.target.options;\n          const value =\n            options.selectedIndex === -1\n              ? \"\"\n              : options[options.selectedIndex].value;\n          storage.setValue(id, { value });\n        });\n        break;\n    }\n  }\n\n  static setAttributes({ html, element, storage = null, intent, linkService }) {\n    const { attributes } = element;\n    const isHTMLAnchorElement = html instanceof HTMLAnchorElement;\n\n    if (attributes.type === \"radio\") {\n      // Avoid to have a radio group when printing with the same as one\n      // already displayed.\n      attributes.name = `${attributes.name}-${intent}`;\n    }\n    for (const [key, value] of Object.entries(attributes)) {\n      if (value === null || value === undefined) {\n        continue;\n      }\n\n      switch (key) {\n        case \"class\":\n          if (value.length) {\n            html.setAttribute(key, value.join(\" \"));\n          }\n          break;\n        case \"dataId\":\n          // We don't need to add dataId in the html object but it can\n          // be useful to know its value when writing printing tests:\n          // in this case, don't skip dataId to have its value.\n          break;\n        case \"id\":\n          html.setAttribute(\"data-element-id\", value);\n          break;\n        case \"style\":\n          Object.assign(html.style, value);\n          break;\n        case \"textContent\":\n          html.textContent = value;\n          break;\n        default:\n          if (!isHTMLAnchorElement || (key !== \"href\" && key !== \"newWindow\")) {\n            html.setAttribute(key, value);\n          }\n      }\n    }\n\n    if (isHTMLAnchorElement) {\n      linkService.addLinkAttributes(\n        html,\n        attributes.href,\n        attributes.newWindow\n      );\n    }\n\n    // Set the value after the others to be sure to overwrite any other values.\n    if (storage && attributes.dataId) {\n      this.setupStorage(html, attributes.dataId, element, storage);\n    }\n  }\n\n  /**\n   * Render the XFA layer.\n   *\n   * @param {XfaLayerParameters} parameters\n   */\n  static render(parameters) {\n    const storage = parameters.annotationStorage;\n    const linkService = parameters.linkService;\n    const root = parameters.xfaHtml;\n    const intent = parameters.intent || \"display\";\n    const rootHtml = document.createElement(root.name);\n    if (root.attributes) {\n      this.setAttributes({\n        html: rootHtml,\n        element: root,\n        intent,\n        linkService,\n      });\n    }\n\n    const isNotForRichText = intent !== \"richText\";\n    const rootDiv = parameters.div;\n    rootDiv.append(rootHtml);\n\n    if (parameters.viewport) {\n      const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n      rootDiv.style.transform = transform;\n    }\n\n    // Set defaults.\n    if (isNotForRichText) {\n      rootDiv.setAttribute(\"class\", \"xfaLayer xfaFont\");\n    }\n\n    // Text nodes used for the text highlighter.\n    const textDivs = [];\n\n    // In the rich text context, it's possible to just have a text node without\n    // a root element, so we handle this case here (see issue 17215).\n    if (root.children.length === 0) {\n      if (root.value) {\n        const node = document.createTextNode(root.value);\n        rootHtml.append(node);\n        if (isNotForRichText && XfaText.shouldBuildText(root.name)) {\n          textDivs.push(node);\n        }\n      }\n      return { textDivs };\n    }\n\n    const stack = [[root, -1, rootHtml]];\n\n    while (stack.length > 0) {\n      const [parent, i, html] = stack.at(-1);\n      if (i + 1 === parent.children.length) {\n        stack.pop();\n        continue;\n      }\n\n      const child = parent.children[++stack.at(-1)[1]];\n      if (child === null) {\n        continue;\n      }\n\n      const { name } = child;\n      if (name === \"#text\") {\n        const node = document.createTextNode(child.value);\n        textDivs.push(node);\n        html.append(node);\n        continue;\n      }\n\n      const childHtml = child?.attributes?.xmlns\n        ? document.createElementNS(child.attributes.xmlns, name)\n        : document.createElement(name);\n\n      html.append(childHtml);\n      if (child.attributes) {\n        this.setAttributes({\n          html: childHtml,\n          element: child,\n          storage,\n          intent,\n          linkService,\n        });\n      }\n\n      if (child.children?.length > 0) {\n        stack.push([child, -1, childHtml]);\n      } else if (child.value) {\n        const node = document.createTextNode(child.value);\n        if (isNotForRichText && XfaText.shouldBuildText(name)) {\n          textDivs.push(node);\n        }\n        childHtml.append(node);\n      }\n    }\n\n    /**\n     * TODO: re-enable that stuff once we've JS implementation.\n     * See https://bugzilla.mozilla.org/show_bug.cgi?id=1719465.\n     *\n     * for (const el of rootDiv.querySelectorAll(\n     * \".xfaDisabled input, .xfaDisabled textarea\"\n     * )) {\n     * el.setAttribute(\"disabled\", true);\n     * }\n     * for (const el of rootDiv.querySelectorAll(\n     * \".xfaReadOnly input, .xfaReadOnly textarea\"\n     * )) {\n     * el.setAttribute(\"readOnly\", true);\n     * }\n     */\n\n    for (const el of rootDiv.querySelectorAll(\n      \".xfaNonInteractive input, .xfaNonInteractive textarea\"\n    )) {\n      el.setAttribute(\"readOnly\", true);\n    }\n\n    return {\n      textDivs,\n    };\n  }\n\n  /**\n   * Update the XFA layer.\n   *\n   * @param {XfaLayerParameters} parameters\n   */\n  static update(parameters) {\n    const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n    parameters.div.style.transform = transform;\n    parameters.div.hidden = false;\n  }\n}\n\nexport { XfaLayer };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./api\").PDFPageProxy} PDFPageProxy */\n/** @typedef {import(\"./display_utils\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../web/text_accessibility.js\").TextAccessibilityManager} TextAccessibilityManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../web/interfaces\").IDownloadManager} IDownloadManager */\n/** @typedef {import(\"../../web/interfaces\").IPDFLinkService} IPDFLinkService */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/editor/tools.js\").AnnotationEditorUIManager} AnnotationEditorUIManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../web/struct_tree_layer_builder.js\").StructTreeLayerBuilder} StructTreeLayerBuilder */\n\nimport {\n  AnnotationBorderStyleType,\n  AnnotationEditorType,\n  AnnotationPrefix,\n  AnnotationType,\n  FeatureTest,\n  LINE_FACTOR,\n  shadow,\n  unreachable,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport { PDFDateString, setLayerDimensions } from \"./display_utils.js\";\nimport { AnnotationStorage } from \"./annotation_storage.js\";\nimport { ColorConverters } from \"../shared/scripting_utils.js\";\nimport { DOMSVGFactory } from \"./svg_factory.js\";\nimport { XfaLayer } from \"./xfa_layer.js\";\n\nconst DEFAULT_TAB_INDEX = 1000;\nconst DEFAULT_FONT_SIZE = 9;\nconst GetElementsByNameSet = new WeakSet();\n\nfunction getRectDims(rect) {\n  return {\n    width: rect[2] - rect[0],\n    height: rect[3] - rect[1],\n  };\n}\n\n/**\n * @typedef {Object} AnnotationElementParameters\n * @property {Object} data\n * @property {HTMLDivElement} layer\n * @property {IPDFLinkService} linkService\n * @property {IDownloadManager} [downloadManager]\n * @property {AnnotationStorage} [annotationStorage]\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   for annotation icons. Include trailing slash.\n * @property {boolean} renderForms\n * @property {Object} svgFactory\n * @property {boolean} [enableScripting]\n * @property {boolean} [hasJSActions]\n * @property {Object} [fieldObjects]\n */\n\nclass AnnotationElementFactory {\n  /**\n   * @param {AnnotationElementParameters} parameters\n   * @returns {AnnotationElement}\n   */\n  static create(parameters) {\n    const subtype = parameters.data.annotationType;\n\n    switch (subtype) {\n      case AnnotationType.LINK:\n        return new LinkAnnotationElement(parameters);\n\n      case AnnotationType.TEXT:\n        return new TextAnnotationElement(parameters);\n\n      case AnnotationType.WIDGET:\n        const fieldType = parameters.data.fieldType;\n\n        switch (fieldType) {\n          case \"Tx\":\n            return new TextWidgetAnnotationElement(parameters);\n          case \"Btn\":\n            if (parameters.data.radioButton) {\n              return new RadioButtonWidgetAnnotationElement(parameters);\n            } else if (parameters.data.checkBox) {\n              return new CheckboxWidgetAnnotationElement(parameters);\n            }\n            return new PushButtonWidgetAnnotationElement(parameters);\n          case \"Ch\":\n            return new ChoiceWidgetAnnotationElement(parameters);\n          case \"Sig\":\n            return new SignatureWidgetAnnotationElement(parameters);\n        }\n        return new WidgetAnnotationElement(parameters);\n\n      case AnnotationType.POPUP:\n        return new PopupAnnotationElement(parameters);\n\n      case AnnotationType.FREETEXT:\n        return new FreeTextAnnotationElement(parameters);\n\n      case AnnotationType.LINE:\n        return new LineAnnotationElement(parameters);\n\n      case AnnotationType.SQUARE:\n        return new SquareAnnotationElement(parameters);\n\n      case AnnotationType.CIRCLE:\n        return new CircleAnnotationElement(parameters);\n\n      case AnnotationType.POLYLINE:\n        return new PolylineAnnotationElement(parameters);\n\n      case AnnotationType.CARET:\n        return new CaretAnnotationElement(parameters);\n\n      case AnnotationType.INK:\n        return new InkAnnotationElement(parameters);\n\n      case AnnotationType.POLYGON:\n        return new PolygonAnnotationElement(parameters);\n\n      case AnnotationType.HIGHLIGHT:\n        return new HighlightAnnotationElement(parameters);\n\n      case AnnotationType.UNDERLINE:\n        return new UnderlineAnnotationElement(parameters);\n\n      case AnnotationType.SQUIGGLY:\n        return new SquigglyAnnotationElement(parameters);\n\n      case AnnotationType.STRIKEOUT:\n        return new StrikeOutAnnotationElement(parameters);\n\n      case AnnotationType.STAMP:\n        return new StampAnnotationElement(parameters);\n\n      case AnnotationType.FILEATTACHMENT:\n        return new FileAttachmentAnnotationElement(parameters);\n\n      default:\n        return new AnnotationElement(parameters);\n    }\n  }\n}\n\nclass AnnotationElement {\n  #updates = null;\n\n  #hasBorder = false;\n\n  #popupElement = null;\n\n  constructor(\n    parameters,\n    {\n      isRenderable = false,\n      ignoreBorder = false,\n      createQuadrilaterals = false,\n    } = {}\n  ) {\n    this.isRenderable = isRenderable;\n    this.data = parameters.data;\n    this.layer = parameters.layer;\n    this.linkService = parameters.linkService;\n    this.downloadManager = parameters.downloadManager;\n    this.imageResourcesPath = parameters.imageResourcesPath;\n    this.renderForms = parameters.renderForms;\n    this.svgFactory = parameters.svgFactory;\n    this.annotationStorage = parameters.annotationStorage;\n    this.enableScripting = parameters.enableScripting;\n    this.hasJSActions = parameters.hasJSActions;\n    this._fieldObjects = parameters.fieldObjects;\n    this.parent = parameters.parent;\n\n    if (isRenderable) {\n      this.container = this._createContainer(ignoreBorder);\n    }\n    if (createQuadrilaterals) {\n      this._createQuadrilaterals();\n    }\n  }\n\n  static _hasPopupData({ titleObj, contentsObj, richText }) {\n    return !!(titleObj?.str || contentsObj?.str || richText?.str);\n  }\n\n  get _isEditable() {\n    return this.data.isEditable;\n  }\n\n  get hasPopupData() {\n    return AnnotationElement._hasPopupData(this.data);\n  }\n\n  updateEdited(params) {\n    if (!this.container) {\n      return;\n    }\n\n    this.#updates ||= {\n      rect: this.data.rect.slice(0),\n    };\n\n    const { rect } = params;\n\n    if (rect) {\n      this.#setRectEdited(rect);\n    }\n\n    this.#popupElement?.popup.updateEdited(params);\n  }\n\n  resetEdited() {\n    if (!this.#updates) {\n      return;\n    }\n    this.#setRectEdited(this.#updates.rect);\n    this.#popupElement?.popup.resetEdited();\n    this.#updates = null;\n  }\n\n  #setRectEdited(rect) {\n    const {\n      container: { style },\n      data: { rect: currentRect, rotation },\n      parent: {\n        viewport: {\n          rawDims: { pageWidth, pageHeight, pageX, pageY },\n        },\n      },\n    } = this;\n    currentRect?.splice(0, 4, ...rect);\n    const { width, height } = getRectDims(rect);\n    style.left = `${(100 * (rect[0] - pageX)) / pageWidth}%`;\n    style.top = `${(100 * (pageHeight - rect[3] + pageY)) / pageHeight}%`;\n    if (rotation === 0) {\n      style.width = `${(100 * width) / pageWidth}%`;\n      style.height = `${(100 * height) / pageHeight}%`;\n    } else {\n      this.setRotation(rotation);\n    }\n  }\n\n  /**\n   * Create an empty container for the annotation's HTML element.\n   *\n   * @private\n   * @param {boolean} ignoreBorder\n   * @memberof AnnotationElement\n   * @returns {HTMLElement} A section element.\n   */\n  _createContainer(ignoreBorder) {\n    const {\n      data,\n      parent: { page, viewport },\n    } = this;\n\n    const container = document.createElement(\"section\");\n    container.setAttribute(\"data-annotation-id\", data.id);\n    if (!(this instanceof WidgetAnnotationElement)) {\n      container.tabIndex = DEFAULT_TAB_INDEX;\n    }\n    const { style } = container;\n\n    // The accessibility manager will move the annotation in the DOM in\n    // order to match the visual ordering.\n    // But if an annotation is above an other one, then we must draw it\n    // after the other one whatever the order is in the DOM, hence the\n    // use of the z-index.\n    style.zIndex = this.parent.zIndex++;\n\n    if (data.alternativeText) {\n      container.title = data.alternativeText;\n    }\n\n    if (data.noRotate) {\n      container.classList.add(\"norotate\");\n    }\n\n    if (!data.rect || this instanceof PopupAnnotationElement) {\n      const { rotation } = data;\n      if (!data.hasOwnCanvas && rotation !== 0) {\n        this.setRotation(rotation, container);\n      }\n      return container;\n    }\n\n    const { width, height } = getRectDims(data.rect);\n\n    if (!ignoreBorder && data.borderStyle.width > 0) {\n      style.borderWidth = `${data.borderStyle.width}px`;\n\n      const horizontalRadius = data.borderStyle.horizontalCornerRadius;\n      const verticalRadius = data.borderStyle.verticalCornerRadius;\n      if (horizontalRadius > 0 || verticalRadius > 0) {\n        const radius = `calc(${horizontalRadius}px * var(--scale-factor)) / calc(${verticalRadius}px * var(--scale-factor))`;\n        style.borderRadius = radius;\n      } else if (this instanceof RadioButtonWidgetAnnotationElement) {\n        const radius = `calc(${width}px * var(--scale-factor)) / calc(${height}px * var(--scale-factor))`;\n        style.borderRadius = radius;\n      }\n\n      switch (data.borderStyle.style) {\n        case AnnotationBorderStyleType.SOLID:\n          style.borderStyle = \"solid\";\n          break;\n\n        case AnnotationBorderStyleType.DASHED:\n          style.borderStyle = \"dashed\";\n          break;\n\n        case AnnotationBorderStyleType.BEVELED:\n          warn(\"Unimplemented border style: beveled\");\n          break;\n\n        case AnnotationBorderStyleType.INSET:\n          warn(\"Unimplemented border style: inset\");\n          break;\n\n        case AnnotationBorderStyleType.UNDERLINE:\n          style.borderBottomStyle = \"solid\";\n          break;\n\n        default:\n          break;\n      }\n\n      const borderColor = data.borderColor || null;\n      if (borderColor) {\n        this.#hasBorder = true;\n        style.borderColor = Util.makeHexColor(\n          borderColor[0] | 0,\n          borderColor[1] | 0,\n          borderColor[2] | 0\n        );\n      } else {\n        // Transparent (invisible) border, so do not draw it at all.\n        style.borderWidth = 0;\n      }\n    }\n\n    // Do *not* modify `data.rect`, since that will corrupt the annotation\n    // position on subsequent calls to `_createContainer` (see issue 6804).\n    const rect = Util.normalizeRect([\n      data.rect[0],\n      page.view[3] - data.rect[1] + page.view[1],\n      data.rect[2],\n      page.view[3] - data.rect[3] + page.view[1],\n    ]);\n    const { pageWidth, pageHeight, pageX, pageY } = viewport.rawDims;\n\n    style.left = `${(100 * (rect[0] - pageX)) / pageWidth}%`;\n    style.top = `${(100 * (rect[1] - pageY)) / pageHeight}%`;\n\n    const { rotation } = data;\n    if (data.hasOwnCanvas || rotation === 0) {\n      style.width = `${(100 * width) / pageWidth}%`;\n      style.height = `${(100 * height) / pageHeight}%`;\n    } else {\n      this.setRotation(rotation, container);\n    }\n\n    return container;\n  }\n\n  setRotation(angle, container = this.container) {\n    if (!this.data.rect) {\n      return;\n    }\n    const { pageWidth, pageHeight } = this.parent.viewport.rawDims;\n    const { width, height } = getRectDims(this.data.rect);\n\n    let elementWidth, elementHeight;\n    if (angle % 180 === 0) {\n      elementWidth = (100 * width) / pageWidth;\n      elementHeight = (100 * height) / pageHeight;\n    } else {\n      elementWidth = (100 * height) / pageWidth;\n      elementHeight = (100 * width) / pageHeight;\n    }\n\n    container.style.width = `${elementWidth}%`;\n    container.style.height = `${elementHeight}%`;\n\n    container.setAttribute(\"data-main-rotation\", (360 - angle) % 360);\n  }\n\n  get _commonActions() {\n    const setColor = (jsName, styleName, event) => {\n      const color = event.detail[jsName];\n      const colorType = color[0];\n      const colorArray = color.slice(1);\n      event.target.style[styleName] =\n        ColorConverters[`${colorType}_HTML`](colorArray);\n      this.annotationStorage.setValue(this.data.id, {\n        [styleName]: ColorConverters[`${colorType}_rgb`](colorArray),\n      });\n    };\n\n    return shadow(this, \"_commonActions\", {\n      display: event => {\n        const { display } = event.detail;\n        // See scripting/constants.js for the values of `Display`.\n        // 0 = visible, 1 = hidden, 2 = noPrint and 3 = noView.\n        const hidden = display % 2 === 1;\n        this.container.style.visibility = hidden ? \"hidden\" : \"visible\";\n        this.annotationStorage.setValue(this.data.id, {\n          noView: hidden,\n          noPrint: display === 1 || display === 2,\n        });\n      },\n      print: event => {\n        this.annotationStorage.setValue(this.data.id, {\n          noPrint: !event.detail.print,\n        });\n      },\n      hidden: event => {\n        const { hidden } = event.detail;\n        this.container.style.visibility = hidden ? \"hidden\" : \"visible\";\n        this.annotationStorage.setValue(this.data.id, {\n          noPrint: hidden,\n          noView: hidden,\n        });\n      },\n      focus: event => {\n        setTimeout(() => event.target.focus({ preventScroll: false }), 0);\n      },\n      userName: event => {\n        // tooltip\n        event.target.title = event.detail.userName;\n      },\n      readonly: event => {\n        event.target.disabled = event.detail.readonly;\n      },\n      required: event => {\n        this._setRequired(event.target, event.detail.required);\n      },\n      bgColor: event => {\n        setColor(\"bgColor\", \"backgroundColor\", event);\n      },\n      fillColor: event => {\n        setColor(\"fillColor\", \"backgroundColor\", event);\n      },\n      fgColor: event => {\n        setColor(\"fgColor\", \"color\", event);\n      },\n      textColor: event => {\n        setColor(\"textColor\", \"color\", event);\n      },\n      borderColor: event => {\n        setColor(\"borderColor\", \"borderColor\", event);\n      },\n      strokeColor: event => {\n        setColor(\"strokeColor\", \"borderColor\", event);\n      },\n      rotation: event => {\n        const angle = event.detail.rotation;\n        this.setRotation(angle);\n        this.annotationStorage.setValue(this.data.id, {\n          rotation: angle,\n        });\n      },\n    });\n  }\n\n  _dispatchEventFromSandbox(actions, jsEvent) {\n    const commonActions = this._commonActions;\n    for (const name of Object.keys(jsEvent.detail)) {\n      const action = actions[name] || commonActions[name];\n      action?.(jsEvent);\n    }\n  }\n\n  _setDefaultPropertiesFromJS(element) {\n    if (!this.enableScripting) {\n      return;\n    }\n\n    // Some properties may have been updated thanks to JS.\n    const storedData = this.annotationStorage.getRawValue(this.data.id);\n    if (!storedData) {\n      return;\n    }\n\n    const commonActions = this._commonActions;\n    for (const [actionName, detail] of Object.entries(storedData)) {\n      const action = commonActions[actionName];\n      if (action) {\n        const eventProxy = {\n          detail: {\n            [actionName]: detail,\n          },\n          target: element,\n        };\n        action(eventProxy);\n        // The action has been consumed: no need to keep it.\n        delete storedData[actionName];\n      }\n    }\n  }\n\n  /**\n   * Create quadrilaterals from the annotation's quadpoints.\n   *\n   * @private\n   * @memberof AnnotationElement\n   */\n  _createQuadrilaterals() {\n    if (!this.container) {\n      return;\n    }\n    const { quadPoints } = this.data;\n    if (!quadPoints) {\n      return;\n    }\n\n    const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x =>\n      Math.fround(x)\n    );\n\n    if (quadPoints.length === 8) {\n      const [trX, trY, blX, blY] = quadPoints.subarray(2, 6);\n      if (\n        rectTrX === trX &&\n        rectTrY === trY &&\n        rectBlX === blX &&\n        rectBlY === blY\n      ) {\n        // The quadpoints cover the whole annotation rectangle, so no need to\n        // create a quadrilateral.\n        return;\n      }\n    }\n\n    const { style } = this.container;\n    let svgBuffer;\n    if (this.#hasBorder) {\n      const { borderColor, borderWidth } = style;\n      style.borderWidth = 0;\n      svgBuffer = [\n        \"url('data:image/svg+xml;utf8,\",\n        `<svg xmlns=\"http://www.w3.org/2000/svg\"`,\n        ` preserveAspectRatio=\"none\" viewBox=\"0 0 1 1\">`,\n        `<g fill=\"transparent\" stroke=\"${borderColor}\" stroke-width=\"${borderWidth}\">`,\n      ];\n      this.container.classList.add(\"hasBorder\");\n    }\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      this.container.classList.add(\"hasClipPath\");\n    }\n\n    const width = rectTrX - rectBlX;\n    const height = rectTrY - rectBlY;\n\n    const { svgFactory } = this;\n    const svg = svgFactory.createElement(\"svg\");\n    svg.classList.add(\"quadrilateralsContainer\");\n    svg.setAttribute(\"width\", 0);\n    svg.setAttribute(\"height\", 0);\n    const defs = svgFactory.createElement(\"defs\");\n    svg.append(defs);\n    const clipPath = svgFactory.createElement(\"clipPath\");\n    const id = `clippath_${this.data.id}`;\n    clipPath.setAttribute(\"id\", id);\n    clipPath.setAttribute(\"clipPathUnits\", \"objectBoundingBox\");\n    defs.append(clipPath);\n\n    for (let i = 2, ii = quadPoints.length; i < ii; i += 8) {\n      const trX = quadPoints[i];\n      const trY = quadPoints[i + 1];\n      const blX = quadPoints[i + 2];\n      const blY = quadPoints[i + 3];\n      const rect = svgFactory.createElement(\"rect\");\n      const x = (blX - rectBlX) / width;\n      const y = (rectTrY - trY) / height;\n      const rectWidth = (trX - blX) / width;\n      const rectHeight = (trY - blY) / height;\n      rect.setAttribute(\"x\", x);\n      rect.setAttribute(\"y\", y);\n      rect.setAttribute(\"width\", rectWidth);\n      rect.setAttribute(\"height\", rectHeight);\n      clipPath.append(rect);\n      svgBuffer?.push(\n        `<rect vector-effect=\"non-scaling-stroke\" x=\"${x}\" y=\"${y}\" width=\"${rectWidth}\" height=\"${rectHeight}\"/>`\n      );\n    }\n\n    if (this.#hasBorder) {\n      svgBuffer.push(`</g></svg>')`);\n      style.backgroundImage = svgBuffer.join(\"\");\n    }\n\n    this.container.append(svg);\n    this.container.style.clipPath = `url(#${id})`;\n  }\n\n  /**\n   * Create a popup for the annotation's HTML element. This is used for\n   * annotations that do not have a Popup entry in the dictionary, but\n   * are of a type that works with popups (such as Highlight annotations).\n   *\n   * @private\n   * @memberof AnnotationElement\n   */\n  _createPopup() {\n    const { data } = this;\n\n    const popup = (this.#popupElement = new PopupAnnotationElement({\n      data: {\n        color: data.color,\n        titleObj: data.titleObj,\n        modificationDate: data.modificationDate,\n        contentsObj: data.contentsObj,\n        richText: data.richText,\n        parentRect: data.rect,\n        borderStyle: 0,\n        id: `popup_${data.id}`,\n        rotation: data.rotation,\n      },\n      parent: this.parent,\n      elements: [this],\n    }));\n    this.parent.div.append(popup.render());\n  }\n\n  /**\n   * Render the annotation's HTML element(s).\n   *\n   * @public\n   * @memberof AnnotationElement\n   */\n  render() {\n    unreachable(\"Abstract method `AnnotationElement.render` called\");\n  }\n\n  /**\n   * @private\n   * @returns {Array}\n   */\n  _getElementsByName(name, skipId = null) {\n    const fields = [];\n\n    if (this._fieldObjects) {\n      const fieldObj = this._fieldObjects[name];\n      if (fieldObj) {\n        for (const { page, id, exportValues } of fieldObj) {\n          if (page === -1) {\n            continue;\n          }\n          if (id === skipId) {\n            continue;\n          }\n          const exportValue =\n            typeof exportValues === \"string\" ? exportValues : null;\n\n          const domElement = document.querySelector(\n            `[data-element-id=\"${id}\"]`\n          );\n          if (domElement && !GetElementsByNameSet.has(domElement)) {\n            warn(`_getElementsByName - element not allowed: ${id}`);\n            continue;\n          }\n          fields.push({ id, exportValue, domElement });\n        }\n      }\n      return fields;\n    }\n    // Fallback to a regular DOM lookup, to ensure that the standalone\n    // viewer components won't break.\n    for (const domElement of document.getElementsByName(name)) {\n      const { exportValue } = domElement;\n      const id = domElement.getAttribute(\"data-element-id\");\n      if (id === skipId) {\n        continue;\n      }\n      if (!GetElementsByNameSet.has(domElement)) {\n        continue;\n      }\n      fields.push({ id, exportValue, domElement });\n    }\n    return fields;\n  }\n\n  show() {\n    if (this.container) {\n      this.container.hidden = false;\n    }\n    this.popup?.maybeShow();\n  }\n\n  hide() {\n    if (this.container) {\n      this.container.hidden = true;\n    }\n    this.popup?.forceHide();\n  }\n\n  /**\n   * Get the HTML element(s) which can trigger a popup when clicked or hovered.\n   *\n   * @public\n   * @memberof AnnotationElement\n   * @returns {Array<HTMLElement>|HTMLElement} An array of elements or an\n   *          element.\n   */\n  getElementsToTriggerPopup() {\n    return this.container;\n  }\n\n  addHighlightArea() {\n    const triggers = this.getElementsToTriggerPopup();\n    if (Array.isArray(triggers)) {\n      for (const element of triggers) {\n        element.classList.add(\"highlightArea\");\n      }\n    } else {\n      triggers.classList.add(\"highlightArea\");\n    }\n  }\n\n  _editOnDoubleClick() {\n    if (!this._isEditable) {\n      return;\n    }\n    const {\n      annotationEditorType: mode,\n      data: { id: editId },\n    } = this;\n    this.container.addEventListener(\"dblclick\", () => {\n      this.linkService.eventBus?.dispatch(\"switchannotationeditormode\", {\n        source: this,\n        mode,\n        editId,\n      });\n    });\n  }\n}\n\nclass LinkAnnotationElement extends AnnotationElement {\n  constructor(parameters, options = null) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: !!options?.ignoreBorder,\n      createQuadrilaterals: true,\n    });\n    this.isTooltipOnly = parameters.data.isTooltipOnly;\n  }\n\n  render() {\n    const { data, linkService } = this;\n    const link = document.createElement(\"a\");\n    link.setAttribute(\"data-element-id\", data.id);\n    let isBound = false;\n\n    if (data.url) {\n      linkService.addLinkAttributes(link, data.url, data.newWindow);\n      isBound = true;\n    } else if (data.action) {\n      this._bindNamedAction(link, data.action);\n      isBound = true;\n    } else if (data.attachment) {\n      this.#bindAttachment(link, data.attachment, data.attachmentDest);\n      isBound = true;\n    } else if (data.setOCGState) {\n      this.#bindSetOCGState(link, data.setOCGState);\n      isBound = true;\n    } else if (data.dest) {\n      this._bindLink(link, data.dest);\n      isBound = true;\n    } else {\n      if (\n        data.actions &&\n        (data.actions.Action ||\n          data.actions[\"Mouse Up\"] ||\n          data.actions[\"Mouse Down\"]) &&\n        this.enableScripting &&\n        this.hasJSActions\n      ) {\n        this._bindJSAction(link, data);\n        isBound = true;\n      }\n\n      if (data.resetForm) {\n        this._bindResetFormAction(link, data.resetForm);\n        isBound = true;\n      } else if (this.isTooltipOnly && !isBound) {\n        this._bindLink(link, \"\");\n        isBound = true;\n      }\n    }\n\n    this.container.classList.add(\"linkAnnotation\");\n    if (isBound) {\n      this.container.append(link);\n    }\n\n    return this.container;\n  }\n\n  #setInternalLink() {\n    this.container.setAttribute(\"data-internal-link\", \"\");\n  }\n\n  /**\n   * Bind internal links to the link element.\n   *\n   * @private\n   * @param {Object} link\n   * @param {Object} destination\n   * @memberof LinkAnnotationElement\n   */\n  _bindLink(link, destination) {\n    link.href = this.linkService.getDestinationHash(destination);\n    link.onclick = () => {\n      if (destination) {\n        this.linkService.goToDestination(destination);\n      }\n      return false;\n    };\n    if (destination || destination === /* isTooltipOnly = */ \"\") {\n      this.#setInternalLink();\n    }\n  }\n\n  /**\n   * Bind named actions to the link element.\n   *\n   * @private\n   * @param {Object} link\n   * @param {Object} action\n   * @memberof LinkAnnotationElement\n   */\n  _bindNamedAction(link, action) {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    link.onclick = () => {\n      this.linkService.executeNamedAction(action);\n      return false;\n    };\n    this.#setInternalLink();\n  }\n\n  /**\n   * Bind attachments to the link element.\n   * @param {Object} link\n   * @param {Object} attachment\n   * @param {str} [dest]\n   */\n  #bindAttachment(link, attachment, dest = null) {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    if (attachment.description) {\n      link.title = attachment.description;\n    }\n    link.onclick = () => {\n      this.downloadManager?.openOrDownloadData(\n        attachment.content,\n        attachment.filename,\n        dest\n      );\n      return false;\n    };\n    this.#setInternalLink();\n  }\n\n  /**\n   * Bind SetOCGState actions to the link element.\n   * @param {Object} link\n   * @param {Object} action\n   */\n  #bindSetOCGState(link, action) {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    link.onclick = () => {\n      this.linkService.executeSetOCGState(action);\n      return false;\n    };\n    this.#setInternalLink();\n  }\n\n  /**\n   * Bind JS actions to the link element.\n   *\n   * @private\n   * @param {Object} link\n   * @param {Object} data\n   * @memberof LinkAnnotationElement\n   */\n  _bindJSAction(link, data) {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    const map = new Map([\n      [\"Action\", \"onclick\"],\n      [\"Mouse Up\", \"onmouseup\"],\n      [\"Mouse Down\", \"onmousedown\"],\n    ]);\n    for (const name of Object.keys(data.actions)) {\n      const jsName = map.get(name);\n      if (!jsName) {\n        continue;\n      }\n      link[jsName] = () => {\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: data.id,\n            name,\n          },\n        });\n        return false;\n      };\n    }\n\n    if (!link.onclick) {\n      link.onclick = () => false;\n    }\n    this.#setInternalLink();\n  }\n\n  _bindResetFormAction(link, resetForm) {\n    const otherClickAction = link.onclick;\n    if (!otherClickAction) {\n      link.href = this.linkService.getAnchorUrl(\"\");\n    }\n    this.#setInternalLink();\n\n    if (!this._fieldObjects) {\n      warn(\n        `_bindResetFormAction - \"resetForm\" action not supported, ` +\n          \"ensure that the `fieldObjects` parameter is provided.\"\n      );\n      if (!otherClickAction) {\n        link.onclick = () => false;\n      }\n      return;\n    }\n\n    link.onclick = () => {\n      otherClickAction?.();\n\n      const {\n        fields: resetFormFields,\n        refs: resetFormRefs,\n        include,\n      } = resetForm;\n\n      const allFields = [];\n      if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) {\n        const fieldIds = new Set(resetFormRefs);\n        for (const fieldName of resetFormFields) {\n          const fields = this._fieldObjects[fieldName] || [];\n          for (const { id } of fields) {\n            fieldIds.add(id);\n          }\n        }\n        for (const fields of Object.values(this._fieldObjects)) {\n          for (const field of fields) {\n            if (fieldIds.has(field.id) === include) {\n              allFields.push(field);\n            }\n          }\n        }\n      } else {\n        for (const fields of Object.values(this._fieldObjects)) {\n          allFields.push(...fields);\n        }\n      }\n\n      const storage = this.annotationStorage;\n      const allIds = [];\n      for (const field of allFields) {\n        const { id } = field;\n        allIds.push(id);\n        switch (field.type) {\n          case \"text\": {\n            const value = field.defaultValue || \"\";\n            storage.setValue(id, { value });\n            break;\n          }\n          case \"checkbox\":\n          case \"radiobutton\": {\n            const value = field.defaultValue === field.exportValues;\n            storage.setValue(id, { value });\n            break;\n          }\n          case \"combobox\":\n          case \"listbox\": {\n            const value = field.defaultValue || \"\";\n            storage.setValue(id, { value });\n            break;\n          }\n          default:\n            continue;\n        }\n\n        const domElement = document.querySelector(`[data-element-id=\"${id}\"]`);\n        if (!domElement) {\n          continue;\n        } else if (!GetElementsByNameSet.has(domElement)) {\n          warn(`_bindResetFormAction - element not allowed: ${id}`);\n          continue;\n        }\n        domElement.dispatchEvent(new Event(\"resetform\"));\n      }\n\n      if (this.enableScripting) {\n        // Update the values in the sandbox.\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: \"app\",\n            ids: allIds,\n            name: \"ResetForm\",\n          },\n        });\n      }\n\n      return false;\n    };\n  }\n}\n\nclass TextAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: true });\n  }\n\n  render() {\n    this.container.classList.add(\"textAnnotation\");\n\n    const image = document.createElement(\"img\");\n    image.src =\n      this.imageResourcesPath +\n      \"annotation-\" +\n      this.data.name.toLowerCase() +\n      \".svg\";\n    image.setAttribute(\"data-l10n-id\", \"pdfjs-text-annotation-type\");\n    image.setAttribute(\n      \"data-l10n-args\",\n      JSON.stringify({ type: this.data.name })\n    );\n\n    if (!this.data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    this.container.append(image);\n    return this.container;\n  }\n}\n\nclass WidgetAnnotationElement extends AnnotationElement {\n  render() {\n    // Show only the container for unsupported field types.\n    return this.container;\n  }\n\n  showElementAndHideCanvas(element) {\n    if (this.data.hasOwnCanvas) {\n      if (element.previousSibling?.nodeName === \"CANVAS\") {\n        element.previousSibling.hidden = true;\n      }\n      element.hidden = false;\n    }\n  }\n\n  _getKeyModifier(event) {\n    return FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey;\n  }\n\n  _setEventListener(element, elementData, baseName, eventName, valueGetter) {\n    if (baseName.includes(\"mouse\")) {\n      // Mouse events\n      element.addEventListener(baseName, event => {\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: this.data.id,\n            name: eventName,\n            value: valueGetter(event),\n            shift: event.shiftKey,\n            modifier: this._getKeyModifier(event),\n          },\n        });\n      });\n    } else {\n      // Non-mouse events\n      element.addEventListener(baseName, event => {\n        if (baseName === \"blur\") {\n          if (!elementData.focused || !event.relatedTarget) {\n            return;\n          }\n          elementData.focused = false;\n        } else if (baseName === \"focus\") {\n          if (elementData.focused) {\n            return;\n          }\n          elementData.focused = true;\n        }\n\n        if (!valueGetter) {\n          return;\n        }\n\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: this.data.id,\n            name: eventName,\n            value: valueGetter(event),\n          },\n        });\n      });\n    }\n  }\n\n  _setEventListeners(element, elementData, names, getter) {\n    for (const [baseName, eventName] of names) {\n      if (eventName === \"Action\" || this.data.actions?.[eventName]) {\n        if (eventName === \"Focus\" || eventName === \"Blur\") {\n          elementData ||= { focused: false };\n        }\n        this._setEventListener(\n          element,\n          elementData,\n          baseName,\n          eventName,\n          getter\n        );\n        if (eventName === \"Focus\" && !this.data.actions?.Blur) {\n          // Ensure that elementData will have the correct value.\n          this._setEventListener(element, elementData, \"blur\", \"Blur\", null);\n        } else if (eventName === \"Blur\" && !this.data.actions?.Focus) {\n          this._setEventListener(element, elementData, \"focus\", \"Focus\", null);\n        }\n      }\n    }\n  }\n\n  _setBackgroundColor(element) {\n    const color = this.data.backgroundColor || null;\n    element.style.backgroundColor =\n      color === null\n        ? \"transparent\"\n        : Util.makeHexColor(color[0], color[1], color[2]);\n  }\n\n  /**\n   * Apply text styles to the text in the element.\n   *\n   * @private\n   * @param {HTMLDivElement} element\n   * @memberof TextWidgetAnnotationElement\n   */\n  _setTextStyle(element) {\n    const TEXT_ALIGNMENT = [\"left\", \"center\", \"right\"];\n    const { fontColor } = this.data.defaultAppearanceData;\n    const fontSize =\n      this.data.defaultAppearanceData.fontSize || DEFAULT_FONT_SIZE;\n\n    const style = element.style;\n\n    // TODO: If the font-size is zero, calculate it based on the height and\n    //       width of the element.\n    // Not setting `style.fontSize` will use the default font-size for now.\n\n    // We don't use the font, as specified in the PDF document, for the <input>\n    // element. Hence using the original `fontSize` could look bad, which is why\n    // it's instead based on the field height.\n    // If the height is \"big\" then it could lead to a too big font size\n    // so in this case use the one we've in the pdf (hence the min).\n    let computedFontSize;\n    const BORDER_SIZE = 2;\n    const roundToOneDecimal = x => Math.round(10 * x) / 10;\n    if (this.data.multiLine) {\n      const height = Math.abs(\n        this.data.rect[3] - this.data.rect[1] - BORDER_SIZE\n      );\n      const numberOfLines = Math.round(height / (LINE_FACTOR * fontSize)) || 1;\n      const lineHeight = height / numberOfLines;\n      computedFontSize = Math.min(\n        fontSize,\n        roundToOneDecimal(lineHeight / LINE_FACTOR)\n      );\n    } else {\n      const height = Math.abs(\n        this.data.rect[3] - this.data.rect[1] - BORDER_SIZE\n      );\n      computedFontSize = Math.min(\n        fontSize,\n        roundToOneDecimal(height / LINE_FACTOR)\n      );\n    }\n    style.fontSize = `calc(${computedFontSize}px * var(--scale-factor))`;\n\n    style.color = Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]);\n\n    if (this.data.textAlignment !== null) {\n      style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];\n    }\n  }\n\n  _setRequired(element, isRequired) {\n    if (isRequired) {\n      element.setAttribute(\"required\", true);\n    } else {\n      element.removeAttribute(\"required\");\n    }\n    element.setAttribute(\"aria-required\", isRequired);\n  }\n}\n\nclass TextWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    const isRenderable =\n      parameters.renderForms ||\n      parameters.data.hasOwnCanvas ||\n      (!parameters.data.hasAppearance && !!parameters.data.fieldValue);\n    super(parameters, { isRenderable });\n  }\n\n  setPropertyOnSiblings(base, key, value, keyInStorage) {\n    const storage = this.annotationStorage;\n    for (const element of this._getElementsByName(\n      base.name,\n      /* skipId = */ base.id\n    )) {\n      if (element.domElement) {\n        element.domElement[key] = value;\n      }\n      storage.setValue(element.id, { [keyInStorage]: value });\n    }\n  }\n\n  render() {\n    const storage = this.annotationStorage;\n    const id = this.data.id;\n\n    this.container.classList.add(\"textWidgetAnnotation\");\n\n    let element = null;\n    if (this.renderForms) {\n      // NOTE: We cannot set the values using `element.value` below, since it\n      //       prevents the AnnotationLayer rasterizer in `test/driver.js`\n      //       from parsing the elements correctly for the reference tests.\n      const storedData = storage.getValue(id, {\n        value: this.data.fieldValue,\n      });\n      let textContent = storedData.value || \"\";\n      const maxLen = storage.getValue(id, {\n        charLimit: this.data.maxLen,\n      }).charLimit;\n      if (maxLen && textContent.length > maxLen) {\n        textContent = textContent.slice(0, maxLen);\n      }\n\n      let fieldFormattedValues =\n        storedData.formattedValue || this.data.textContent?.join(\"\\n\") || null;\n      if (fieldFormattedValues && this.data.comb) {\n        fieldFormattedValues = fieldFormattedValues.replaceAll(/\\s+/g, \"\");\n      }\n\n      const elementData = {\n        userValue: textContent,\n        formattedValue: fieldFormattedValues,\n        lastCommittedValue: null,\n        commitKey: 1,\n        focused: false,\n      };\n\n      if (this.data.multiLine) {\n        element = document.createElement(\"textarea\");\n        element.textContent = fieldFormattedValues ?? textContent;\n        if (this.data.doNotScroll) {\n          element.style.overflowY = \"hidden\";\n        }\n      } else {\n        element = document.createElement(\"input\");\n        element.type = \"text\";\n        element.setAttribute(\"value\", fieldFormattedValues ?? textContent);\n        if (this.data.doNotScroll) {\n          element.style.overflowX = \"hidden\";\n        }\n      }\n      if (this.data.hasOwnCanvas) {\n        element.hidden = true;\n      }\n      GetElementsByNameSet.add(element);\n      element.setAttribute(\"data-element-id\", id);\n\n      element.disabled = this.data.readOnly;\n      element.name = this.data.fieldName;\n      element.tabIndex = DEFAULT_TAB_INDEX;\n\n      this._setRequired(element, this.data.required);\n\n      if (maxLen) {\n        element.maxLength = maxLen;\n      }\n\n      element.addEventListener(\"input\", event => {\n        storage.setValue(id, { value: event.target.value });\n        this.setPropertyOnSiblings(\n          element,\n          \"value\",\n          event.target.value,\n          \"value\"\n        );\n        elementData.formattedValue = null;\n      });\n\n      element.addEventListener(\"resetform\", event => {\n        const defaultValue = this.data.defaultFieldValue ?? \"\";\n        element.value = elementData.userValue = defaultValue;\n        elementData.formattedValue = null;\n      });\n\n      let blurListener = event => {\n        const { formattedValue } = elementData;\n        if (formattedValue !== null && formattedValue !== undefined) {\n          event.target.value = formattedValue;\n        }\n        // Reset the cursor position to the start of the field (issue 12359).\n        event.target.scrollLeft = 0;\n      };\n\n      if (this.enableScripting && this.hasJSActions) {\n        element.addEventListener(\"focus\", event => {\n          if (elementData.focused) {\n            return;\n          }\n          const { target } = event;\n          if (elementData.userValue) {\n            target.value = elementData.userValue;\n          }\n          elementData.lastCommittedValue = target.value;\n          elementData.commitKey = 1;\n          if (!this.data.actions?.Focus) {\n            elementData.focused = true;\n          }\n        });\n\n        element.addEventListener(\"updatefromsandbox\", jsEvent => {\n          this.showElementAndHideCanvas(jsEvent.target);\n          const actions = {\n            value(event) {\n              elementData.userValue = event.detail.value ?? \"\";\n              storage.setValue(id, { value: elementData.userValue.toString() });\n              event.target.value = elementData.userValue;\n            },\n            formattedValue(event) {\n              const { formattedValue } = event.detail;\n              elementData.formattedValue = formattedValue;\n              if (\n                formattedValue !== null &&\n                formattedValue !== undefined &&\n                event.target !== document.activeElement\n              ) {\n                // Input hasn't the focus so display formatted string\n                event.target.value = formattedValue;\n              }\n              storage.setValue(id, {\n                formattedValue,\n              });\n            },\n            selRange(event) {\n              event.target.setSelectionRange(...event.detail.selRange);\n            },\n            charLimit: event => {\n              const { charLimit } = event.detail;\n              const { target } = event;\n              if (charLimit === 0) {\n                target.removeAttribute(\"maxLength\");\n                return;\n              }\n\n              target.setAttribute(\"maxLength\", charLimit);\n              let value = elementData.userValue;\n              if (!value || value.length <= charLimit) {\n                return;\n              }\n              value = value.slice(0, charLimit);\n              target.value = elementData.userValue = value;\n              storage.setValue(id, { value });\n\n              this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n                source: this,\n                detail: {\n                  id,\n                  name: \"Keystroke\",\n                  value,\n                  willCommit: true,\n                  commitKey: 1,\n                  selStart: target.selectionStart,\n                  selEnd: target.selectionEnd,\n                },\n              });\n            },\n          };\n          this._dispatchEventFromSandbox(actions, jsEvent);\n        });\n\n        // Even if the field hasn't any actions\n        // leaving it can still trigger some actions with Calculate\n        element.addEventListener(\"keydown\", event => {\n          elementData.commitKey = 1;\n          // If the key is one of Escape, Enter then the data are committed.\n          // If we've a Tab then data will be committed on blur.\n          let commitKey = -1;\n          if (event.key === \"Escape\") {\n            commitKey = 0;\n          } else if (event.key === \"Enter\" && !this.data.multiLine) {\n            // When we've a multiline field, \"Enter\" key is a key as the other\n            // hence we don't commit the data (Acrobat behaves the same way)\n            // (see issue #15627).\n            commitKey = 2;\n          } else if (event.key === \"Tab\") {\n            elementData.commitKey = 3;\n          }\n          if (commitKey === -1) {\n            return;\n          }\n          const { value } = event.target;\n          if (elementData.lastCommittedValue === value) {\n            return;\n          }\n          elementData.lastCommittedValue = value;\n          // Save the entered value\n          elementData.userValue = value;\n          this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n            source: this,\n            detail: {\n              id,\n              name: \"Keystroke\",\n              value,\n              willCommit: true,\n              commitKey,\n              selStart: event.target.selectionStart,\n              selEnd: event.target.selectionEnd,\n            },\n          });\n        });\n        const _blurListener = blurListener;\n        blurListener = null;\n        element.addEventListener(\"blur\", event => {\n          if (!elementData.focused || !event.relatedTarget) {\n            return;\n          }\n          if (!this.data.actions?.Blur) {\n            elementData.focused = false;\n          }\n          const { value } = event.target;\n          elementData.userValue = value;\n          if (elementData.lastCommittedValue !== value) {\n            this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n              source: this,\n              detail: {\n                id,\n                name: \"Keystroke\",\n                value,\n                willCommit: true,\n                commitKey: elementData.commitKey,\n                selStart: event.target.selectionStart,\n                selEnd: event.target.selectionEnd,\n              },\n            });\n          }\n          _blurListener(event);\n        });\n\n        if (this.data.actions?.Keystroke) {\n          element.addEventListener(\"beforeinput\", event => {\n            elementData.lastCommittedValue = null;\n            const { data, target } = event;\n            const { value, selectionStart, selectionEnd } = target;\n\n            let selStart = selectionStart,\n              selEnd = selectionEnd;\n\n            switch (event.inputType) {\n              // https://rawgit.com/w3c/input-events/v1/index.html#interface-InputEvent-Attributes\n              case \"deleteWordBackward\": {\n                const match = value\n                  .substring(0, selectionStart)\n                  .match(/\\w*[^\\w]*$/);\n                if (match) {\n                  selStart -= match[0].length;\n                }\n                break;\n              }\n              case \"deleteWordForward\": {\n                const match = value\n                  .substring(selectionStart)\n                  .match(/^[^\\w]*\\w*/);\n                if (match) {\n                  selEnd += match[0].length;\n                }\n                break;\n              }\n              case \"deleteContentBackward\":\n                if (selectionStart === selectionEnd) {\n                  selStart -= 1;\n                }\n                break;\n              case \"deleteContentForward\":\n                if (selectionStart === selectionEnd) {\n                  selEnd += 1;\n                }\n                break;\n            }\n\n            // We handle the event ourselves.\n            event.preventDefault();\n            this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n              source: this,\n              detail: {\n                id,\n                name: \"Keystroke\",\n                value,\n                change: data || \"\",\n                willCommit: false,\n                selStart,\n                selEnd,\n              },\n            });\n          });\n        }\n\n        this._setEventListeners(\n          element,\n          elementData,\n          [\n            [\"focus\", \"Focus\"],\n            [\"blur\", \"Blur\"],\n            [\"mousedown\", \"Mouse Down\"],\n            [\"mouseenter\", \"Mouse Enter\"],\n            [\"mouseleave\", \"Mouse Exit\"],\n            [\"mouseup\", \"Mouse Up\"],\n          ],\n          event => event.target.value\n        );\n      }\n\n      if (blurListener) {\n        element.addEventListener(\"blur\", blurListener);\n      }\n\n      if (this.data.comb) {\n        const fieldWidth = this.data.rect[2] - this.data.rect[0];\n        const combWidth = fieldWidth / maxLen;\n\n        element.classList.add(\"comb\");\n        element.style.letterSpacing = `calc(${combWidth}px * var(--scale-factor) - 1ch)`;\n      }\n    } else {\n      element = document.createElement(\"div\");\n      element.textContent = this.data.fieldValue;\n      element.style.verticalAlign = \"middle\";\n      element.style.display = \"table-cell\";\n\n      if (this.data.hasOwnCanvas) {\n        element.hidden = true;\n      }\n    }\n\n    this._setTextStyle(element);\n    this._setBackgroundColor(element);\n    this._setDefaultPropertiesFromJS(element);\n\n    this.container.append(element);\n    return this.container;\n  }\n}\n\nclass SignatureWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: !!parameters.data.hasOwnCanvas });\n  }\n}\n\nclass CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: parameters.renderForms });\n  }\n\n  render() {\n    const storage = this.annotationStorage;\n    const data = this.data;\n    const id = data.id;\n    let value = storage.getValue(id, {\n      value: data.exportValue === data.fieldValue,\n    }).value;\n    if (typeof value === \"string\") {\n      // The value has been changed through js and set in annotationStorage.\n      value = value !== \"Off\";\n      storage.setValue(id, { value });\n    }\n\n    this.container.classList.add(\"buttonWidgetAnnotation\", \"checkBox\");\n\n    const element = document.createElement(\"input\");\n    GetElementsByNameSet.add(element);\n    element.setAttribute(\"data-element-id\", id);\n\n    element.disabled = data.readOnly;\n    this._setRequired(element, this.data.required);\n    element.type = \"checkbox\";\n    element.name = data.fieldName;\n    if (value) {\n      element.setAttribute(\"checked\", true);\n    }\n    element.setAttribute(\"exportValue\", data.exportValue);\n    element.tabIndex = DEFAULT_TAB_INDEX;\n\n    element.addEventListener(\"change\", event => {\n      const { name, checked } = event.target;\n      for (const checkbox of this._getElementsByName(name, /* skipId = */ id)) {\n        const curChecked = checked && checkbox.exportValue === data.exportValue;\n        if (checkbox.domElement) {\n          checkbox.domElement.checked = curChecked;\n        }\n        storage.setValue(checkbox.id, { value: curChecked });\n      }\n      storage.setValue(id, { value: checked });\n    });\n\n    element.addEventListener(\"resetform\", event => {\n      const defaultValue = data.defaultFieldValue || \"Off\";\n      event.target.checked = defaultValue === data.exportValue;\n    });\n\n    if (this.enableScripting && this.hasJSActions) {\n      element.addEventListener(\"updatefromsandbox\", jsEvent => {\n        const actions = {\n          value(event) {\n            event.target.checked = event.detail.value !== \"Off\";\n            storage.setValue(id, { value: event.target.checked });\n          },\n        };\n        this._dispatchEventFromSandbox(actions, jsEvent);\n      });\n\n      this._setEventListeners(\n        element,\n        null,\n        [\n          [\"change\", \"Validate\"],\n          [\"change\", \"Action\"],\n          [\"focus\", \"Focus\"],\n          [\"blur\", \"Blur\"],\n          [\"mousedown\", \"Mouse Down\"],\n          [\"mouseenter\", \"Mouse Enter\"],\n          [\"mouseleave\", \"Mouse Exit\"],\n          [\"mouseup\", \"Mouse Up\"],\n        ],\n        event => event.target.checked\n      );\n    }\n\n    this._setBackgroundColor(element);\n    this._setDefaultPropertiesFromJS(element);\n\n    this.container.append(element);\n    return this.container;\n  }\n}\n\nclass RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: parameters.renderForms });\n  }\n\n  render() {\n    this.container.classList.add(\"buttonWidgetAnnotation\", \"radioButton\");\n    const storage = this.annotationStorage;\n    const data = this.data;\n    const id = data.id;\n    let value = storage.getValue(id, {\n      value: data.fieldValue === data.buttonValue,\n    }).value;\n    if (typeof value === \"string\") {\n      // The value has been changed through js and set in annotationStorage.\n      value = value !== data.buttonValue;\n      storage.setValue(id, { value });\n    }\n\n    if (value) {\n      // It's possible that multiple radio buttons are checked.\n      // So if this one is checked we just reset the other ones.\n      // (see bug 1864136). Then when the other ones will be rendered they will\n      // unchecked (because of their value in the storage).\n      // Consequently, the first checked radio button will be the only checked\n      // one.\n      for (const radio of this._getElementsByName(\n        data.fieldName,\n        /* skipId = */ id\n      )) {\n        storage.setValue(radio.id, { value: false });\n      }\n    }\n\n    const element = document.createElement(\"input\");\n    GetElementsByNameSet.add(element);\n    element.setAttribute(\"data-element-id\", id);\n\n    element.disabled = data.readOnly;\n    this._setRequired(element, this.data.required);\n    element.type = \"radio\";\n    element.name = data.fieldName;\n    if (value) {\n      element.setAttribute(\"checked\", true);\n    }\n    element.tabIndex = DEFAULT_TAB_INDEX;\n\n    element.addEventListener(\"change\", event => {\n      const { name, checked } = event.target;\n      for (const radio of this._getElementsByName(name, /* skipId = */ id)) {\n        storage.setValue(radio.id, { value: false });\n      }\n      storage.setValue(id, { value: checked });\n    });\n\n    element.addEventListener(\"resetform\", event => {\n      const defaultValue = data.defaultFieldValue;\n      event.target.checked =\n        defaultValue !== null &&\n        defaultValue !== undefined &&\n        defaultValue === data.buttonValue;\n    });\n\n    if (this.enableScripting && this.hasJSActions) {\n      const pdfButtonValue = data.buttonValue;\n      element.addEventListener(\"updatefromsandbox\", jsEvent => {\n        const actions = {\n          value: event => {\n            const checked = pdfButtonValue === event.detail.value;\n            for (const radio of this._getElementsByName(event.target.name)) {\n              const curChecked = checked && radio.id === id;\n              if (radio.domElement) {\n                radio.domElement.checked = curChecked;\n              }\n              storage.setValue(radio.id, { value: curChecked });\n            }\n          },\n        };\n        this._dispatchEventFromSandbox(actions, jsEvent);\n      });\n\n      this._setEventListeners(\n        element,\n        null,\n        [\n          [\"change\", \"Validate\"],\n          [\"change\", \"Action\"],\n          [\"focus\", \"Focus\"],\n          [\"blur\", \"Blur\"],\n          [\"mousedown\", \"Mouse Down\"],\n          [\"mouseenter\", \"Mouse Enter\"],\n          [\"mouseleave\", \"Mouse Exit\"],\n          [\"mouseup\", \"Mouse Up\"],\n        ],\n        event => event.target.checked\n      );\n    }\n\n    this._setBackgroundColor(element);\n    this._setDefaultPropertiesFromJS(element);\n\n    this.container.append(element);\n    return this.container;\n  }\n}\n\nclass PushButtonWidgetAnnotationElement extends LinkAnnotationElement {\n  constructor(parameters) {\n    super(parameters, { ignoreBorder: parameters.data.hasAppearance });\n  }\n\n  render() {\n    // The rendering and functionality of a push button widget annotation is\n    // equal to that of a link annotation, but may have more functionality, such\n    // as performing actions on form fields (resetting, submitting, et cetera).\n    const container = super.render();\n    container.classList.add(\"buttonWidgetAnnotation\", \"pushButton\");\n\n    const linkElement = container.lastChild;\n    if (this.enableScripting && this.hasJSActions && linkElement) {\n      this._setDefaultPropertiesFromJS(linkElement);\n\n      linkElement.addEventListener(\"updatefromsandbox\", jsEvent => {\n        this._dispatchEventFromSandbox({}, jsEvent);\n      });\n    }\n\n    return container;\n  }\n}\n\nclass ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: parameters.renderForms });\n  }\n\n  render() {\n    this.container.classList.add(\"choiceWidgetAnnotation\");\n    const storage = this.annotationStorage;\n    const id = this.data.id;\n\n    const storedData = storage.getValue(id, {\n      value: this.data.fieldValue,\n    });\n\n    const selectElement = document.createElement(\"select\");\n    GetElementsByNameSet.add(selectElement);\n    selectElement.setAttribute(\"data-element-id\", id);\n\n    selectElement.disabled = this.data.readOnly;\n    this._setRequired(selectElement, this.data.required);\n    selectElement.name = this.data.fieldName;\n    selectElement.tabIndex = DEFAULT_TAB_INDEX;\n\n    let addAnEmptyEntry = this.data.combo && this.data.options.length > 0;\n\n    if (!this.data.combo) {\n      // List boxes have a size and (optionally) multiple selection.\n      selectElement.size = this.data.options.length;\n      if (this.data.multiSelect) {\n        selectElement.multiple = true;\n      }\n    }\n\n    selectElement.addEventListener(\"resetform\", event => {\n      const defaultValue = this.data.defaultFieldValue;\n      for (const option of selectElement.options) {\n        option.selected = option.value === defaultValue;\n      }\n    });\n\n    // Insert the options into the choice field.\n    for (const option of this.data.options) {\n      const optionElement = document.createElement(\"option\");\n      optionElement.textContent = option.displayValue;\n      optionElement.value = option.exportValue;\n      if (storedData.value.includes(option.exportValue)) {\n        optionElement.setAttribute(\"selected\", true);\n        addAnEmptyEntry = false;\n      }\n      selectElement.append(optionElement);\n    }\n\n    let removeEmptyEntry = null;\n    if (addAnEmptyEntry) {\n      const noneOptionElement = document.createElement(\"option\");\n      noneOptionElement.value = \" \";\n      noneOptionElement.setAttribute(\"hidden\", true);\n      noneOptionElement.setAttribute(\"selected\", true);\n      selectElement.prepend(noneOptionElement);\n\n      removeEmptyEntry = () => {\n        noneOptionElement.remove();\n        selectElement.removeEventListener(\"input\", removeEmptyEntry);\n        removeEmptyEntry = null;\n      };\n      selectElement.addEventListener(\"input\", removeEmptyEntry);\n    }\n\n    const getValue = isExport => {\n      const name = isExport ? \"value\" : \"textContent\";\n      const { options, multiple } = selectElement;\n      if (!multiple) {\n        return options.selectedIndex === -1\n          ? null\n          : options[options.selectedIndex][name];\n      }\n      return Array.prototype.filter\n        .call(options, option => option.selected)\n        .map(option => option[name]);\n    };\n\n    let selectedValues = getValue(/* isExport */ false);\n\n    const getItems = event => {\n      const options = event.target.options;\n      return Array.prototype.map.call(options, option => ({\n        displayValue: option.textContent,\n        exportValue: option.value,\n      }));\n    };\n\n    if (this.enableScripting && this.hasJSActions) {\n      selectElement.addEventListener(\"updatefromsandbox\", jsEvent => {\n        const actions = {\n          value(event) {\n            removeEmptyEntry?.();\n            const value = event.detail.value;\n            const values = new Set(Array.isArray(value) ? value : [value]);\n            for (const option of selectElement.options) {\n              option.selected = values.has(option.value);\n            }\n            storage.setValue(id, {\n              value: getValue(/* isExport */ true),\n            });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          multipleSelection(event) {\n            selectElement.multiple = true;\n          },\n          remove(event) {\n            const options = selectElement.options;\n            const index = event.detail.remove;\n            options[index].selected = false;\n            selectElement.remove(index);\n            if (options.length > 0) {\n              const i = Array.prototype.findIndex.call(\n                options,\n                option => option.selected\n              );\n              if (i === -1) {\n                options[0].selected = true;\n              }\n            }\n            storage.setValue(id, {\n              value: getValue(/* isExport */ true),\n              items: getItems(event),\n            });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          clear(event) {\n            while (selectElement.length !== 0) {\n              selectElement.remove(0);\n            }\n            storage.setValue(id, { value: null, items: [] });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          insert(event) {\n            const { index, displayValue, exportValue } = event.detail.insert;\n            const selectChild = selectElement.children[index];\n            const optionElement = document.createElement(\"option\");\n            optionElement.textContent = displayValue;\n            optionElement.value = exportValue;\n\n            if (selectChild) {\n              selectChild.before(optionElement);\n            } else {\n              selectElement.append(optionElement);\n            }\n            storage.setValue(id, {\n              value: getValue(/* isExport */ true),\n              items: getItems(event),\n            });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          items(event) {\n            const { items } = event.detail;\n            while (selectElement.length !== 0) {\n              selectElement.remove(0);\n            }\n            for (const item of items) {\n              const { displayValue, exportValue } = item;\n              const optionElement = document.createElement(\"option\");\n              optionElement.textContent = displayValue;\n              optionElement.value = exportValue;\n              selectElement.append(optionElement);\n            }\n            if (selectElement.options.length > 0) {\n              selectElement.options[0].selected = true;\n            }\n            storage.setValue(id, {\n              value: getValue(/* isExport */ true),\n              items: getItems(event),\n            });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          indices(event) {\n            const indices = new Set(event.detail.indices);\n            for (const option of event.target.options) {\n              option.selected = indices.has(option.index);\n            }\n            storage.setValue(id, {\n              value: getValue(/* isExport */ true),\n            });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          editable(event) {\n            event.target.disabled = !event.detail.editable;\n          },\n        };\n        this._dispatchEventFromSandbox(actions, jsEvent);\n      });\n\n      selectElement.addEventListener(\"input\", event => {\n        const exportValue = getValue(/* isExport */ true);\n        const change = getValue(/* isExport */ false);\n        storage.setValue(id, { value: exportValue });\n\n        event.preventDefault();\n\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id,\n            name: \"Keystroke\",\n            value: selectedValues,\n            change,\n            changeEx: exportValue,\n            willCommit: false,\n            commitKey: 1,\n            keyDown: false,\n          },\n        });\n      });\n\n      this._setEventListeners(\n        selectElement,\n        null,\n        [\n          [\"focus\", \"Focus\"],\n          [\"blur\", \"Blur\"],\n          [\"mousedown\", \"Mouse Down\"],\n          [\"mouseenter\", \"Mouse Enter\"],\n          [\"mouseleave\", \"Mouse Exit\"],\n          [\"mouseup\", \"Mouse Up\"],\n          [\"input\", \"Action\"],\n          [\"input\", \"Validate\"],\n        ],\n        event => event.target.value\n      );\n    } else {\n      selectElement.addEventListener(\"input\", function (event) {\n        storage.setValue(id, { value: getValue(/* isExport */ true) });\n      });\n    }\n\n    if (this.data.combo) {\n      this._setTextStyle(selectElement);\n    } else {\n      // Just use the default font size...\n      // it's a bit hard to guess what is a good size.\n    }\n    this._setBackgroundColor(selectElement);\n    this._setDefaultPropertiesFromJS(selectElement);\n\n    this.container.append(selectElement);\n    return this.container;\n  }\n}\n\nclass PopupAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const { data, elements } = parameters;\n    super(parameters, { isRenderable: AnnotationElement._hasPopupData(data) });\n    this.elements = elements;\n    this.popup = null;\n  }\n\n  render() {\n    this.container.classList.add(\"popupAnnotation\");\n\n    const popup = (this.popup = new PopupElement({\n      container: this.container,\n      color: this.data.color,\n      titleObj: this.data.titleObj,\n      modificationDate: this.data.modificationDate,\n      contentsObj: this.data.contentsObj,\n      richText: this.data.richText,\n      rect: this.data.rect,\n      parentRect: this.data.parentRect || null,\n      parent: this.parent,\n      elements: this.elements,\n      open: this.data.open,\n    }));\n\n    const elementIds = [];\n    for (const element of this.elements) {\n      element.popup = popup;\n      element.container.ariaHasPopup = \"dialog\";\n      elementIds.push(element.data.id);\n      element.addHighlightArea();\n    }\n\n    this.container.setAttribute(\n      \"aria-controls\",\n      elementIds.map(id => `${AnnotationPrefix}${id}`).join(\",\")\n    );\n\n    return this.container;\n  }\n}\n\nclass PopupElement {\n  #boundKeyDown = this.#keyDown.bind(this);\n\n  #boundHide = this.#hide.bind(this);\n\n  #boundShow = this.#show.bind(this);\n\n  #boundToggle = this.#toggle.bind(this);\n\n  #color = null;\n\n  #container = null;\n\n  #contentsObj = null;\n\n  #dateObj = null;\n\n  #elements = null;\n\n  #parent = null;\n\n  #parentRect = null;\n\n  #pinned = false;\n\n  #popup = null;\n\n  #position = null;\n\n  #rect = null;\n\n  #richText = null;\n\n  #titleObj = null;\n\n  #updates = null;\n\n  #wasVisible = false;\n\n  constructor({\n    container,\n    color,\n    elements,\n    titleObj,\n    modificationDate,\n    contentsObj,\n    richText,\n    parent,\n    rect,\n    parentRect,\n    open,\n  }) {\n    this.#container = container;\n    this.#titleObj = titleObj;\n    this.#contentsObj = contentsObj;\n    this.#richText = richText;\n    this.#parent = parent;\n    this.#color = color;\n    this.#rect = rect;\n    this.#parentRect = parentRect;\n    this.#elements = elements;\n\n    // The modification date is shown in the popup instead of the creation\n    // date if it is available and can be parsed correctly, which is\n    // consistent with other viewers such as Adobe Acrobat.\n    this.#dateObj = PDFDateString.toDateObject(modificationDate);\n\n    this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup());\n    // Attach the event listeners to the trigger element.\n    for (const element of this.trigger) {\n      element.addEventListener(\"click\", this.#boundToggle);\n      element.addEventListener(\"mouseenter\", this.#boundShow);\n      element.addEventListener(\"mouseleave\", this.#boundHide);\n      element.classList.add(\"popupTriggerArea\");\n    }\n\n    // Attach the event listener to toggle the popup with the keyboard.\n    for (const element of elements) {\n      element.container?.addEventListener(\"keydown\", this.#boundKeyDown);\n    }\n\n    this.#container.hidden = true;\n    if (open) {\n      this.#toggle();\n    }\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      // Since the popup is lazily created, we need to ensure that it'll be\n      // created and displayed during reference tests.\n      this.#parent.popupShow.push(async () => {\n        if (this.#container.hidden) {\n          this.#show();\n        }\n      });\n    }\n  }\n\n  render() {\n    if (this.#popup) {\n      return;\n    }\n\n    const popup = (this.#popup = document.createElement(\"div\"));\n    popup.className = \"popup\";\n\n    if (this.#color) {\n      const baseColor = (popup.style.outlineColor = Util.makeHexColor(\n        ...this.#color\n      ));\n      if (\n        (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n        CSS.supports(\"background-color\", \"color-mix(in srgb, red 30%, white)\")\n      ) {\n        popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`;\n      } else {\n        // color-mix isn't supported in some browsers hence this version.\n        // See https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color-mix#browser_compatibility\n        // TODO: Use color-mix when it's supported everywhere.\n        // Enlighten the color.\n        const BACKGROUND_ENLIGHT = 0.7;\n        popup.style.backgroundColor = Util.makeHexColor(\n          ...this.#color.map(c =>\n            Math.floor(BACKGROUND_ENLIGHT * (255 - c) + c)\n          )\n        );\n      }\n    }\n\n    const header = document.createElement(\"span\");\n    header.className = \"header\";\n    const title = document.createElement(\"h1\");\n    header.append(title);\n    ({ dir: title.dir, str: title.textContent } = this.#titleObj);\n    popup.append(header);\n\n    if (this.#dateObj) {\n      const modificationDate = document.createElement(\"span\");\n      modificationDate.classList.add(\"popupDate\");\n      modificationDate.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-annotation-date-time-string\"\n      );\n      modificationDate.setAttribute(\n        \"data-l10n-args\",\n        JSON.stringify({ dateObj: this.#dateObj.valueOf() })\n      );\n      header.append(modificationDate);\n    }\n\n    const html = this.#html;\n    if (html) {\n      XfaLayer.render({\n        xfaHtml: html,\n        intent: \"richText\",\n        div: popup,\n      });\n      popup.lastChild.classList.add(\"richText\", \"popupContent\");\n    } else {\n      const contents = this._formatContents(this.#contentsObj);\n      popup.append(contents);\n    }\n    this.#container.append(popup);\n  }\n\n  get #html() {\n    const richText = this.#richText;\n    const contentsObj = this.#contentsObj;\n    if (\n      richText?.str &&\n      (!contentsObj?.str || contentsObj.str === richText.str)\n    ) {\n      return this.#richText.html || null;\n    }\n    return null;\n  }\n\n  get #fontSize() {\n    return this.#html?.attributes?.style?.fontSize || 0;\n  }\n\n  get #fontColor() {\n    return this.#html?.attributes?.style?.color || null;\n  }\n\n  #makePopupContent(text) {\n    const popupLines = [];\n    const popupContent = {\n      str: text,\n      html: {\n        name: \"div\",\n        attributes: {\n          dir: \"auto\",\n        },\n        children: [\n          {\n            name: \"p\",\n            children: popupLines,\n          },\n        ],\n      },\n    };\n    const lineAttributes = {\n      style: {\n        color: this.#fontColor,\n        fontSize: this.#fontSize\n          ? `calc(${this.#fontSize}px * var(--scale-factor))`\n          : \"\",\n      },\n    };\n    for (const line of text.split(\"\\n\")) {\n      popupLines.push({\n        name: \"span\",\n        value: line,\n        attributes: lineAttributes,\n      });\n    }\n    return popupContent;\n  }\n\n  /**\n   * Format the contents of the popup by adding newlines where necessary.\n   *\n   * @private\n   * @param {Object<string, string>} contentsObj\n   * @memberof PopupElement\n   * @returns {HTMLParagraphElement}\n   */\n  _formatContents({ str, dir }) {\n    const p = document.createElement(\"p\");\n    p.classList.add(\"popupContent\");\n    p.dir = dir;\n    const lines = str.split(/(?:\\r\\n?|\\n)/);\n    for (let i = 0, ii = lines.length; i < ii; ++i) {\n      const line = lines[i];\n      p.append(document.createTextNode(line));\n      if (i < ii - 1) {\n        p.append(document.createElement(\"br\"));\n      }\n    }\n    return p;\n  }\n\n  #keyDown(event) {\n    if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {\n      return;\n    }\n\n    if (event.key === \"Enter\" || (event.key === \"Escape\" && this.#pinned)) {\n      this.#toggle();\n    }\n  }\n\n  updateEdited({ rect, popupContent }) {\n    this.#updates ||= {\n      contentsObj: this.#contentsObj,\n      richText: this.#richText,\n    };\n    if (rect) {\n      this.#position = null;\n    }\n    if (popupContent) {\n      this.#richText = this.#makePopupContent(popupContent);\n      this.#contentsObj = null;\n    }\n    this.#popup?.remove();\n    this.#popup = null;\n  }\n\n  resetEdited() {\n    if (!this.#updates) {\n      return;\n    }\n    ({ contentsObj: this.#contentsObj, richText: this.#richText } =\n      this.#updates);\n    this.#updates = null;\n    this.#popup?.remove();\n    this.#popup = null;\n    this.#position = null;\n  }\n\n  #setPosition() {\n    if (this.#position !== null) {\n      return;\n    }\n    const {\n      page: { view },\n      viewport: {\n        rawDims: { pageWidth, pageHeight, pageX, pageY },\n      },\n    } = this.#parent;\n\n    let useParentRect = !!this.#parentRect;\n    let rect = useParentRect ? this.#parentRect : this.#rect;\n    for (const element of this.#elements) {\n      if (!rect || Util.intersect(element.data.rect, rect) !== null) {\n        rect = element.data.rect;\n        useParentRect = true;\n        break;\n      }\n    }\n\n    const normalizedRect = Util.normalizeRect([\n      rect[0],\n      view[3] - rect[1] + view[1],\n      rect[2],\n      view[3] - rect[3] + view[1],\n    ]);\n\n    const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5;\n    const parentWidth = useParentRect\n      ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION\n      : 0;\n    const popupLeft = normalizedRect[0] + parentWidth;\n    const popupTop = normalizedRect[1];\n    this.#position = [\n      (100 * (popupLeft - pageX)) / pageWidth,\n      (100 * (popupTop - pageY)) / pageHeight,\n    ];\n\n    const { style } = this.#container;\n    style.left = `${this.#position[0]}%`;\n    style.top = `${this.#position[1]}%`;\n  }\n\n  /**\n   * Toggle the visibility of the popup.\n   */\n  #toggle() {\n    this.#pinned = !this.#pinned;\n    if (this.#pinned) {\n      this.#show();\n      this.#container.addEventListener(\"click\", this.#boundToggle);\n      this.#container.addEventListener(\"keydown\", this.#boundKeyDown);\n    } else {\n      this.#hide();\n      this.#container.removeEventListener(\"click\", this.#boundToggle);\n      this.#container.removeEventListener(\"keydown\", this.#boundKeyDown);\n    }\n  }\n\n  /**\n   * Show the popup.\n   */\n  #show() {\n    if (!this.#popup) {\n      this.render();\n    }\n    if (!this.isVisible) {\n      this.#setPosition();\n      this.#container.hidden = false;\n      this.#container.style.zIndex =\n        parseInt(this.#container.style.zIndex) + 1000;\n    } else if (this.#pinned) {\n      this.#container.classList.add(\"focused\");\n    }\n  }\n\n  /**\n   * Hide the popup.\n   */\n  #hide() {\n    this.#container.classList.remove(\"focused\");\n    if (this.#pinned || !this.isVisible) {\n      return;\n    }\n    this.#container.hidden = true;\n    this.#container.style.zIndex =\n      parseInt(this.#container.style.zIndex) - 1000;\n  }\n\n  forceHide() {\n    this.#wasVisible = this.isVisible;\n    if (!this.#wasVisible) {\n      return;\n    }\n    this.#container.hidden = true;\n  }\n\n  maybeShow() {\n    if (!this.#wasVisible) {\n      return;\n    }\n    if (!this.#popup) {\n      this.#show();\n    }\n    this.#wasVisible = false;\n    this.#container.hidden = false;\n  }\n\n  get isVisible() {\n    return this.#container.hidden === false;\n  }\n}\n\nclass FreeTextAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n    this.textContent = parameters.data.textContent;\n    this.textPosition = parameters.data.textPosition;\n    this.annotationEditorType = AnnotationEditorType.FREETEXT;\n  }\n\n  render() {\n    this.container.classList.add(\"freeTextAnnotation\");\n\n    if (this.textContent) {\n      const content = document.createElement(\"div\");\n      content.classList.add(\"annotationTextContent\");\n      content.setAttribute(\"role\", \"comment\");\n      for (const line of this.textContent) {\n        const lineSpan = document.createElement(\"span\");\n        lineSpan.textContent = line;\n        content.append(lineSpan);\n      }\n      this.container.append(content);\n    }\n\n    if (!this.data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    this._editOnDoubleClick();\n\n    return this.container;\n  }\n}\n\nclass LineAnnotationElement extends AnnotationElement {\n  #line = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n  }\n\n  render() {\n    this.container.classList.add(\"lineAnnotation\");\n\n    // Create an invisible line with the same starting and ending coordinates\n    // that acts as the trigger for the popup. Only the line itself should\n    // trigger the popup, not the entire container.\n    const data = this.data;\n    const { width, height } = getRectDims(data.rect);\n    const svg = this.svgFactory.create(\n      width,\n      height,\n      /* skipDimensions = */ true\n    );\n\n    // PDF coordinates are calculated from a bottom left origin, so transform\n    // the line coordinates to a top left origin for the SVG element.\n    const line = (this.#line = this.svgFactory.createElement(\"svg:line\"));\n    line.setAttribute(\"x1\", data.rect[2] - data.lineCoordinates[0]);\n    line.setAttribute(\"y1\", data.rect[3] - data.lineCoordinates[1]);\n    line.setAttribute(\"x2\", data.rect[2] - data.lineCoordinates[2]);\n    line.setAttribute(\"y2\", data.rect[3] - data.lineCoordinates[3]);\n    // Ensure that the 'stroke-width' is always non-zero, since otherwise it\n    // won't be possible to open/close the popup (note e.g. issue 11122).\n    line.setAttribute(\"stroke-width\", data.borderStyle.width || 1);\n    line.setAttribute(\"stroke\", \"transparent\");\n    line.setAttribute(\"fill\", \"transparent\");\n\n    svg.append(line);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the line instead\n    // of to the entire container (which is the default).\n    if (!data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    return this.container;\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#line;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\n\nclass SquareAnnotationElement extends AnnotationElement {\n  #square = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n  }\n\n  render() {\n    this.container.classList.add(\"squareAnnotation\");\n\n    // Create an invisible square with the same rectangle that acts as the\n    // trigger for the popup. Only the square itself should trigger the\n    // popup, not the entire container.\n    const data = this.data;\n    const { width, height } = getRectDims(data.rect);\n    const svg = this.svgFactory.create(\n      width,\n      height,\n      /* skipDimensions = */ true\n    );\n\n    // The browser draws half of the borders inside the square and half of\n    // the borders outside the square by default. This behavior cannot be\n    // changed programmatically, so correct for that here.\n    const borderWidth = data.borderStyle.width;\n    const square = (this.#square = this.svgFactory.createElement(\"svg:rect\"));\n    square.setAttribute(\"x\", borderWidth / 2);\n    square.setAttribute(\"y\", borderWidth / 2);\n    square.setAttribute(\"width\", width - borderWidth);\n    square.setAttribute(\"height\", height - borderWidth);\n    // Ensure that the 'stroke-width' is always non-zero, since otherwise it\n    // won't be possible to open/close the popup (note e.g. issue 11122).\n    square.setAttribute(\"stroke-width\", borderWidth || 1);\n    square.setAttribute(\"stroke\", \"transparent\");\n    square.setAttribute(\"fill\", \"transparent\");\n\n    svg.append(square);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the square instead\n    // of to the entire container (which is the default).\n    if (!data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    return this.container;\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#square;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\n\nclass CircleAnnotationElement extends AnnotationElement {\n  #circle = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n  }\n\n  render() {\n    this.container.classList.add(\"circleAnnotation\");\n\n    // Create an invisible circle with the same ellipse that acts as the\n    // trigger for the popup. Only the circle itself should trigger the\n    // popup, not the entire container.\n    const data = this.data;\n    const { width, height } = getRectDims(data.rect);\n    const svg = this.svgFactory.create(\n      width,\n      height,\n      /* skipDimensions = */ true\n    );\n\n    // The browser draws half of the borders inside the circle and half of\n    // the borders outside the circle by default. This behavior cannot be\n    // changed programmatically, so correct for that here.\n    const borderWidth = data.borderStyle.width;\n    const circle = (this.#circle =\n      this.svgFactory.createElement(\"svg:ellipse\"));\n    circle.setAttribute(\"cx\", width / 2);\n    circle.setAttribute(\"cy\", height / 2);\n    circle.setAttribute(\"rx\", width / 2 - borderWidth / 2);\n    circle.setAttribute(\"ry\", height / 2 - borderWidth / 2);\n    // Ensure that the 'stroke-width' is always non-zero, since otherwise it\n    // won't be possible to open/close the popup (note e.g. issue 11122).\n    circle.setAttribute(\"stroke-width\", borderWidth || 1);\n    circle.setAttribute(\"stroke\", \"transparent\");\n    circle.setAttribute(\"fill\", \"transparent\");\n\n    svg.append(circle);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the circle instead\n    // of to the entire container (which is the default).\n    if (!data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    return this.container;\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#circle;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\n\nclass PolylineAnnotationElement extends AnnotationElement {\n  #polyline = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n\n    this.containerClassName = \"polylineAnnotation\";\n    this.svgElementName = \"svg:polyline\";\n  }\n\n  render() {\n    this.container.classList.add(this.containerClassName);\n\n    // Create an invisible polyline with the same points that acts as the\n    // trigger for the popup. Only the polyline itself should trigger the\n    // popup, not the entire container.\n    const {\n      data: { rect, vertices, borderStyle, popupRef },\n    } = this;\n    if (!vertices) {\n      return this.container;\n    }\n    const { width, height } = getRectDims(rect);\n    const svg = this.svgFactory.create(\n      width,\n      height,\n      /* skipDimensions = */ true\n    );\n\n    // Convert the vertices array to a single points string that the SVG\n    // polyline element expects (\"x1,y1 x2,y2 ...\"). PDF coordinates are\n    // calculated from a bottom left origin, so transform the polyline\n    // coordinates to a top left origin for the SVG element.\n    let points = [];\n    for (let i = 0, ii = vertices.length; i < ii; i += 2) {\n      const x = vertices[i] - rect[0];\n      const y = rect[3] - vertices[i + 1];\n      points.push(`${x},${y}`);\n    }\n    points = points.join(\" \");\n\n    const polyline = (this.#polyline = this.svgFactory.createElement(\n      this.svgElementName\n    ));\n    polyline.setAttribute(\"points\", points);\n    // Ensure that the 'stroke-width' is always non-zero, since otherwise it\n    // won't be possible to open/close the popup (note e.g. issue 11122).\n    polyline.setAttribute(\"stroke-width\", borderStyle.width || 1);\n    polyline.setAttribute(\"stroke\", \"transparent\");\n    polyline.setAttribute(\"fill\", \"transparent\");\n\n    svg.append(polyline);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the polyline\n    // instead of to the entire container (which is the default).\n    if (!popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    return this.container;\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#polyline;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\n\nclass PolygonAnnotationElement extends PolylineAnnotationElement {\n  constructor(parameters) {\n    // Polygons are specific forms of polylines, so reuse their logic.\n    super(parameters);\n\n    this.containerClassName = \"polygonAnnotation\";\n    this.svgElementName = \"svg:polygon\";\n  }\n}\n\nclass CaretAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n  }\n\n  render() {\n    this.container.classList.add(\"caretAnnotation\");\n\n    if (!this.data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n    return this.container;\n  }\n}\n\nclass InkAnnotationElement extends AnnotationElement {\n  #polylinesGroupElement = null;\n\n  #polylines = [];\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n\n    this.containerClassName = \"inkAnnotation\";\n\n    // Use the polyline SVG element since it allows us to use coordinates\n    // directly and to draw both straight lines and curves.\n    this.svgElementName = \"svg:polyline\";\n\n    this.annotationEditorType =\n      this.data.it === \"InkHighlight\"\n        ? AnnotationEditorType.HIGHLIGHT\n        : AnnotationEditorType.INK;\n  }\n\n  #getTransform(rotation, rect) {\n    // PDF coordinates are calculated from a bottom left origin, so\n    // transform the polyline coordinates to a top left origin for the\n    // SVG element.\n    switch (rotation) {\n      case 90:\n        return {\n          transform: `rotate(90) translate(${-rect[0]},${rect[1]}) scale(1,-1)`,\n          width: rect[3] - rect[1],\n          height: rect[2] - rect[0],\n        };\n      case 180:\n        return {\n          transform: `rotate(180) translate(${-rect[2]},${rect[1]}) scale(1,-1)`,\n          width: rect[2] - rect[0],\n          height: rect[3] - rect[1],\n        };\n      case 270:\n        return {\n          transform: `rotate(270) translate(${-rect[2]},${rect[3]}) scale(1,-1)`,\n          width: rect[3] - rect[1],\n          height: rect[2] - rect[0],\n        };\n      default:\n        return {\n          transform: `translate(${-rect[0]},${rect[3]}) scale(1,-1)`,\n          width: rect[2] - rect[0],\n          height: rect[3] - rect[1],\n        };\n    }\n  }\n\n  render() {\n    this.container.classList.add(this.containerClassName);\n\n    // Create an invisible polyline with the same points that acts as the\n    // trigger for the popup.\n    const {\n      data: { rect, rotation, inkLists, borderStyle, popupRef },\n    } = this;\n    const { transform, width, height } = this.#getTransform(rotation, rect);\n\n    const svg = this.svgFactory.create(\n      width,\n      height,\n      /* skipDimensions = */ true\n    );\n    const g = (this.#polylinesGroupElement =\n      this.svgFactory.createElement(\"svg:g\"));\n    svg.append(g);\n    // Ensure that the 'stroke-width' is always non-zero, since otherwise it\n    // won't be possible to open/close the popup (note e.g. issue 11122).\n    g.setAttribute(\"stroke-width\", borderStyle.width || 1);\n    g.setAttribute(\"stroke-linecap\", \"round\");\n    g.setAttribute(\"stroke-linejoin\", \"round\");\n    g.setAttribute(\"stroke-miterlimit\", 10);\n    g.setAttribute(\"stroke\", \"transparent\");\n    g.setAttribute(\"fill\", \"transparent\");\n    g.setAttribute(\"transform\", transform);\n\n    for (let i = 0, ii = inkLists.length; i < ii; i++) {\n      const polyline = this.svgFactory.createElement(this.svgElementName);\n      this.#polylines.push(polyline);\n      polyline.setAttribute(\"points\", inkLists[i].join(\",\"));\n      g.append(polyline);\n    }\n\n    if (!popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    this.container.append(svg);\n    this._editOnDoubleClick();\n\n    return this.container;\n  }\n\n  updateEdited(params) {\n    super.updateEdited(params);\n    const { thickness, points, rect } = params;\n    const g = this.#polylinesGroupElement;\n    if (thickness >= 0) {\n      g.setAttribute(\"stroke-width\", thickness || 1);\n    }\n    if (points) {\n      for (let i = 0, ii = this.#polylines.length; i < ii; i++) {\n        this.#polylines[i].setAttribute(\"points\", points[i].join(\",\"));\n      }\n    }\n    if (rect) {\n      const { transform, width, height } = this.#getTransform(\n        this.data.rotation,\n        rect\n      );\n      const root = g.parentElement;\n      root.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n      g.setAttribute(\"transform\", transform);\n    }\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#polylines;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\n\nclass HighlightAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true,\n    });\n    this.annotationEditorType = AnnotationEditorType.HIGHLIGHT;\n  }\n\n  render() {\n    if (!this.data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    this.container.classList.add(\"highlightAnnotation\");\n    this._editOnDoubleClick();\n\n    return this.container;\n  }\n}\n\nclass UnderlineAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true,\n    });\n  }\n\n  render() {\n    if (!this.data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    this.container.classList.add(\"underlineAnnotation\");\n    return this.container;\n  }\n}\n\nclass SquigglyAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true,\n    });\n  }\n\n  render() {\n    if (!this.data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    this.container.classList.add(\"squigglyAnnotation\");\n    return this.container;\n  }\n}\n\nclass StrikeOutAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true,\n    });\n  }\n\n  render() {\n    if (!this.data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n\n    this.container.classList.add(\"strikeoutAnnotation\");\n    return this.container;\n  }\n}\n\nclass StampAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n    this.annotationEditorType = AnnotationEditorType.STAMP;\n  }\n\n  render() {\n    this.container.classList.add(\"stampAnnotation\");\n    this.container.setAttribute(\"role\", \"img\");\n\n    if (!this.data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    }\n    this._editOnDoubleClick();\n\n    return this.container;\n  }\n}\n\nclass FileAttachmentAnnotationElement extends AnnotationElement {\n  #trigger = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true });\n\n    const { file } = this.data;\n    this.filename = file.filename;\n    this.content = file.content;\n\n    this.linkService.eventBus?.dispatch(\"fileattachmentannotation\", {\n      source: this,\n      ...file,\n    });\n  }\n\n  render() {\n    this.container.classList.add(\"fileAttachmentAnnotation\");\n\n    const { container, data } = this;\n    let trigger;\n    if (data.hasAppearance || data.fillAlpha === 0) {\n      trigger = document.createElement(\"div\");\n    } else {\n      // Unfortunately it seems that it's not clearly specified exactly what\n      // names are actually valid, since Table 184 contains:\n      //   Conforming readers shall provide predefined icon appearances for at\n      //   least the following standard names: GraphPushPin, PaperclipTag.\n      //   Additional names may be supported as well. Default value: PushPin.\n      trigger = document.createElement(\"img\");\n      trigger.src = `${this.imageResourcesPath}annotation-${\n        /paperclip/i.test(data.name) ? \"paperclip\" : \"pushpin\"\n      }.svg`;\n\n      if (data.fillAlpha && data.fillAlpha < 1) {\n        trigger.style = `filter: opacity(${Math.round(\n          data.fillAlpha * 100\n        )}%);`;\n\n        if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n          this.container.classList.add(\"hasFillAlpha\");\n        }\n      }\n    }\n    trigger.addEventListener(\"dblclick\", this.#download.bind(this));\n    this.#trigger = trigger;\n\n    const { isMac } = FeatureTest.platform;\n    container.addEventListener(\"keydown\", evt => {\n      if (evt.key === \"Enter\" && (isMac ? evt.metaKey : evt.ctrlKey)) {\n        this.#download();\n      }\n    });\n\n    if (!data.popupRef && this.hasPopupData) {\n      this._createPopup();\n    } else {\n      trigger.classList.add(\"popupTriggerArea\");\n    }\n\n    container.append(trigger);\n    return container;\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#trigger;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n\n  /**\n   * Download the file attachment associated with this annotation.\n   */\n  #download() {\n    this.downloadManager?.openOrDownloadData(this.content, this.filename);\n  }\n}\n\n/**\n * @typedef {Object} AnnotationLayerParameters\n * @property {PageViewport} viewport\n * @property {HTMLDivElement} div\n * @property {Array} annotations\n * @property {PDFPageProxy} page\n * @property {IPDFLinkService} linkService\n * @property {IDownloadManager} [downloadManager]\n * @property {AnnotationStorage} [annotationStorage]\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   for annotation icons. Include trailing slash.\n * @property {boolean} renderForms\n * @property {boolean} [enableScripting] - Enable embedded script execution.\n * @property {boolean} [hasJSActions] - Some fields have JS actions.\n *   The default value is `false`.\n * @property {Object<string, Array<Object>> | null} [fieldObjects]\n * @property {Map<string, HTMLCanvasElement>} [annotationCanvasMap]\n * @property {TextAccessibilityManager} [accessibilityManager]\n * @property {AnnotationEditorUIManager} [annotationEditorUIManager]\n * @property {StructTreeLayerBuilder} [structTreeLayer]\n */\n\n/**\n * Manage the layer containing all the annotations.\n */\nclass AnnotationLayer {\n  #accessibilityManager = null;\n\n  #annotationCanvasMap = null;\n\n  #editableAnnotations = new Map();\n\n  #structTreeLayer = null;\n\n  constructor({\n    div,\n    accessibilityManager,\n    annotationCanvasMap,\n    annotationEditorUIManager,\n    page,\n    viewport,\n    structTreeLayer,\n  }) {\n    this.div = div;\n    this.#accessibilityManager = accessibilityManager;\n    this.#annotationCanvasMap = annotationCanvasMap;\n    this.#structTreeLayer = structTreeLayer || null;\n    this.page = page;\n    this.viewport = viewport;\n    this.zIndex = 0;\n    this._annotationEditorUIManager = annotationEditorUIManager;\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"showPopups\", {\n        value: async () => {\n          for (const show of this.popupShow) {\n            await show();\n          }\n        },\n      });\n      this.popupShow = [];\n    }\n  }\n\n  hasEditableAnnotations() {\n    return this.#editableAnnotations.size > 0;\n  }\n\n  async #appendElement(element, id) {\n    const contentElement = element.firstChild || element;\n    const annotationId = (contentElement.id = `${AnnotationPrefix}${id}`);\n    const ariaAttributes =\n      await this.#structTreeLayer?.getAriaAttributes(annotationId);\n    if (ariaAttributes) {\n      for (const [key, value] of ariaAttributes) {\n        contentElement.setAttribute(key, value);\n      }\n    }\n\n    this.div.append(element);\n    this.#accessibilityManager?.moveElementInDOM(\n      this.div,\n      element,\n      contentElement,\n      /* isRemovable = */ false\n    );\n  }\n\n  /**\n   * Render a new annotation layer with all annotation elements.\n   *\n   * @param {AnnotationLayerParameters} params\n   * @memberof AnnotationLayer\n   */\n  async render(params) {\n    const { annotations } = params;\n    const layer = this.div;\n    setLayerDimensions(layer, this.viewport);\n\n    const popupToElements = new Map();\n    const elementParams = {\n      data: null,\n      layer,\n      linkService: params.linkService,\n      downloadManager: params.downloadManager,\n      imageResourcesPath: params.imageResourcesPath || \"\",\n      renderForms: params.renderForms !== false,\n      svgFactory: new DOMSVGFactory(),\n      annotationStorage: params.annotationStorage || new AnnotationStorage(),\n      enableScripting: params.enableScripting === true,\n      hasJSActions: params.hasJSActions,\n      fieldObjects: params.fieldObjects,\n      parent: this,\n      elements: null,\n    };\n\n    for (const data of annotations) {\n      if (data.noHTML) {\n        continue;\n      }\n      const isPopupAnnotation = data.annotationType === AnnotationType.POPUP;\n      if (!isPopupAnnotation) {\n        const { width, height } = getRectDims(data.rect);\n        if (width <= 0 || height <= 0) {\n          continue; // Ignore empty annotations.\n        }\n      } else {\n        const elements = popupToElements.get(data.id);\n        if (!elements) {\n          // Ignore popup annotations without a corresponding annotation.\n          continue;\n        }\n        elementParams.elements = elements;\n      }\n      elementParams.data = data;\n      const element = AnnotationElementFactory.create(elementParams);\n\n      if (!element.isRenderable) {\n        continue;\n      }\n\n      if (!isPopupAnnotation && data.popupRef) {\n        const elements = popupToElements.get(data.popupRef);\n        if (!elements) {\n          popupToElements.set(data.popupRef, [element]);\n        } else {\n          elements.push(element);\n        }\n      }\n\n      const rendered = element.render();\n      if (data.hidden) {\n        rendered.style.visibility = \"hidden\";\n      }\n      await this.#appendElement(rendered, data.id);\n\n      if (element._isEditable) {\n        this.#editableAnnotations.set(element.data.id, element);\n        this._annotationEditorUIManager?.renderAnnotationElement(element);\n      }\n    }\n\n    this.#setAnnotationCanvasMap();\n  }\n\n  /**\n   * Update the annotation elements on existing annotation layer.\n   *\n   * @param {AnnotationLayerParameters} viewport\n   * @memberof AnnotationLayer\n   */\n  update({ viewport }) {\n    const layer = this.div;\n    this.viewport = viewport;\n    setLayerDimensions(layer, { rotation: viewport.rotation });\n\n    this.#setAnnotationCanvasMap();\n    layer.hidden = false;\n  }\n\n  #setAnnotationCanvasMap() {\n    if (!this.#annotationCanvasMap) {\n      return;\n    }\n    const layer = this.div;\n    for (const [id, canvas] of this.#annotationCanvasMap) {\n      const element = layer.querySelector(`[data-annotation-id=\"${id}\"]`);\n      if (!element) {\n        continue;\n      }\n\n      canvas.className = \"annotationContent\";\n      const { firstChild } = element;\n      if (!firstChild) {\n        element.append(canvas);\n      } else if (firstChild.nodeName === \"CANVAS\") {\n        firstChild.replaceWith(canvas);\n      } else if (!firstChild.classList.contains(\"annotationContent\")) {\n        firstChild.before(canvas);\n      } else {\n        firstChild.after(canvas);\n      }\n    }\n    this.#annotationCanvasMap.clear();\n  }\n\n  getEditableAnnotations() {\n    return Array.from(this.#editableAnnotations.values());\n  }\n\n  getEditableAnnotation(id) {\n    return this.#editableAnnotations.get(id);\n  }\n}\n\nexport {\n  AnnotationLayer,\n  FreeTextAnnotationElement,\n  HighlightAnnotationElement,\n  InkAnnotationElement,\n  StampAnnotationElement,\n};\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  assert,\n  LINE_FACTOR,\n  shadow,\n  Util,\n} from \"../../shared/util.js\";\nimport {\n  AnnotationEditorUIManager,\n  bindEvents,\n  KeyboardManager,\n} from \"./tools.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { FreeTextAnnotationElement } from \"../annotation_layer.js\";\n\nconst EOL_PATTERN = /\\r\\n?|\\n/g;\n\n/**\n * Basic text editor in order to create a FreeTex annotation.\n */\nclass FreeTextEditor extends AnnotationEditor {\n  #color;\n\n  #content = \"\";\n\n  #editorDivId = `${this.id}-editor`;\n\n  #editModeAC = null;\n\n  #fontSize;\n\n  static _freeTextDefaultContent = \"\";\n\n  static _internalPadding = 0;\n\n  static _defaultColor = null;\n\n  static _defaultFontSize = 10;\n\n  static get _keyboardManager() {\n    const proto = FreeTextEditor.prototype;\n\n    const arrowChecker = self => self.isEmpty();\n\n    const small = AnnotationEditorUIManager.TRANSLATE_SMALL;\n    const big = AnnotationEditorUIManager.TRANSLATE_BIG;\n\n    return shadow(\n      this,\n      \"_keyboardManager\",\n      new KeyboardManager([\n        [\n          // Commit the text in case the user use ctrl+s to save the document.\n          // The event must bubble in order to be caught by the viewer.\n          // See bug 1831574.\n          [\"ctrl+s\", \"mac+meta+s\", \"ctrl+p\", \"mac+meta+p\"],\n          proto.commitOrRemove,\n          { bubbles: true },\n        ],\n        [\n          [\"ctrl+Enter\", \"mac+meta+Enter\", \"Escape\", \"mac+Escape\"],\n          proto.commitOrRemove,\n        ],\n        [\n          [\"ArrowLeft\", \"mac+ArrowLeft\"],\n          proto._translateEmpty,\n          { args: [-small, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n          proto._translateEmpty,\n          { args: [-big, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowRight\", \"mac+ArrowRight\"],\n          proto._translateEmpty,\n          { args: [small, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n          proto._translateEmpty,\n          { args: [big, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowUp\", \"mac+ArrowUp\"],\n          proto._translateEmpty,\n          { args: [0, -small], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"],\n          proto._translateEmpty,\n          { args: [0, -big], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowDown\", \"mac+ArrowDown\"],\n          proto._translateEmpty,\n          { args: [0, small], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"],\n          proto._translateEmpty,\n          { args: [0, big], checker: arrowChecker },\n        ],\n      ])\n    );\n  }\n\n  static _type = \"freetext\";\n\n  static _editorType = AnnotationEditorType.FREETEXT;\n\n  constructor(params) {\n    super({ ...params, name: \"freeTextEditor\" });\n    this.#color =\n      params.color ||\n      FreeTextEditor._defaultColor ||\n      AnnotationEditor._defaultLineColor;\n    this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize;\n  }\n\n  /** @inheritdoc */\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n    const style = getComputedStyle(document.documentElement);\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      const lineHeight = parseFloat(\n        style.getPropertyValue(\"--freetext-line-height\")\n      );\n      assert(\n        lineHeight === LINE_FACTOR,\n        \"Update the CSS variable to agree with the constant.\"\n      );\n    }\n\n    this._internalPadding = parseFloat(\n      style.getPropertyValue(\"--freetext-padding\")\n    );\n  }\n\n  /** @inheritdoc */\n  static updateDefaultParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.FREETEXT_SIZE:\n        FreeTextEditor._defaultFontSize = value;\n        break;\n      case AnnotationEditorParamsType.FREETEXT_COLOR:\n        FreeTextEditor._defaultColor = value;\n        break;\n    }\n  }\n\n  /** @inheritdoc */\n  updateParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.FREETEXT_SIZE:\n        this.#updateFontSize(value);\n        break;\n      case AnnotationEditorParamsType.FREETEXT_COLOR:\n        this.#updateColor(value);\n        break;\n    }\n  }\n\n  /** @inheritdoc */\n  static get defaultPropertiesToUpdate() {\n    return [\n      [\n        AnnotationEditorParamsType.FREETEXT_SIZE,\n        FreeTextEditor._defaultFontSize,\n      ],\n      [\n        AnnotationEditorParamsType.FREETEXT_COLOR,\n        FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor,\n      ],\n    ];\n  }\n\n  /** @inheritdoc */\n  get propertiesToUpdate() {\n    return [\n      [AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize],\n      [AnnotationEditorParamsType.FREETEXT_COLOR, this.#color],\n    ];\n  }\n\n  /**\n   * Update the font size and make this action as undoable.\n   * @param {number} fontSize\n   */\n  #updateFontSize(fontSize) {\n    const setFontsize = size => {\n      this.editorDiv.style.fontSize = `calc(${size}px * var(--scale-factor))`;\n      this.translate(0, -(size - this.#fontSize) * this.parentScale);\n      this.#fontSize = size;\n      this.#setEditorDimensions();\n    };\n    const savedFontsize = this.#fontSize;\n    this.addCommands({\n      cmd: setFontsize.bind(this, fontSize),\n      undo: setFontsize.bind(this, savedFontsize),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.FREETEXT_SIZE,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n  }\n\n  /**\n   * Update the color and make this action undoable.\n   * @param {string} color\n   */\n  #updateColor(color) {\n    const setColor = col => {\n      this.#color = this.editorDiv.style.color = col;\n    };\n    const savedColor = this.#color;\n    this.addCommands({\n      cmd: setColor.bind(this, color),\n      undo: setColor.bind(this, savedColor),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.FREETEXT_COLOR,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n  }\n\n  /**\n   * Helper to translate the editor with the keyboard when it's empty.\n   * @param {number} x in page units.\n   * @param {number} y in page units.\n   */\n  _translateEmpty(x, y) {\n    this._uiManager.translateSelectedEditors(x, y, /* noCommit = */ true);\n  }\n\n  /** @inheritdoc */\n  getInitialTranslation() {\n    // The start of the base line is where the user clicked.\n    const scale = this.parentScale;\n    return [\n      -FreeTextEditor._internalPadding * scale,\n      -(FreeTextEditor._internalPadding + this.#fontSize) * scale,\n    ];\n  }\n\n  /** @inheritdoc */\n  rebuild() {\n    if (!this.parent) {\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n\n    if (!this.isAttachedToDOM) {\n      // At some point this editor was removed and we're rebuilting it,\n      // hence we must add it to its parent.\n      this.parent.add(this);\n    }\n  }\n\n  /** @inheritdoc */\n  enableEditMode() {\n    if (this.isInEditMode()) {\n      return;\n    }\n\n    this.parent.setEditingState(false);\n    this.parent.updateToolbar(AnnotationEditorType.FREETEXT);\n    super.enableEditMode();\n    this.overlayDiv.classList.remove(\"enabled\");\n    this.editorDiv.contentEditable = true;\n    this._isDraggable = false;\n    this.div.removeAttribute(\"aria-activedescendant\");\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        !this.#editModeAC,\n        \"No `this.#editModeAC` AbortController should exist.\"\n      );\n    }\n    this.#editModeAC = new AbortController();\n    const signal = this._uiManager.combinedSignal(this.#editModeAC);\n\n    this.editorDiv.addEventListener(\n      \"keydown\",\n      this.editorDivKeydown.bind(this),\n      { signal }\n    );\n    this.editorDiv.addEventListener(\"focus\", this.editorDivFocus.bind(this), {\n      signal,\n    });\n    this.editorDiv.addEventListener(\"blur\", this.editorDivBlur.bind(this), {\n      signal,\n    });\n    this.editorDiv.addEventListener(\"input\", this.editorDivInput.bind(this), {\n      signal,\n    });\n    this.editorDiv.addEventListener(\"paste\", this.editorDivPaste.bind(this), {\n      signal,\n    });\n  }\n\n  /** @inheritdoc */\n  disableEditMode() {\n    if (!this.isInEditMode()) {\n      return;\n    }\n\n    this.parent.setEditingState(true);\n    super.disableEditMode();\n    this.overlayDiv.classList.add(\"enabled\");\n    this.editorDiv.contentEditable = false;\n    this.div.setAttribute(\"aria-activedescendant\", this.#editorDivId);\n    this._isDraggable = true;\n\n    this.#editModeAC?.abort();\n    this.#editModeAC = null;\n\n    // On Chrome, the focus is given to <body> when contentEditable is set to\n    // false, hence we focus the div.\n    this.div.focus({\n      preventScroll: true /* See issue #15744 */,\n    });\n\n    // In case the blur callback hasn't been called.\n    this.isEditing = false;\n    this.parent.div.classList.add(\"freetextEditing\");\n  }\n\n  /** @inheritdoc */\n  focusin(event) {\n    if (!this._focusEventsAllowed) {\n      return;\n    }\n    super.focusin(event);\n    if (event.target !== this.editorDiv) {\n      this.editorDiv.focus();\n    }\n  }\n\n  /** @inheritdoc */\n  onceAdded(focus) {\n    if (this.width) {\n      // The editor was created in using ctrl+c.\n      return;\n    }\n    this.enableEditMode();\n    if (focus) {\n      this.editorDiv.focus();\n    }\n    if (this._initialOptions?.isCentered) {\n      this.center();\n    }\n    this._initialOptions = null;\n  }\n\n  /** @inheritdoc */\n  isEmpty() {\n    return !this.editorDiv || this.editorDiv.innerText.trim() === \"\";\n  }\n\n  /** @inheritdoc */\n  remove() {\n    this.isEditing = false;\n    if (this.parent) {\n      this.parent.setEditingState(true);\n      this.parent.div.classList.add(\"freetextEditing\");\n    }\n    super.remove();\n  }\n\n  /**\n   * Extract the text from this editor.\n   * @returns {string}\n   */\n  #extractText() {\n    // We don't use innerText because there are some bugs with line breaks.\n    const buffer = [];\n    this.editorDiv.normalize();\n    let prevChild = null;\n    for (const child of this.editorDiv.childNodes) {\n      if (prevChild?.nodeType === Node.TEXT_NODE && child.nodeName === \"BR\") {\n        // It can happen if the user uses shift+enter to add a new line.\n        // If we don't skip it, we'll end up with an extra line (one for the\n        // text and one for the br element).\n        continue;\n      }\n      buffer.push(FreeTextEditor.#getNodeContent(child));\n      prevChild = child;\n    }\n    return buffer.join(\"\\n\");\n  }\n\n  #setEditorDimensions() {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n\n    let rect;\n    if (this.isAttachedToDOM) {\n      rect = this.div.getBoundingClientRect();\n    } else {\n      // This editor isn't on screen but we need to get its dimensions, so\n      // we just insert it in the DOM, get its bounding box and then remove it.\n      const { currentLayer, div } = this;\n      const savedDisplay = div.style.display;\n      const savedVisibility = div.classList.contains(\"hidden\");\n      div.classList.remove(\"hidden\");\n      div.style.display = \"hidden\";\n      currentLayer.div.append(this.div);\n      rect = div.getBoundingClientRect();\n      div.remove();\n      div.style.display = savedDisplay;\n      div.classList.toggle(\"hidden\", savedVisibility);\n    }\n\n    // The dimensions are relative to the rotation of the page, hence we need to\n    // take that into account (see issue #16636).\n    if (this.rotation % 180 === this.parentRotation % 180) {\n      this.width = rect.width / parentWidth;\n      this.height = rect.height / parentHeight;\n    } else {\n      this.width = rect.height / parentWidth;\n      this.height = rect.width / parentHeight;\n    }\n    this.fixAndSetPosition();\n  }\n\n  /**\n   * Commit the content we have in this editor.\n   * @returns {undefined}\n   */\n  commit() {\n    if (!this.isInEditMode()) {\n      return;\n    }\n\n    super.commit();\n    this.disableEditMode();\n    const savedText = this.#content;\n    const newText = (this.#content = this.#extractText().trimEnd());\n    if (savedText === newText) {\n      return;\n    }\n\n    const setText = text => {\n      this.#content = text;\n      if (!text) {\n        this.remove();\n        return;\n      }\n      this.#setContent();\n      this._uiManager.rebuild(this);\n      this.#setEditorDimensions();\n    };\n    this.addCommands({\n      cmd: () => {\n        setText(newText);\n      },\n      undo: () => {\n        setText(savedText);\n      },\n      mustExec: false,\n    });\n    this.#setEditorDimensions();\n  }\n\n  /** @inheritdoc */\n  shouldGetKeyboardEvents() {\n    return this.isInEditMode();\n  }\n\n  /** @inheritdoc */\n  enterInEditMode() {\n    this.enableEditMode();\n    this.editorDiv.focus();\n  }\n\n  /**\n   * ondblclick callback.\n   * @param {MouseEvent} event\n   */\n  dblclick(event) {\n    this.enterInEditMode();\n  }\n\n  /**\n   * onkeydown callback.\n   * @param {KeyboardEvent} event\n   */\n  keydown(event) {\n    if (event.target === this.div && event.key === \"Enter\") {\n      this.enterInEditMode();\n      // Avoid to add an unwanted new line.\n      event.preventDefault();\n    }\n  }\n\n  editorDivKeydown(event) {\n    FreeTextEditor._keyboardManager.exec(this, event);\n  }\n\n  editorDivFocus(event) {\n    this.isEditing = true;\n  }\n\n  editorDivBlur(event) {\n    this.isEditing = false;\n  }\n\n  editorDivInput(event) {\n    this.parent.div.classList.toggle(\"freetextEditing\", this.isEmpty());\n  }\n\n  /** @inheritdoc */\n  disableEditing() {\n    this.editorDiv.setAttribute(\"role\", \"comment\");\n    this.editorDiv.removeAttribute(\"aria-multiline\");\n  }\n\n  /** @inheritdoc */\n  enableEditing() {\n    this.editorDiv.setAttribute(\"role\", \"textbox\");\n    this.editorDiv.setAttribute(\"aria-multiline\", true);\n  }\n\n  /** @inheritdoc */\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n\n    let baseX, baseY;\n    if (this.width) {\n      baseX = this.x;\n      baseY = this.y;\n    }\n\n    super.render();\n    this.editorDiv = document.createElement(\"div\");\n    this.editorDiv.className = \"internal\";\n\n    this.editorDiv.setAttribute(\"id\", this.#editorDivId);\n    this.editorDiv.setAttribute(\"data-l10n-id\", \"pdfjs-free-text2\");\n    this.editorDiv.setAttribute(\"data-l10n-attrs\", \"default-content\");\n    this.enableEditing();\n\n    this.editorDiv.contentEditable = true;\n\n    const { style } = this.editorDiv;\n    style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`;\n    style.color = this.#color;\n\n    this.div.append(this.editorDiv);\n\n    this.overlayDiv = document.createElement(\"div\");\n    this.overlayDiv.classList.add(\"overlay\", \"enabled\");\n    this.div.append(this.overlayDiv);\n\n    bindEvents(this, this.div, [\"dblclick\", \"keydown\"]);\n\n    if (this.width) {\n      // This editor was created in using copy (ctrl+c).\n      const [parentWidth, parentHeight] = this.parentDimensions;\n      if (this.annotationElementId) {\n        // This stuff is hard to test: if something is changed here, please\n        // test with the following PDF file:\n        //  - freetexts.pdf\n        //  - rotated_freetexts.pdf\n        // Only small variations between the original annotation and its editor\n        // are allowed.\n\n        // position is the position of the first glyph in the annotation\n        // and it's relative to its container.\n        const { position } = this._initialData;\n        let [tx, ty] = this.getInitialTranslation();\n        [tx, ty] = this.pageTranslationToScreen(tx, ty);\n        const [pageWidth, pageHeight] = this.pageDimensions;\n        const [pageX, pageY] = this.pageTranslation;\n        let posX, posY;\n        switch (this.rotation) {\n          case 0:\n            posX = baseX + (position[0] - pageX) / pageWidth;\n            posY = baseY + this.height - (position[1] - pageY) / pageHeight;\n            break;\n          case 90:\n            posX = baseX + (position[0] - pageX) / pageWidth;\n            posY = baseY - (position[1] - pageY) / pageHeight;\n            [tx, ty] = [ty, -tx];\n            break;\n          case 180:\n            posX = baseX - this.width + (position[0] - pageX) / pageWidth;\n            posY = baseY - (position[1] - pageY) / pageHeight;\n            [tx, ty] = [-tx, -ty];\n            break;\n          case 270:\n            posX =\n              baseX +\n              (position[0] - pageX - this.height * pageHeight) / pageWidth;\n            posY =\n              baseY +\n              (position[1] - pageY - this.width * pageWidth) / pageHeight;\n            [tx, ty] = [-ty, tx];\n            break;\n        }\n        this.setAt(posX * parentWidth, posY * parentHeight, tx, ty);\n      } else {\n        this.setAt(\n          baseX * parentWidth,\n          baseY * parentHeight,\n          this.width * parentWidth,\n          this.height * parentHeight\n        );\n      }\n\n      this.#setContent();\n      this._isDraggable = true;\n      this.editorDiv.contentEditable = false;\n    } else {\n      this._isDraggable = false;\n      this.editorDiv.contentEditable = true;\n    }\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      this.div.setAttribute(\"annotation-id\", this.annotationElementId);\n    }\n\n    return this.div;\n  }\n\n  static #getNodeContent(node) {\n    return (\n      node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText\n    ).replaceAll(EOL_PATTERN, \"\");\n  }\n\n  editorDivPaste(event) {\n    const clipboardData = event.clipboardData || window.clipboardData;\n    const { types } = clipboardData;\n    if (types.length === 1 && types[0] === \"text/plain\") {\n      return;\n    }\n\n    event.preventDefault();\n    const paste = FreeTextEditor.#deserializeContent(\n      clipboardData.getData(\"text\") || \"\"\n    ).replaceAll(EOL_PATTERN, \"\\n\");\n    if (!paste) {\n      return;\n    }\n    const selection = window.getSelection();\n    if (!selection.rangeCount) {\n      return;\n    }\n    this.editorDiv.normalize();\n    selection.deleteFromDocument();\n    const range = selection.getRangeAt(0);\n    if (!paste.includes(\"\\n\")) {\n      range.insertNode(document.createTextNode(paste));\n      this.editorDiv.normalize();\n      selection.collapseToStart();\n      return;\n    }\n\n    // Collect the text before and after the caret.\n    const { startContainer, startOffset } = range;\n    const bufferBefore = [];\n    const bufferAfter = [];\n    if (startContainer.nodeType === Node.TEXT_NODE) {\n      const parent = startContainer.parentElement;\n      bufferAfter.push(\n        startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, \"\")\n      );\n      if (parent !== this.editorDiv) {\n        let buffer = bufferBefore;\n        for (const child of this.editorDiv.childNodes) {\n          if (child === parent) {\n            buffer = bufferAfter;\n            continue;\n          }\n          buffer.push(FreeTextEditor.#getNodeContent(child));\n        }\n      }\n      bufferBefore.push(\n        startContainer.nodeValue\n          .slice(0, startOffset)\n          .replaceAll(EOL_PATTERN, \"\")\n      );\n    } else if (startContainer === this.editorDiv) {\n      let buffer = bufferBefore;\n      let i = 0;\n      for (const child of this.editorDiv.childNodes) {\n        if (i++ === startOffset) {\n          buffer = bufferAfter;\n        }\n        buffer.push(FreeTextEditor.#getNodeContent(child));\n      }\n    }\n    this.#content = `${bufferBefore.join(\"\\n\")}${paste}${bufferAfter.join(\"\\n\")}`;\n    this.#setContent();\n\n    // Set the caret at the right position.\n    const newRange = new Range();\n    let beforeLength = bufferBefore.reduce((acc, line) => acc + line.length, 0);\n    for (const { firstChild } of this.editorDiv.childNodes) {\n      // Each child is either a div with a text node or a br element.\n      if (firstChild.nodeType === Node.TEXT_NODE) {\n        const length = firstChild.nodeValue.length;\n        if (beforeLength <= length) {\n          newRange.setStart(firstChild, beforeLength);\n          newRange.setEnd(firstChild, beforeLength);\n          break;\n        }\n        beforeLength -= length;\n      }\n    }\n    selection.removeAllRanges();\n    selection.addRange(newRange);\n  }\n\n  #setContent() {\n    this.editorDiv.replaceChildren();\n    if (!this.#content) {\n      return;\n    }\n    for (const line of this.#content.split(\"\\n\")) {\n      const div = document.createElement(\"div\");\n      div.append(\n        line ? document.createTextNode(line) : document.createElement(\"br\")\n      );\n      this.editorDiv.append(div);\n    }\n  }\n\n  #serializeContent() {\n    return this.#content.replaceAll(\"\\xa0\", \" \");\n  }\n\n  static #deserializeContent(content) {\n    return content.replaceAll(\" \", \"\\xa0\");\n  }\n\n  /** @inheritdoc */\n  get contentDiv() {\n    return this.editorDiv;\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    if (data instanceof FreeTextAnnotationElement) {\n      const {\n        data: {\n          defaultAppearanceData: { fontSize, fontColor },\n          rect,\n          rotation,\n          id,\n          popupRef,\n        },\n        textContent,\n        textPosition,\n        parent: {\n          page: { pageNumber },\n        },\n      } = data;\n      // textContent is supposed to be an array of strings containing each line\n      // of text. However, it can be null or empty.\n      if (!textContent || textContent.length === 0) {\n        // Empty annotation.\n        return null;\n      }\n      initialData = data = {\n        annotationType: AnnotationEditorType.FREETEXT,\n        color: Array.from(fontColor),\n        fontSize,\n        value: textContent.join(\"\\n\"),\n        position: textPosition,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        id,\n        deleted: false,\n        popupRef,\n      };\n    }\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor.#fontSize = data.fontSize;\n    editor.#color = Util.makeHexColor(...data.color);\n    editor.#content = FreeTextEditor.#deserializeContent(data.value);\n    editor.annotationElementId = data.id || null;\n    editor._initialData = initialData;\n\n    return editor;\n  }\n\n  /** @inheritdoc */\n  serialize(isForCopying = false) {\n    if (this.isEmpty()) {\n      return null;\n    }\n\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n\n    const padding = FreeTextEditor._internalPadding * this.parentScale;\n    const rect = this.getRect(padding, padding);\n    const color = AnnotationEditor._colorManager.convert(\n      this.isAttachedToDOM\n        ? getComputedStyle(this.editorDiv).color\n        : this.#color\n    );\n\n    const serialized = {\n      annotationType: AnnotationEditorType.FREETEXT,\n      color,\n      fontSize: this.#fontSize,\n      value: this.#serializeContent(),\n      pageIndex: this.pageIndex,\n      rect,\n      rotation: this.rotation,\n      structTreeParentId: this._structTreeParentId,\n    };\n\n    if (isForCopying) {\n      // Don't add the id when copying because the pasted editor mustn't be\n      // linked to an existing annotation.\n      return serialized;\n    }\n\n    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {\n      return null;\n    }\n\n    serialized.id = this.annotationElementId;\n\n    return serialized;\n  }\n\n  #hasElementChanged(serialized) {\n    const { value, fontSize, color, pageIndex } = this._initialData;\n\n    return (\n      this._hasBeenMoved ||\n      serialized.value !== value ||\n      serialized.fontSize !== fontSize ||\n      serialized.color.some((c, i) => c !== color[i]) ||\n      serialized.pageIndex !== pageIndex\n    );\n  }\n\n  /** @inheritdoc */\n  renderAnnotationElement(annotation) {\n    const content = super.renderAnnotationElement(annotation);\n    if (this.deleted) {\n      return content;\n    }\n    const { style } = content;\n    style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`;\n    style.color = this.#color;\n\n    content.replaceChildren();\n    for (const line of this.#content.split(\"\\n\")) {\n      const div = document.createElement(\"div\");\n      div.append(\n        line ? document.createTextNode(line) : document.createElement(\"br\")\n      );\n      content.append(div);\n    }\n\n    const padding = FreeTextEditor._internalPadding * this.parentScale;\n    annotation.updateEdited({\n      rect: this.getRect(padding, padding),\n      popupContent: this.#content,\n    });\n\n    return content;\n  }\n\n  resetAnnotationElement(annotation) {\n    super.resetAnnotationElement(annotation);\n    annotation.resetEdited();\n  }\n}\n\nexport { FreeTextEditor };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { unreachable } from \"../../../shared/util.js\";\n\nclass Outline {\n  static PRECISION = 1e-4;\n\n  /**\n   * @returns {string} The SVG path of the outline.\n   */\n  toSVGPath() {\n    unreachable(\"Abstract method `toSVGPath` must be implemented.\");\n  }\n\n  /**\n   * @type {Object|null} The bounding box of the outline.\n   */\n  // eslint-disable-next-line getter-return\n  get box() {\n    unreachable(\"Abstract getter `box` must be implemented.\");\n  }\n\n  serialize(_bbox, _rotation) {\n    unreachable(\"Abstract method `serialize` must be implemented.\");\n  }\n\n  static _rescale(src, tx, ty, sx, sy, dest) {\n    dest ||= new Float32Array(src.length);\n    for (let i = 0, ii = src.length; i < ii; i += 2) {\n      dest[i] = tx + src[i] * sx;\n      dest[i + 1] = ty + src[i + 1] * sy;\n    }\n    return dest;\n  }\n\n  static _rescaleAndSwap(src, tx, ty, sx, sy, dest) {\n    dest ||= new Float32Array(src.length);\n    for (let i = 0, ii = src.length; i < ii; i += 2) {\n      dest[i] = tx + src[i + 1] * sx;\n      dest[i + 1] = ty + src[i] * sy;\n    }\n    return dest;\n  }\n\n  static _translate(src, tx, ty, dest) {\n    dest ||= new Float32Array(src.length);\n    for (let i = 0, ii = src.length; i < ii; i += 2) {\n      dest[i] = tx + src[i];\n      dest[i + 1] = ty + src[i + 1];\n    }\n    return dest;\n  }\n\n  static svgRound(x) {\n    // 0.1234 will be 1234 and this way we economize 2 bytes per number.\n    // Of course, it makes sense only when the viewBox is [0 0 10000 10000].\n    // And it helps to avoid bugs like:\n    //  https://bugzilla.mozilla.org/show_bug.cgi?id=1929340\n    return Math.round(x * 10000);\n  }\n\n  static _normalizePoint(x, y, parentWidth, parentHeight, rotation) {\n    switch (rotation) {\n      case 90:\n        return [1 - y / parentWidth, x / parentHeight];\n      case 180:\n        return [1 - x / parentWidth, 1 - y / parentHeight];\n      case 270:\n        return [y / parentWidth, 1 - x / parentHeight];\n      default:\n        return [x / parentWidth, y / parentHeight];\n    }\n  }\n\n  static _normalizePagePoint(x, y, rotation) {\n    switch (rotation) {\n      case 90:\n        return [1 - y, x];\n      case 180:\n        return [1 - x, 1 - y];\n      case 270:\n        return [y, 1 - x];\n      default:\n        return [x, y];\n    }\n  }\n\n  static createBezierPoints(x1, y1, x2, y2, x3, y3) {\n    return [\n      (x1 + 5 * x2) / 6,\n      (y1 + 5 * y2) / 6,\n      (5 * x2 + x3) / 6,\n      (5 * y2 + y3) / 6,\n      (x2 + x3) / 2,\n      (y2 + y3) / 2,\n    ];\n  }\n}\n\nexport { Outline };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Outline } from \"./outline.js\";\nimport { Util } from \"../../../shared/util.js\";\n\nclass FreeDrawOutliner {\n  #box;\n\n  #bottom = [];\n\n  #innerMargin;\n\n  #isLTR;\n\n  #top = [];\n\n  // The first 6 elements are the last 3 points of the top part of the outline.\n  // The next 6 elements are the last 3 points of the line.\n  // The next 6 elements are the last 3 points of the bottom part of the\n  // outline.\n  // We track the last 3 points in order to be able to:\n  //  - compute the normal of the line,\n  //  - compute the control points of the quadratic Bézier curve.\n  #last = new Float32Array(18);\n\n  #lastX;\n\n  #lastY;\n\n  #min;\n\n  #min_dist;\n\n  #scaleFactor;\n\n  #thickness;\n\n  #points = [];\n\n  static #MIN_DIST = 8;\n\n  static #MIN_DIFF = 2;\n\n  static #MIN = FreeDrawOutliner.#MIN_DIST + FreeDrawOutliner.#MIN_DIFF;\n\n  constructor({ x, y }, box, scaleFactor, thickness, isLTR, innerMargin = 0) {\n    this.#box = box;\n    this.#thickness = thickness * scaleFactor;\n    this.#isLTR = isLTR;\n    this.#last.set([NaN, NaN, NaN, NaN, x, y], 6);\n    this.#innerMargin = innerMargin;\n    this.#min_dist = FreeDrawOutliner.#MIN_DIST * scaleFactor;\n    this.#min = FreeDrawOutliner.#MIN * scaleFactor;\n    this.#scaleFactor = scaleFactor;\n    this.#points.push(x, y);\n  }\n\n  isEmpty() {\n    // When we add a second point then this.#last.slice(6) will be something\n    // like [NaN, NaN, firstX, firstY, secondX, secondY,...] so having a NaN\n    // at index 8 means that we've only one point.\n    return isNaN(this.#last[8]);\n  }\n\n  #getLastCoords() {\n    const lastTop = this.#last.subarray(4, 6);\n    const lastBottom = this.#last.subarray(16, 18);\n    const [x, y, width, height] = this.#box;\n\n    return [\n      (this.#lastX + (lastTop[0] - lastBottom[0]) / 2 - x) / width,\n      (this.#lastY + (lastTop[1] - lastBottom[1]) / 2 - y) / height,\n      (this.#lastX + (lastBottom[0] - lastTop[0]) / 2 - x) / width,\n      (this.#lastY + (lastBottom[1] - lastTop[1]) / 2 - y) / height,\n    ];\n  }\n\n  add({ x, y }) {\n    this.#lastX = x;\n    this.#lastY = y;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    let [x1, y1, x2, y2] = this.#last.subarray(8, 12);\n    const diffX = x - x2;\n    const diffY = y - y2;\n    const d = Math.hypot(diffX, diffY);\n    if (d < this.#min) {\n      // The idea is to avoid garbage points around the last point.\n      // When the points are too close, it just leads to bad normal vectors and\n      // control points.\n      return false;\n    }\n    const diffD = d - this.#min_dist;\n    const K = diffD / d;\n    const shiftX = K * diffX;\n    const shiftY = K * diffY;\n\n    // We update the last 3 points of the line.\n    let x0 = x1;\n    let y0 = y1;\n    x1 = x2;\n    y1 = y2;\n    x2 += shiftX;\n    y2 += shiftY;\n\n    // We keep track of the points in order to be able to compute the focus\n    // outline.\n    this.#points?.push(x, y);\n\n    // Create the normal unit vector.\n    // |(shiftX, shiftY)| = |K| * |(diffX, diffY)| = |K| * d = diffD.\n    const nX = -shiftY / diffD;\n    const nY = shiftX / diffD;\n    const thX = nX * this.#thickness;\n    const thY = nY * this.#thickness;\n    this.#last.set(this.#last.subarray(2, 8), 0);\n    this.#last.set([x2 + thX, y2 + thY], 4);\n    this.#last.set(this.#last.subarray(14, 18), 12);\n    this.#last.set([x2 - thX, y2 - thY], 16);\n\n    if (isNaN(this.#last[6])) {\n      if (this.#top.length === 0) {\n        this.#last.set([x1 + thX, y1 + thY], 2);\n        this.#top.push(\n          NaN,\n          NaN,\n          NaN,\n          NaN,\n          (x1 + thX - layerX) / layerWidth,\n          (y1 + thY - layerY) / layerHeight\n        );\n        this.#last.set([x1 - thX, y1 - thY], 14);\n        this.#bottom.push(\n          NaN,\n          NaN,\n          NaN,\n          NaN,\n          (x1 - thX - layerX) / layerWidth,\n          (y1 - thY - layerY) / layerHeight\n        );\n      }\n      this.#last.set([x0, y0, x1, y1, x2, y2], 6);\n      return !this.isEmpty();\n    }\n\n    this.#last.set([x0, y0, x1, y1, x2, y2], 6);\n\n    const angle = Math.abs(\n      Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX)\n    );\n    if (angle < Math.PI / 2) {\n      // In order to avoid some possible artifacts, we're going to use the a\n      // straight line instead of a quadratic Bézier curve.\n      [x1, y1, x2, y2] = this.#last.subarray(2, 6);\n      this.#top.push(\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        ((x1 + x2) / 2 - layerX) / layerWidth,\n        ((y1 + y2) / 2 - layerY) / layerHeight\n      );\n      [x1, y1, x0, y0] = this.#last.subarray(14, 18);\n      this.#bottom.push(\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        ((x0 + x1) / 2 - layerX) / layerWidth,\n        ((y0 + y1) / 2 - layerY) / layerHeight\n      );\n      return true;\n    }\n\n    // Control points and the final point for the quadratic Bézier curve.\n    [x0, y0, x1, y1, x2, y2] = this.#last.subarray(0, 6);\n    this.#top.push(\n      ((x0 + 5 * x1) / 6 - layerX) / layerWidth,\n      ((y0 + 5 * y1) / 6 - layerY) / layerHeight,\n      ((5 * x1 + x2) / 6 - layerX) / layerWidth,\n      ((5 * y1 + y2) / 6 - layerY) / layerHeight,\n      ((x1 + x2) / 2 - layerX) / layerWidth,\n      ((y1 + y2) / 2 - layerY) / layerHeight\n    );\n    [x2, y2, x1, y1, x0, y0] = this.#last.subarray(12, 18);\n    this.#bottom.push(\n      ((x0 + 5 * x1) / 6 - layerX) / layerWidth,\n      ((y0 + 5 * y1) / 6 - layerY) / layerHeight,\n      ((5 * x1 + x2) / 6 - layerX) / layerWidth,\n      ((5 * y1 + y2) / 6 - layerY) / layerHeight,\n      ((x1 + x2) / 2 - layerX) / layerWidth,\n      ((y1 + y2) / 2 - layerY) / layerHeight\n    );\n    return true;\n  }\n\n  toSVGPath() {\n    if (this.isEmpty()) {\n      // We've only one point.\n      return \"\";\n    }\n    const top = this.#top;\n    const bottom = this.#bottom;\n\n    if (isNaN(this.#last[6]) && !this.isEmpty()) {\n      // We've only two points.\n      return this.#toSVGPathTwoPoints();\n    }\n\n    const buffer = [];\n    buffer.push(`M${top[4]} ${top[5]}`);\n    for (let i = 6; i < top.length; i += 6) {\n      if (isNaN(top[i])) {\n        buffer.push(`L${top[i + 4]} ${top[i + 5]}`);\n      } else {\n        buffer.push(\n          `C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${\n            top[i + 5]\n          }`\n        );\n      }\n    }\n\n    this.#toSVGPathEnd(buffer);\n\n    for (let i = bottom.length - 6; i >= 6; i -= 6) {\n      if (isNaN(bottom[i])) {\n        buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`);\n      } else {\n        buffer.push(\n          `C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${\n            bottom[i + 4]\n          } ${bottom[i + 5]}`\n        );\n      }\n    }\n\n    this.#toSVGPathStart(buffer);\n\n    return buffer.join(\" \");\n  }\n\n  #toSVGPathTwoPoints() {\n    const [x, y, width, height] = this.#box;\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] =\n      this.#getLastCoords();\n\n    return `M${(this.#last[2] - x) / width} ${\n      (this.#last[3] - y) / height\n    } L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${\n      (this.#last[16] - x) / width\n    } ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${\n      (this.#last[15] - y) / height\n    } Z`;\n  }\n\n  #toSVGPathStart(buffer) {\n    const bottom = this.#bottom;\n    buffer.push(`L${bottom[4]} ${bottom[5]} Z`);\n  }\n\n  #toSVGPathEnd(buffer) {\n    const [x, y, width, height] = this.#box;\n    const lastTop = this.#last.subarray(4, 6);\n    const lastBottom = this.#last.subarray(16, 18);\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] =\n      this.#getLastCoords();\n\n    buffer.push(\n      `L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${\n        (lastBottom[0] - x) / width\n      } ${(lastBottom[1] - y) / height}`\n    );\n  }\n\n  newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) {\n    return new FreeDrawOutline(\n      outline,\n      points,\n      box,\n      scaleFactor,\n      innerMargin,\n      isLTR\n    );\n  }\n\n  getOutlines() {\n    const top = this.#top;\n    const bottom = this.#bottom;\n    const last = this.#last;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n\n    const points = new Float32Array((this.#points?.length ?? 0) + 2);\n    for (let i = 0, ii = points.length - 2; i < ii; i += 2) {\n      points[i] = (this.#points[i] - layerX) / layerWidth;\n      points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight;\n    }\n    points[points.length - 2] = (this.#lastX - layerX) / layerWidth;\n    points[points.length - 1] = (this.#lastY - layerY) / layerHeight;\n\n    if (isNaN(last[6]) && !this.isEmpty()) {\n      // We've only two points.\n      return this.#getOutlineTwoPoints(points);\n    }\n\n    const outline = new Float32Array(\n      this.#top.length + 24 + this.#bottom.length\n    );\n    let N = top.length;\n    for (let i = 0; i < N; i += 2) {\n      if (isNaN(top[i])) {\n        outline[i] = outline[i + 1] = NaN;\n        continue;\n      }\n      outline[i] = top[i];\n      outline[i + 1] = top[i + 1];\n    }\n\n    N = this.#getOutlineEnd(outline, N);\n\n    for (let i = bottom.length - 6; i >= 6; i -= 6) {\n      for (let j = 0; j < 6; j += 2) {\n        if (isNaN(bottom[i + j])) {\n          outline[N] = outline[N + 1] = NaN;\n          N += 2;\n          continue;\n        }\n        outline[N] = bottom[i + j];\n        outline[N + 1] = bottom[i + j + 1];\n        N += 2;\n      }\n    }\n\n    this.#getOutlineStart(outline, N);\n\n    return this.newFreeDrawOutline(\n      outline,\n      points,\n      this.#box,\n      this.#scaleFactor,\n      this.#innerMargin,\n      this.#isLTR\n    );\n  }\n\n  #getOutlineTwoPoints(points) {\n    const last = this.#last;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] =\n      this.#getLastCoords();\n    const outline = new Float32Array(36);\n    outline.set(\n      [\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (last[2] - layerX) / layerWidth,\n        (last[3] - layerY) / layerHeight,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (last[4] - layerX) / layerWidth,\n        (last[5] - layerY) / layerHeight,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        lastTopX,\n        lastTopY,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        lastBottomX,\n        lastBottomY,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (last[16] - layerX) / layerWidth,\n        (last[17] - layerY) / layerHeight,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (last[14] - layerX) / layerWidth,\n        (last[15] - layerY) / layerHeight,\n      ],\n      0\n    );\n    return this.newFreeDrawOutline(\n      outline,\n      points,\n      this.#box,\n      this.#scaleFactor,\n      this.#innerMargin,\n      this.#isLTR\n    );\n  }\n\n  #getOutlineStart(outline, pos) {\n    const bottom = this.#bottom;\n    outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], pos);\n    return (pos += 6);\n  }\n\n  #getOutlineEnd(outline, pos) {\n    const lastTop = this.#last.subarray(4, 6);\n    const lastBottom = this.#last.subarray(16, 18);\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] =\n      this.#getLastCoords();\n    outline.set(\n      [\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (lastTop[0] - layerX) / layerWidth,\n        (lastTop[1] - layerY) / layerHeight,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        lastTopX,\n        lastTopY,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        lastBottomX,\n        lastBottomY,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (lastBottom[0] - layerX) / layerWidth,\n        (lastBottom[1] - layerY) / layerHeight,\n      ],\n      pos\n    );\n    return (pos += 24);\n  }\n}\n\nclass FreeDrawOutline extends Outline {\n  #box;\n\n  #bbox = new Float32Array(4);\n\n  #innerMargin;\n\n  #isLTR;\n\n  #points;\n\n  #scaleFactor;\n\n  #outline;\n\n  constructor(outline, points, box, scaleFactor, innerMargin, isLTR) {\n    super();\n    this.#outline = outline;\n    this.#points = points;\n    this.#box = box;\n    this.#scaleFactor = scaleFactor;\n    this.#innerMargin = innerMargin;\n    this.#isLTR = isLTR;\n    this.lastPoint = [NaN, NaN];\n    this.#computeMinMax(isLTR);\n\n    const [x, y, width, height] = this.#bbox;\n    for (let i = 0, ii = outline.length; i < ii; i += 2) {\n      outline[i] = (outline[i] - x) / width;\n      outline[i + 1] = (outline[i + 1] - y) / height;\n    }\n    for (let i = 0, ii = points.length; i < ii; i += 2) {\n      points[i] = (points[i] - x) / width;\n      points[i + 1] = (points[i + 1] - y) / height;\n    }\n  }\n\n  toSVGPath() {\n    const buffer = [`M${this.#outline[4]} ${this.#outline[5]}`];\n    for (let i = 6, ii = this.#outline.length; i < ii; i += 6) {\n      if (isNaN(this.#outline[i])) {\n        buffer.push(`L${this.#outline[i + 4]} ${this.#outline[i + 5]}`);\n        continue;\n      }\n      buffer.push(\n        `C${this.#outline[i]} ${this.#outline[i + 1]} ${this.#outline[i + 2]} ${\n          this.#outline[i + 3]\n        } ${this.#outline[i + 4]} ${this.#outline[i + 5]}`\n      );\n    }\n    buffer.push(\"Z\");\n    return buffer.join(\" \");\n  }\n\n  serialize([blX, blY, trX, trY], rotation) {\n    const width = trX - blX;\n    const height = trY - blY;\n    let outline;\n    let points;\n    switch (rotation) {\n      case 0:\n        outline = Outline._rescale(this.#outline, blX, trY, width, -height);\n        points = Outline._rescale(this.#points, blX, trY, width, -height);\n        break;\n      case 90:\n        outline = Outline._rescaleAndSwap(\n          this.#outline,\n          blX,\n          blY,\n          width,\n          height\n        );\n        points = Outline._rescaleAndSwap(this.#points, blX, blY, width, height);\n        break;\n      case 180:\n        outline = Outline._rescale(this.#outline, trX, blY, -width, height);\n        points = Outline._rescale(this.#points, trX, blY, -width, height);\n        break;\n      case 270:\n        outline = Outline._rescaleAndSwap(\n          this.#outline,\n          trX,\n          trY,\n          -width,\n          -height\n        );\n        points = Outline._rescaleAndSwap(\n          this.#points,\n          trX,\n          trY,\n          -width,\n          -height\n        );\n        break;\n    }\n    return { outline: Array.from(outline), points: [Array.from(points)] };\n  }\n\n  #computeMinMax(isLTR) {\n    const outline = this.#outline;\n    let lastX = outline[4];\n    let lastY = outline[5];\n    let minX = lastX;\n    let minY = lastY;\n    let maxX = lastX;\n    let maxY = lastY;\n    let lastPointX = lastX;\n    let lastPointY = lastY;\n    const ltrCallback = isLTR ? Math.max : Math.min;\n\n    for (let i = 6, ii = outline.length; i < ii; i += 6) {\n      if (isNaN(outline[i])) {\n        minX = Math.min(minX, outline[i + 4]);\n        minY = Math.min(minY, outline[i + 5]);\n        maxX = Math.max(maxX, outline[i + 4]);\n        maxY = Math.max(maxY, outline[i + 5]);\n        if (lastPointY < outline[i + 5]) {\n          lastPointX = outline[i + 4];\n          lastPointY = outline[i + 5];\n        } else if (lastPointY === outline[i + 5]) {\n          lastPointX = ltrCallback(lastPointX, outline[i + 4]);\n        }\n      } else {\n        const bbox = Util.bezierBoundingBox(\n          lastX,\n          lastY,\n          ...outline.slice(i, i + 6)\n        );\n        minX = Math.min(minX, bbox[0]);\n        minY = Math.min(minY, bbox[1]);\n        maxX = Math.max(maxX, bbox[2]);\n        maxY = Math.max(maxY, bbox[3]);\n        if (lastPointY < bbox[3]) {\n          lastPointX = bbox[2];\n          lastPointY = bbox[3];\n        } else if (lastPointY === bbox[3]) {\n          lastPointX = ltrCallback(lastPointX, bbox[2]);\n        }\n      }\n      lastX = outline[i + 4];\n      lastY = outline[i + 5];\n    }\n\n    const bbox = this.#bbox;\n    bbox[0] = minX - this.#innerMargin;\n    bbox[1] = minY - this.#innerMargin;\n    bbox[2] = maxX - minX + 2 * this.#innerMargin;\n    bbox[3] = maxY - minY + 2 * this.#innerMargin;\n    this.lastPoint = [lastPointX, lastPointY];\n  }\n\n  get box() {\n    return this.#bbox;\n  }\n\n  newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) {\n    return new FreeDrawOutliner(\n      point,\n      box,\n      scaleFactor,\n      thickness,\n      isLTR,\n      innerMargin\n    );\n  }\n\n  getNewOutline(thickness, innerMargin) {\n    // Build the outline of the highlight to use as the focus outline.\n    const [x, y, width, height] = this.#bbox;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    const sx = width * layerWidth;\n    const sy = height * layerHeight;\n    const tx = x * layerWidth + layerX;\n    const ty = y * layerHeight + layerY;\n    const outliner = this.newOutliner(\n      {\n        x: this.#points[0] * sx + tx,\n        y: this.#points[1] * sy + ty,\n      },\n      this.#box,\n      this.#scaleFactor,\n      thickness,\n      this.#isLTR,\n      innerMargin ?? this.#innerMargin\n    );\n    for (let i = 2; i < this.#points.length; i += 2) {\n      outliner.add({\n        x: this.#points[i] * sx + tx,\n        y: this.#points[i + 1] * sy + ty,\n      });\n    }\n    return outliner.getOutlines();\n  }\n}\n\nexport { FreeDrawOutline, FreeDrawOutliner };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FreeDrawOutline, FreeDrawOutliner } from \"./freedraw.js\";\nimport { Outline } from \"./outline.js\";\n\nclass HighlightOutliner {\n  #box;\n\n  #lastPoint;\n\n  #verticalEdges = [];\n\n  #intervals = [];\n\n  /**\n   * Construct an outliner.\n   * @param {Array<Object>} boxes - An array of axis-aligned rectangles.\n   * @param {number} borderWidth - The width of the border of the boxes, it\n   *   allows to make the boxes bigger (or smaller).\n   * @param {number} innerMargin - The margin between the boxes and the\n   *   outlines. It's important to not have a null innerMargin when we want to\n   *   draw the outline else the stroked outline could be clipped because of its\n   *   width.\n   * @param {boolean} isLTR - true if we're in LTR mode. It's used to determine\n   *   the last point of the boxes.\n   */\n  constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) {\n    let minX = Infinity;\n    let maxX = -Infinity;\n    let minY = Infinity;\n    let maxY = -Infinity;\n\n    // We round the coordinates to slightly reduce the number of edges in the\n    // final outlines.\n    const NUMBER_OF_DIGITS = 4;\n    const EPSILON = 10 ** -NUMBER_OF_DIGITS;\n\n    // The coordinates of the boxes are in the page coordinate system.\n    for (const { x, y, width, height } of boxes) {\n      const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON;\n      const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON;\n      const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON;\n      const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON;\n      const left = [x1, y1, y2, true];\n      const right = [x2, y1, y2, false];\n      this.#verticalEdges.push(left, right);\n\n      minX = Math.min(minX, x1);\n      maxX = Math.max(maxX, x2);\n      minY = Math.min(minY, y1);\n      maxY = Math.max(maxY, y2);\n    }\n\n    const bboxWidth = maxX - minX + 2 * innerMargin;\n    const bboxHeight = maxY - minY + 2 * innerMargin;\n    const shiftedMinX = minX - innerMargin;\n    const shiftedMinY = minY - innerMargin;\n    const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2);\n    const lastPoint = [lastEdge[0], lastEdge[2]];\n\n    // Convert the coordinates of the edges into box coordinates.\n    for (const edge of this.#verticalEdges) {\n      const [x, y1, y2] = edge;\n      edge[0] = (x - shiftedMinX) / bboxWidth;\n      edge[1] = (y1 - shiftedMinY) / bboxHeight;\n      edge[2] = (y2 - shiftedMinY) / bboxHeight;\n    }\n\n    this.#box = new Float32Array([\n      shiftedMinX,\n      shiftedMinY,\n      bboxWidth,\n      bboxHeight,\n    ]);\n    this.#lastPoint = lastPoint;\n  }\n\n  getOutlines() {\n    // We begin to sort lexicographically the vertical edges by their abscissa,\n    // and then by their ordinate.\n    this.#verticalEdges.sort(\n      (a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]\n    );\n\n    // We're now using a sweep line algorithm to find the outlines.\n    // We start with the leftmost vertical edge, and we're going to iterate\n    // over all the vertical edges from left to right.\n    // Each time we encounter a left edge, we're going to insert the interval\n    // [y1, y2] in the set of intervals.\n    // This set of intervals is used to break the vertical edges into chunks:\n    // we only take the part of the vertical edge that isn't in the union of\n    // the intervals.\n    const outlineVerticalEdges = [];\n    for (const edge of this.#verticalEdges) {\n      if (edge[3]) {\n        // Left edge.\n        outlineVerticalEdges.push(...this.#breakEdge(edge));\n        this.#insert(edge);\n      } else {\n        // Right edge.\n        this.#remove(edge);\n        outlineVerticalEdges.push(...this.#breakEdge(edge));\n      }\n    }\n    return this.#getOutlines(outlineVerticalEdges);\n  }\n\n  #getOutlines(outlineVerticalEdges) {\n    const edges = [];\n    const allEdges = new Set();\n\n    for (const edge of outlineVerticalEdges) {\n      const [x, y1, y2] = edge;\n      edges.push([x, y1, edge], [x, y2, edge]);\n    }\n\n    // We sort lexicographically the vertices of each edge by their ordinate and\n    // by their abscissa.\n    // Every pair (v_2i, v_{2i + 1}) of vertices defines a horizontal edge.\n    // So for every vertical edge, we're going to add the two vertical edges\n    // which are connected to it through a horizontal edge.\n    edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]);\n    for (let i = 0, ii = edges.length; i < ii; i += 2) {\n      const edge1 = edges[i][2];\n      const edge2 = edges[i + 1][2];\n      edge1.push(edge2);\n      edge2.push(edge1);\n      allEdges.add(edge1);\n      allEdges.add(edge2);\n    }\n    const outlines = [];\n    let outline;\n\n    while (allEdges.size > 0) {\n      const edge = allEdges.values().next().value;\n      let [x, y1, y2, edge1, edge2] = edge;\n      allEdges.delete(edge);\n      let lastPointX = x;\n      let lastPointY = y1;\n\n      outline = [x, y2];\n      outlines.push(outline);\n\n      while (true) {\n        let e;\n        if (allEdges.has(edge1)) {\n          e = edge1;\n        } else if (allEdges.has(edge2)) {\n          e = edge2;\n        } else {\n          break;\n        }\n\n        allEdges.delete(e);\n        [x, y1, y2, edge1, edge2] = e;\n\n        if (lastPointX !== x) {\n          outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2);\n          lastPointX = x;\n        }\n        lastPointY = lastPointY === y1 ? y2 : y1;\n      }\n      outline.push(lastPointX, lastPointY);\n    }\n    return new HighlightOutline(outlines, this.#box, this.#lastPoint);\n  }\n\n  #binarySearch(y) {\n    const array = this.#intervals;\n    let start = 0;\n    let end = array.length - 1;\n\n    while (start <= end) {\n      const middle = (start + end) >> 1;\n      const y1 = array[middle][0];\n      if (y1 === y) {\n        return middle;\n      }\n      if (y1 < y) {\n        start = middle + 1;\n      } else {\n        end = middle - 1;\n      }\n    }\n    return end + 1;\n  }\n\n  #insert([, y1, y2]) {\n    const index = this.#binarySearch(y1);\n    this.#intervals.splice(index, 0, [y1, y2]);\n  }\n\n  #remove([, y1, y2]) {\n    const index = this.#binarySearch(y1);\n    for (let i = index; i < this.#intervals.length; i++) {\n      const [start, end] = this.#intervals[i];\n      if (start !== y1) {\n        break;\n      }\n      if (start === y1 && end === y2) {\n        this.#intervals.splice(i, 1);\n        return;\n      }\n    }\n    for (let i = index - 1; i >= 0; i--) {\n      const [start, end] = this.#intervals[i];\n      if (start !== y1) {\n        break;\n      }\n      if (start === y1 && end === y2) {\n        this.#intervals.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  #breakEdge(edge) {\n    const [x, y1, y2] = edge;\n    const results = [[x, y1, y2]];\n    const index = this.#binarySearch(y2);\n    for (let i = 0; i < index; i++) {\n      const [start, end] = this.#intervals[i];\n      for (let j = 0, jj = results.length; j < jj; j++) {\n        const [, y3, y4] = results[j];\n        if (end <= y3 || y4 <= start) {\n          // There is no intersection between the interval and the edge, hence\n          // we keep it as is.\n          continue;\n        }\n        if (y3 >= start) {\n          if (y4 > end) {\n            results[j][1] = end;\n          } else {\n            if (jj === 1) {\n              return [];\n            }\n            // The edge is included in the interval, hence we remove it.\n            results.splice(j, 1);\n            j--;\n            jj--;\n          }\n          continue;\n        }\n        results[j][2] = start;\n        if (y4 > end) {\n          results.push([x, end, y4]);\n        }\n      }\n    }\n    return results;\n  }\n}\n\nclass HighlightOutline extends Outline {\n  #box;\n\n  #outlines;\n\n  constructor(outlines, box, lastPoint) {\n    super();\n    this.#outlines = outlines;\n    this.#box = box;\n    this.lastPoint = lastPoint;\n  }\n\n  toSVGPath() {\n    const buffer = [];\n    for (const polygon of this.#outlines) {\n      let [prevX, prevY] = polygon;\n      buffer.push(`M${prevX} ${prevY}`);\n      for (let i = 2; i < polygon.length; i += 2) {\n        const x = polygon[i];\n        const y = polygon[i + 1];\n        if (x === prevX) {\n          buffer.push(`V${y}`);\n          prevY = y;\n        } else if (y === prevY) {\n          buffer.push(`H${x}`);\n          prevX = x;\n        }\n      }\n      buffer.push(\"Z\");\n    }\n    return buffer.join(\" \");\n  }\n\n  /**\n   * Serialize the outlines into the PDF page coordinate system.\n   * @param {Array<number>} _bbox - the bounding box of the annotation.\n   * @param {number} _rotation - the rotation of the annotation.\n   * @returns {Array<Array<number>>}\n   */\n  serialize([blX, blY, trX, trY], _rotation) {\n    const outlines = [];\n    const width = trX - blX;\n    const height = trY - blY;\n    for (const outline of this.#outlines) {\n      const points = new Array(outline.length);\n      for (let i = 0; i < outline.length; i += 2) {\n        points[i] = blX + outline[i] * width;\n        points[i + 1] = trY - outline[i + 1] * height;\n      }\n      outlines.push(points);\n    }\n    return outlines;\n  }\n\n  get box() {\n    return this.#box;\n  }\n\n  get classNamesForOutlining() {\n    return [\"highlightOutline\"];\n  }\n}\n\nclass FreeHighlightOutliner extends FreeDrawOutliner {\n  newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) {\n    return new FreeHighlightOutline(\n      outline,\n      points,\n      box,\n      scaleFactor,\n      innerMargin,\n      isLTR\n    );\n  }\n}\n\nclass FreeHighlightOutline extends FreeDrawOutline {\n  newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) {\n    return new FreeHighlightOutliner(\n      point,\n      box,\n      scaleFactor,\n      thickness,\n      isLTR,\n      innerMargin\n    );\n  }\n}\n\nexport { FreeHighlightOutliner, HighlightOutliner };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AnnotationEditorParamsType, shadow } from \"../../shared/util.js\";\nimport { KeyboardManager } from \"./tools.js\";\nimport { noContextMenu } from \"../display_utils.js\";\n\nclass ColorPicker {\n  #button = null;\n\n  #buttonSwatch = null;\n\n  #defaultColor;\n\n  #dropdown = null;\n\n  #dropdownWasFromKeyboard = false;\n\n  #isMainColorPicker = false;\n\n  #editor = null;\n\n  #eventBus;\n\n  #openDropdownAC = null;\n\n  #uiManager = null;\n\n  #type;\n\n  static #l10nColor = null;\n\n  static get _keyboardManager() {\n    return shadow(\n      this,\n      \"_keyboardManager\",\n      new KeyboardManager([\n        [\n          [\"Escape\", \"mac+Escape\"],\n          ColorPicker.prototype._hideDropdownFromKeyboard,\n        ],\n        [[\" \", \"mac+ \"], ColorPicker.prototype._colorSelectFromKeyboard],\n        [\n          [\"ArrowDown\", \"ArrowRight\", \"mac+ArrowDown\", \"mac+ArrowRight\"],\n          ColorPicker.prototype._moveToNext,\n        ],\n        [\n          [\"ArrowUp\", \"ArrowLeft\", \"mac+ArrowUp\", \"mac+ArrowLeft\"],\n          ColorPicker.prototype._moveToPrevious,\n        ],\n        [[\"Home\", \"mac+Home\"], ColorPicker.prototype._moveToBeginning],\n        [[\"End\", \"mac+End\"], ColorPicker.prototype._moveToEnd],\n      ])\n    );\n  }\n\n  constructor({ editor = null, uiManager = null }) {\n    if (editor) {\n      this.#isMainColorPicker = false;\n      this.#type = AnnotationEditorParamsType.HIGHLIGHT_COLOR;\n      this.#editor = editor;\n    } else {\n      this.#isMainColorPicker = true;\n      this.#type = AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR;\n    }\n    this.#uiManager = editor?._uiManager || uiManager;\n    this.#eventBus = this.#uiManager._eventBus;\n    this.#defaultColor =\n      editor?.color ||\n      this.#uiManager?.highlightColors.values().next().value ||\n      \"#FFFF98\";\n\n    ColorPicker.#l10nColor ||= Object.freeze({\n      blue: \"pdfjs-editor-colorpicker-blue\",\n      green: \"pdfjs-editor-colorpicker-green\",\n      pink: \"pdfjs-editor-colorpicker-pink\",\n      red: \"pdfjs-editor-colorpicker-red\",\n      yellow: \"pdfjs-editor-colorpicker-yellow\",\n    });\n  }\n\n  renderButton() {\n    const button = (this.#button = document.createElement(\"button\"));\n    button.className = \"colorPicker\";\n    button.tabIndex = \"0\";\n    button.setAttribute(\"data-l10n-id\", \"pdfjs-editor-colorpicker-button\");\n    button.setAttribute(\"aria-haspopup\", true);\n    const signal = this.#uiManager._signal;\n    button.addEventListener(\"click\", this.#openDropdown.bind(this), { signal });\n    button.addEventListener(\"keydown\", this.#keyDown.bind(this), { signal });\n    const swatch = (this.#buttonSwatch = document.createElement(\"span\"));\n    swatch.className = \"swatch\";\n    swatch.setAttribute(\"aria-hidden\", true);\n    swatch.style.backgroundColor = this.#defaultColor;\n    button.append(swatch);\n    return button;\n  }\n\n  renderMainDropdown() {\n    const dropdown = (this.#dropdown = this.#getDropdownRoot());\n    dropdown.setAttribute(\"aria-orientation\", \"horizontal\");\n    dropdown.setAttribute(\"aria-labelledby\", \"highlightColorPickerLabel\");\n\n    return dropdown;\n  }\n\n  #getDropdownRoot() {\n    const div = document.createElement(\"div\");\n    const signal = this.#uiManager._signal;\n    div.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    div.className = \"dropdown\";\n    div.role = \"listbox\";\n    div.setAttribute(\"aria-multiselectable\", false);\n    div.setAttribute(\"aria-orientation\", \"vertical\");\n    div.setAttribute(\"data-l10n-id\", \"pdfjs-editor-colorpicker-dropdown\");\n    for (const [name, color] of this.#uiManager.highlightColors) {\n      const button = document.createElement(\"button\");\n      button.tabIndex = \"0\";\n      button.role = \"option\";\n      button.setAttribute(\"data-color\", color);\n      button.title = name;\n      button.setAttribute(\"data-l10n-id\", ColorPicker.#l10nColor[name]);\n      const swatch = document.createElement(\"span\");\n      button.append(swatch);\n      swatch.className = \"swatch\";\n      swatch.style.backgroundColor = color;\n      button.setAttribute(\"aria-selected\", color === this.#defaultColor);\n      button.addEventListener(\"click\", this.#colorSelect.bind(this, color), {\n        signal,\n      });\n      div.append(button);\n    }\n\n    div.addEventListener(\"keydown\", this.#keyDown.bind(this), { signal });\n\n    return div;\n  }\n\n  #colorSelect(color, event) {\n    event.stopPropagation();\n    this.#eventBus.dispatch(\"switchannotationeditorparams\", {\n      source: this,\n      type: this.#type,\n      value: color,\n    });\n  }\n\n  _colorSelectFromKeyboard(event) {\n    if (event.target === this.#button) {\n      this.#openDropdown(event);\n      return;\n    }\n    const color = event.target.getAttribute(\"data-color\");\n    if (!color) {\n      return;\n    }\n    this.#colorSelect(color, event);\n  }\n\n  _moveToNext(event) {\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n      return;\n    }\n    if (event.target === this.#button) {\n      this.#dropdown.firstChild?.focus();\n      return;\n    }\n    event.target.nextSibling?.focus();\n  }\n\n  _moveToPrevious(event) {\n    if (\n      event.target === this.#dropdown?.firstChild ||\n      event.target === this.#button\n    ) {\n      if (this.#isDropdownVisible) {\n        this._hideDropdownFromKeyboard();\n      }\n      return;\n    }\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n    }\n    event.target.previousSibling?.focus();\n  }\n\n  _moveToBeginning(event) {\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n      return;\n    }\n    this.#dropdown.firstChild?.focus();\n  }\n\n  _moveToEnd(event) {\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n      return;\n    }\n    this.#dropdown.lastChild?.focus();\n  }\n\n  #keyDown(event) {\n    ColorPicker._keyboardManager.exec(this, event);\n  }\n\n  #openDropdown(event) {\n    if (this.#isDropdownVisible) {\n      this.hideDropdown();\n      return;\n    }\n    this.#dropdownWasFromKeyboard = event.detail === 0;\n\n    if (!this.#openDropdownAC) {\n      this.#openDropdownAC = new AbortController();\n\n      window.addEventListener(\"pointerdown\", this.#pointerDown.bind(this), {\n        signal: this.#uiManager.combinedSignal(this.#openDropdownAC),\n      });\n    }\n    if (this.#dropdown) {\n      this.#dropdown.classList.remove(\"hidden\");\n      return;\n    }\n    const root = (this.#dropdown = this.#getDropdownRoot());\n    this.#button.append(root);\n  }\n\n  #pointerDown(event) {\n    if (this.#dropdown?.contains(event.target)) {\n      return;\n    }\n    this.hideDropdown();\n  }\n\n  hideDropdown() {\n    this.#dropdown?.classList.add(\"hidden\");\n    this.#openDropdownAC?.abort();\n    this.#openDropdownAC = null;\n  }\n\n  get #isDropdownVisible() {\n    return this.#dropdown && !this.#dropdown.classList.contains(\"hidden\");\n  }\n\n  _hideDropdownFromKeyboard() {\n    if (this.#isMainColorPicker) {\n      return;\n    }\n    if (!this.#isDropdownVisible) {\n      // The user pressed Escape with no dropdown visible, so we must\n      // unselect it.\n      this.#editor?.unselect();\n      return;\n    }\n    this.hideDropdown();\n    this.#button.focus({\n      preventScroll: true,\n      focusVisible: this.#dropdownWasFromKeyboard,\n    });\n  }\n\n  updateColor(color) {\n    if (this.#buttonSwatch) {\n      this.#buttonSwatch.style.backgroundColor = color;\n    }\n    if (!this.#dropdown) {\n      return;\n    }\n\n    const i = this.#uiManager.highlightColors.values();\n    for (const child of this.#dropdown.children) {\n      child.setAttribute(\"aria-selected\", i.next().value === color);\n    }\n  }\n\n  destroy() {\n    this.#button?.remove();\n    this.#button = null;\n    this.#buttonSwatch = null;\n    this.#dropdown?.remove();\n    this.#dropdown = null;\n  }\n}\n\nexport { ColorPicker };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  shadow,\n  Util,\n} from \"../../shared/util.js\";\nimport { bindEvents, KeyboardManager } from \"./tools.js\";\nimport {\n  FreeHighlightOutliner,\n  HighlightOutliner,\n} from \"./drawers/highlight.js\";\nimport {\n  HighlightAnnotationElement,\n  InkAnnotationElement,\n} from \"../annotation_layer.js\";\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { ColorPicker } from \"./color_picker.js\";\n\n/**\n * Basic draw editor in order to generate an Highlight annotation.\n */\nclass HighlightEditor extends AnnotationEditor {\n  #anchorNode = null;\n\n  #anchorOffset = 0;\n\n  #boxes;\n\n  #clipPathId = null;\n\n  #colorPicker = null;\n\n  #focusOutlines = null;\n\n  #focusNode = null;\n\n  #focusOffset = 0;\n\n  #highlightDiv = null;\n\n  #highlightOutlines = null;\n\n  #id = null;\n\n  #isFreeHighlight = false;\n\n  #lastPoint = null;\n\n  #opacity;\n\n  #outlineId = null;\n\n  #text = \"\";\n\n  #thickness;\n\n  #methodOfCreation = \"\";\n\n  static _defaultColor = null;\n\n  static _defaultOpacity = 1;\n\n  static _defaultThickness = 12;\n\n  static _type = \"highlight\";\n\n  static _editorType = AnnotationEditorType.HIGHLIGHT;\n\n  static _freeHighlightId = -1;\n\n  static _freeHighlight = null;\n\n  static _freeHighlightClipId = \"\";\n\n  static get _keyboardManager() {\n    const proto = HighlightEditor.prototype;\n    return shadow(\n      this,\n      \"_keyboardManager\",\n      new KeyboardManager([\n        [[\"ArrowLeft\", \"mac+ArrowLeft\"], proto._moveCaret, { args: [0] }],\n        [[\"ArrowRight\", \"mac+ArrowRight\"], proto._moveCaret, { args: [1] }],\n        [[\"ArrowUp\", \"mac+ArrowUp\"], proto._moveCaret, { args: [2] }],\n        [[\"ArrowDown\", \"mac+ArrowDown\"], proto._moveCaret, { args: [3] }],\n      ])\n    );\n  }\n\n  constructor(params) {\n    super({ ...params, name: \"highlightEditor\" });\n    this.color = params.color || HighlightEditor._defaultColor;\n    this.#thickness = params.thickness || HighlightEditor._defaultThickness;\n    this.#opacity = params.opacity || HighlightEditor._defaultOpacity;\n    this.#boxes = params.boxes || null;\n    this.#methodOfCreation = params.methodOfCreation || \"\";\n    this.#text = params.text || \"\";\n    this._isDraggable = false;\n\n    if (params.highlightId > -1) {\n      this.#isFreeHighlight = true;\n      this.#createFreeOutlines(params);\n      this.#addToDrawLayer();\n    } else if (this.#boxes) {\n      this.#anchorNode = params.anchorNode;\n      this.#anchorOffset = params.anchorOffset;\n      this.#focusNode = params.focusNode;\n      this.#focusOffset = params.focusOffset;\n      this.#createOutlines();\n      this.#addToDrawLayer();\n      this.rotate(this.rotation);\n    }\n  }\n\n  /** @inheritdoc */\n  get telemetryInitialData() {\n    return {\n      action: \"added\",\n      type: this.#isFreeHighlight ? \"free_highlight\" : \"highlight\",\n      color: this._uiManager.highlightColorNames.get(this.color),\n      thickness: this.#thickness,\n      methodOfCreation: this.#methodOfCreation,\n    };\n  }\n\n  /** @inheritdoc */\n  get telemetryFinalData() {\n    return {\n      type: \"highlight\",\n      color: this._uiManager.highlightColorNames.get(this.color),\n    };\n  }\n\n  static computeTelemetryFinalData(data) {\n    // We want to know how many colors have been used.\n    return { numberOfColors: data.get(\"color\").size };\n  }\n\n  #createOutlines() {\n    const outliner = new HighlightOutliner(\n      this.#boxes,\n      /* borderWidth = */ 0.001\n    );\n    this.#highlightOutlines = outliner.getOutlines();\n    [this.x, this.y, this.width, this.height] = this.#highlightOutlines.box;\n\n    const outlinerForOutline = new HighlightOutliner(\n      this.#boxes,\n      /* borderWidth = */ 0.0025,\n      /* innerMargin = */ 0.001,\n      this._uiManager.direction === \"ltr\"\n    );\n    this.#focusOutlines = outlinerForOutline.getOutlines();\n\n    // The last point is in the pages coordinate system.\n    const { lastPoint } = this.#focusOutlines;\n    this.#lastPoint = [\n      (lastPoint[0] - this.x) / this.width,\n      (lastPoint[1] - this.y) / this.height,\n    ];\n  }\n\n  #createFreeOutlines({ highlightOutlines, highlightId, clipPathId }) {\n    this.#highlightOutlines = highlightOutlines;\n    const extraThickness = 1.5;\n    this.#focusOutlines = highlightOutlines.getNewOutline(\n      /* Slightly bigger than the highlight in order to have a little\n         space between the highlight and the outline. */\n      this.#thickness / 2 + extraThickness,\n      /* innerMargin = */ 0.0025\n    );\n\n    if (highlightId >= 0) {\n      this.#id = highlightId;\n      this.#clipPathId = clipPathId;\n      // We need to redraw the highlight because we change the coordinates to be\n      // in the box coordinate system.\n      this.parent.drawLayer.finalizeDraw(highlightId, {\n        bbox: highlightOutlines.box,\n        path: {\n          d: highlightOutlines.toSVGPath(),\n        },\n      });\n      this.#outlineId = this.parent.drawLayer.drawOutline(\n        {\n          rootClass: {\n            highlightOutline: true,\n            free: true,\n          },\n          bbox: this.#focusOutlines.box,\n          path: {\n            d: this.#focusOutlines.toSVGPath(),\n          },\n        },\n        /* mustRemoveSelfIntersections = */ true\n      );\n    } else if (this.parent) {\n      const angle = this.parent.viewport.rotation;\n      this.parent.drawLayer.updateProperties(this.#id, {\n        bbox: HighlightEditor.#rotateBbox(\n          this.#highlightOutlines.box,\n          (angle - this.rotation + 360) % 360\n        ),\n        path: {\n          d: highlightOutlines.toSVGPath(),\n        },\n      });\n      this.parent.drawLayer.updateProperties(this.#outlineId, {\n        bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle),\n        path: {\n          d: this.#focusOutlines.toSVGPath(),\n        },\n      });\n    }\n    const [x, y, width, height] = highlightOutlines.box;\n    switch (this.rotation) {\n      case 0:\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n        break;\n      case 90: {\n        const [pageWidth, pageHeight] = this.parentDimensions;\n        this.x = y;\n        this.y = 1 - x;\n        this.width = (width * pageHeight) / pageWidth;\n        this.height = (height * pageWidth) / pageHeight;\n        break;\n      }\n      case 180:\n        this.x = 1 - x;\n        this.y = 1 - y;\n        this.width = width;\n        this.height = height;\n        break;\n      case 270: {\n        const [pageWidth, pageHeight] = this.parentDimensions;\n        this.x = 1 - y;\n        this.y = x;\n        this.width = (width * pageHeight) / pageWidth;\n        this.height = (height * pageWidth) / pageHeight;\n        break;\n      }\n    }\n\n    const { lastPoint } = this.#focusOutlines;\n    this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height];\n  }\n\n  /** @inheritdoc */\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n    HighlightEditor._defaultColor ||=\n      uiManager.highlightColors?.values().next().value || \"#fff066\";\n  }\n\n  /** @inheritdoc */\n  static updateDefaultParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR:\n        HighlightEditor._defaultColor = value;\n        break;\n      case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:\n        HighlightEditor._defaultThickness = value;\n        break;\n    }\n  }\n\n  /** @inheritdoc */\n  translateInPage(x, y) {}\n\n  /** @inheritdoc */\n  get toolbarPosition() {\n    return this.#lastPoint;\n  }\n\n  /** @inheritdoc */\n  updateParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.HIGHLIGHT_COLOR:\n        this.#updateColor(value);\n        break;\n      case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:\n        this.#updateThickness(value);\n        break;\n    }\n  }\n\n  static get defaultPropertiesToUpdate() {\n    return [\n      [\n        AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR,\n        HighlightEditor._defaultColor,\n      ],\n      [\n        AnnotationEditorParamsType.HIGHLIGHT_THICKNESS,\n        HighlightEditor._defaultThickness,\n      ],\n    ];\n  }\n\n  /** @inheritdoc */\n  get propertiesToUpdate() {\n    return [\n      [\n        AnnotationEditorParamsType.HIGHLIGHT_COLOR,\n        this.color || HighlightEditor._defaultColor,\n      ],\n      [\n        AnnotationEditorParamsType.HIGHLIGHT_THICKNESS,\n        this.#thickness || HighlightEditor._defaultThickness,\n      ],\n      [AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight],\n    ];\n  }\n\n  /**\n   * Update the color and make this action undoable.\n   * @param {string} color\n   */\n  #updateColor(color) {\n    const setColorAndOpacity = (col, opa) => {\n      this.color = col;\n      this.#opacity = opa;\n      this.parent?.drawLayer.updateProperties(this.#id, {\n        root: {\n          fill: col,\n          \"fill-opacity\": opa,\n        },\n      });\n      this.#colorPicker?.updateColor(col);\n    };\n    const savedColor = this.color;\n    const savedOpacity = this.#opacity;\n    this.addCommands({\n      cmd: setColorAndOpacity.bind(\n        this,\n        color,\n        HighlightEditor._defaultOpacity\n      ),\n      undo: setColorAndOpacity.bind(this, savedColor, savedOpacity),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.HIGHLIGHT_COLOR,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n\n    this._reportTelemetry(\n      {\n        action: \"color_changed\",\n        color: this._uiManager.highlightColorNames.get(color),\n      },\n      /* mustWait = */ true\n    );\n  }\n\n  /**\n   * Update the thickness and make this action undoable.\n   * @param {number} thickness\n   */\n  #updateThickness(thickness) {\n    const savedThickness = this.#thickness;\n    const setThickness = th => {\n      this.#thickness = th;\n      this.#changeThickness(th);\n    };\n    this.addCommands({\n      cmd: setThickness.bind(this, thickness),\n      undo: setThickness.bind(this, savedThickness),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.INK_THICKNESS,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n    this._reportTelemetry(\n      { action: \"thickness_changed\", thickness },\n      /* mustWait = */ true\n    );\n  }\n\n  /** @inheritdoc */\n  async addEditToolbar() {\n    const toolbar = await super.addEditToolbar();\n    if (!toolbar) {\n      return null;\n    }\n    if (this._uiManager.highlightColors) {\n      this.#colorPicker = new ColorPicker({ editor: this });\n      toolbar.addColorPicker(this.#colorPicker);\n    }\n    return toolbar;\n  }\n\n  /** @inheritdoc */\n  disableEditing() {\n    super.disableEditing();\n    this.div.classList.toggle(\"disabled\", true);\n  }\n\n  /** @inheritdoc */\n  enableEditing() {\n    super.enableEditing();\n    this.div.classList.toggle(\"disabled\", false);\n  }\n\n  /** @inheritdoc */\n  fixAndSetPosition() {\n    return super.fixAndSetPosition(this.#getRotation());\n  }\n\n  /** @inheritdoc */\n  getBaseTranslation() {\n    // The editor itself doesn't have any CSS border (we're drawing one\n    // ourselves in using SVG).\n    return [0, 0];\n  }\n\n  /** @inheritdoc */\n  getRect(tx, ty) {\n    return super.getRect(tx, ty, this.#getRotation());\n  }\n\n  /** @inheritdoc */\n  onceAdded(focus) {\n    if (!this.annotationElementId) {\n      this.parent.addUndoableEditor(this);\n    }\n    if (focus) {\n      this.div.focus();\n    }\n  }\n\n  /** @inheritdoc */\n  remove() {\n    this.#cleanDrawLayer();\n    this._reportTelemetry({\n      action: \"deleted\",\n    });\n    super.remove();\n  }\n\n  /** @inheritdoc */\n  rebuild() {\n    if (!this.parent) {\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n\n    this.#addToDrawLayer();\n\n    if (!this.isAttachedToDOM) {\n      // At some point this editor was removed and we're rebuilding it,\n      // hence we must add it to its parent.\n      this.parent.add(this);\n    }\n  }\n\n  setParent(parent) {\n    let mustBeSelected = false;\n    if (this.parent && !parent) {\n      this.#cleanDrawLayer();\n    } else if (parent) {\n      this.#addToDrawLayer(parent);\n      // If mustBeSelected is true it means that this editor was selected\n      // when its parent has been destroyed, hence we must select it again.\n      mustBeSelected =\n        !this.parent && this.div?.classList.contains(\"selectedEditor\");\n    }\n    super.setParent(parent);\n    this.show(this._isVisible);\n    if (mustBeSelected) {\n      // We select it after the parent has been set.\n      this.select();\n    }\n  }\n\n  #changeThickness(thickness) {\n    if (!this.#isFreeHighlight) {\n      return;\n    }\n    this.#createFreeOutlines({\n      highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2),\n    });\n    this.fixAndSetPosition();\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    this.setDims(this.width * parentWidth, this.height * parentHeight);\n  }\n\n  #cleanDrawLayer() {\n    if (this.#id === null || !this.parent) {\n      return;\n    }\n    this.parent.drawLayer.remove(this.#id);\n    this.#id = null;\n    this.parent.drawLayer.remove(this.#outlineId);\n    this.#outlineId = null;\n  }\n\n  #addToDrawLayer(parent = this.parent) {\n    if (this.#id !== null) {\n      return;\n    }\n    ({ id: this.#id, clipPathId: this.#clipPathId } = parent.drawLayer.draw(\n      {\n        bbox: this.#highlightOutlines.box,\n        root: {\n          viewBox: \"0 0 1 1\",\n          fill: this.color,\n          \"fill-opacity\": this.#opacity,\n        },\n        rootClass: {\n          highlight: true,\n          free: this.#isFreeHighlight,\n        },\n        path: {\n          d: this.#highlightOutlines.toSVGPath(),\n        },\n      },\n      /* isPathUpdatable = */ false,\n      /* hasClip = */ true\n    ));\n    this.#outlineId = parent.drawLayer.drawOutline(\n      {\n        rootClass: {\n          highlightOutline: true,\n          free: this.#isFreeHighlight,\n        },\n        bbox: this.#focusOutlines.box,\n        path: {\n          d: this.#focusOutlines.toSVGPath(),\n        },\n      },\n      /* mustRemoveSelfIntersections = */ this.#isFreeHighlight\n    );\n\n    if (this.#highlightDiv) {\n      this.#highlightDiv.style.clipPath = this.#clipPathId;\n    }\n  }\n\n  static #rotateBbox([x, y, width, height], angle) {\n    switch (angle) {\n      case 90:\n        return [1 - y - height, x, height, width];\n      case 180:\n        return [1 - x - width, 1 - y - height, width, height];\n      case 270:\n        return [y, 1 - x - width, height, width];\n    }\n    return [x, y, width, height];\n  }\n\n  /** @inheritdoc */\n  rotate(angle) {\n    // We need to rotate the svgs because of the coordinates system.\n    const { drawLayer } = this.parent;\n    let box;\n    if (this.#isFreeHighlight) {\n      angle = (angle - this.rotation + 360) % 360;\n      box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle);\n    } else {\n      // An highlight annotation is always drawn horizontally.\n      box = HighlightEditor.#rotateBbox(\n        [this.x, this.y, this.width, this.height],\n        angle\n      );\n    }\n    drawLayer.updateProperties(this.#id, {\n      bbox: box,\n      root: {\n        \"data-main-rotation\": angle,\n      },\n    });\n    drawLayer.updateProperties(this.#outlineId, {\n      bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle),\n      root: {\n        \"data-main-rotation\": angle,\n      },\n    });\n  }\n\n  /** @inheritdoc */\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n\n    const div = super.render();\n    if (this.#text) {\n      div.setAttribute(\"aria-label\", this.#text);\n      div.setAttribute(\"role\", \"mark\");\n    }\n    if (this.#isFreeHighlight) {\n      div.classList.add(\"free\");\n    } else {\n      this.div.addEventListener(\"keydown\", this.#keydown.bind(this), {\n        signal: this._uiManager._signal,\n      });\n    }\n    const highlightDiv = (this.#highlightDiv = document.createElement(\"div\"));\n    div.append(highlightDiv);\n    highlightDiv.setAttribute(\"aria-hidden\", \"true\");\n    highlightDiv.className = \"internal\";\n    highlightDiv.style.clipPath = this.#clipPathId;\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    this.setDims(this.width * parentWidth, this.height * parentHeight);\n\n    bindEvents(this, this.#highlightDiv, [\"pointerover\", \"pointerleave\"]);\n    this.enableEditing();\n\n    return div;\n  }\n\n  pointerover() {\n    if (!this.isSelected) {\n      this.parent?.drawLayer.updateProperties(this.#outlineId, {\n        rootClass: {\n          hovered: true,\n        },\n      });\n    }\n  }\n\n  pointerleave() {\n    if (!this.isSelected) {\n      this.parent?.drawLayer.updateProperties(this.#outlineId, {\n        rootClass: {\n          hovered: false,\n        },\n      });\n    }\n  }\n\n  #keydown(event) {\n    HighlightEditor._keyboardManager.exec(this, event);\n  }\n\n  _moveCaret(direction) {\n    this.parent.unselect(this);\n    switch (direction) {\n      case 0 /* left */:\n      case 2 /* up */:\n        this.#setCaret(/* start = */ true);\n        break;\n      case 1 /* right */:\n      case 3 /* down */:\n        this.#setCaret(/* start = */ false);\n        break;\n    }\n  }\n\n  #setCaret(start) {\n    if (!this.#anchorNode) {\n      return;\n    }\n    const selection = window.getSelection();\n    if (start) {\n      selection.setPosition(this.#anchorNode, this.#anchorOffset);\n    } else {\n      selection.setPosition(this.#focusNode, this.#focusOffset);\n    }\n  }\n\n  /** @inheritdoc */\n  select() {\n    super.select();\n    if (!this.#outlineId) {\n      return;\n    }\n    this.parent?.drawLayer.updateProperties(this.#outlineId, {\n      rootClass: {\n        hovered: false,\n        selected: true,\n      },\n    });\n  }\n\n  /** @inheritdoc */\n  unselect() {\n    super.unselect();\n    if (!this.#outlineId) {\n      return;\n    }\n    this.parent?.drawLayer.updateProperties(this.#outlineId, {\n      rootClass: {\n        selected: false,\n      },\n    });\n    if (!this.#isFreeHighlight) {\n      this.#setCaret(/* start = */ false);\n    }\n  }\n\n  /** @inheritdoc */\n  get _mustFixPosition() {\n    return !this.#isFreeHighlight;\n  }\n\n  /** @inheritdoc */\n  show(visible = this._isVisible) {\n    super.show(visible);\n    if (this.parent) {\n      this.parent.drawLayer.updateProperties(this.#id, {\n        rootClass: {\n          hidden: !visible,\n        },\n      });\n      this.parent.drawLayer.updateProperties(this.#outlineId, {\n        rootClass: {\n          hidden: !visible,\n        },\n      });\n    }\n  }\n\n  #getRotation() {\n    // Highlight annotations are always drawn horizontally but if\n    // a free highlight annotation can be rotated.\n    return this.#isFreeHighlight ? this.rotation : 0;\n  }\n\n  #serializeBoxes() {\n    if (this.#isFreeHighlight) {\n      return null;\n    }\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    const [pageX, pageY] = this.pageTranslation;\n    const boxes = this.#boxes;\n    const quadPoints = new Float32Array(boxes.length * 8);\n    let i = 0;\n    for (const { x, y, width, height } of boxes) {\n      const sx = x * pageWidth + pageX;\n      const sy = (1 - y) * pageHeight + pageY;\n      // Serializes the rectangle in the Adobe Acrobat format.\n      // The rectangle's coordinates (b = bottom, t = top, L = left, R = right)\n      // are ordered as follows: tL, tR, bL, bR (bL origin).\n      quadPoints[i] = quadPoints[i + 4] = sx;\n      quadPoints[i + 1] = quadPoints[i + 3] = sy;\n      quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth;\n      quadPoints[i + 5] = quadPoints[i + 7] = sy - height * pageHeight;\n      i += 8;\n    }\n    return quadPoints;\n  }\n\n  #serializeOutlines(rect) {\n    return this.#highlightOutlines.serialize(rect, this.#getRotation());\n  }\n\n  static startHighlighting(parent, isLTR, { target: textLayer, x, y }) {\n    const {\n      x: layerX,\n      y: layerY,\n      width: parentWidth,\n      height: parentHeight,\n    } = textLayer.getBoundingClientRect();\n\n    const ac = new AbortController();\n    const signal = parent.combinedSignal(ac);\n\n    const pointerUpCallback = e => {\n      ac.abort();\n      this.#endHighlight(parent, e);\n    };\n    window.addEventListener(\"blur\", pointerUpCallback, { signal });\n    window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n    window.addEventListener(\n      \"pointerdown\",\n      stopEvent /* Avoid to have undesired clicks during the drawing. */,\n      {\n        capture: true,\n        passive: false,\n        signal,\n      }\n    );\n    window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n\n    textLayer.addEventListener(\n      \"pointermove\",\n      this.#highlightMove.bind(this, parent),\n      { signal }\n    );\n    this._freeHighlight = new FreeHighlightOutliner(\n      { x, y },\n      [layerX, layerY, parentWidth, parentHeight],\n      parent.scale,\n      this._defaultThickness / 2,\n      isLTR,\n      /* innerMargin = */ 0.001\n    );\n    ({ id: this._freeHighlightId, clipPathId: this._freeHighlightClipId } =\n      parent.drawLayer.draw(\n        {\n          bbox: [0, 0, 1, 1],\n          root: {\n            viewBox: \"0 0 1 1\",\n            fill: this._defaultColor,\n            \"fill-opacity\": this._defaultOpacity,\n          },\n          rootClass: {\n            highlight: true,\n            free: true,\n          },\n          path: {\n            d: this._freeHighlight.toSVGPath(),\n          },\n        },\n        /* isPathUpdatable = */ true,\n        /* hasClip = */ true\n      ));\n  }\n\n  static #highlightMove(parent, event) {\n    if (this._freeHighlight.add(event)) {\n      // Redraw only if the point has been added.\n      parent.drawLayer.updateProperties(this._freeHighlightId, {\n        path: {\n          d: this._freeHighlight.toSVGPath(),\n        },\n      });\n    }\n  }\n\n  static #endHighlight(parent, event) {\n    if (!this._freeHighlight.isEmpty()) {\n      parent.createAndAddNewEditor(event, false, {\n        highlightId: this._freeHighlightId,\n        highlightOutlines: this._freeHighlight.getOutlines(),\n        clipPathId: this._freeHighlightClipId,\n        methodOfCreation: \"main_toolbar\",\n      });\n    } else {\n      parent.drawLayer.remove(this._freeHighlightId);\n    }\n    this._freeHighlightId = -1;\n    this._freeHighlight = null;\n    this._freeHighlightClipId = \"\";\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    if (data instanceof HighlightAnnotationElement) {\n      const {\n        data: { quadPoints, rect, rotation, id, color, opacity, popupRef },\n        parent: {\n          page: { pageNumber },\n        },\n      } = data;\n      initialData = data = {\n        annotationType: AnnotationEditorType.HIGHLIGHT,\n        color: Array.from(color),\n        opacity,\n        quadPoints,\n        boxes: null,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        id,\n        deleted: false,\n        popupRef,\n      };\n    } else if (data instanceof InkAnnotationElement) {\n      const {\n        data: {\n          inkLists,\n          rect,\n          rotation,\n          id,\n          color,\n          borderStyle: { rawWidth: thickness },\n          popupRef,\n        },\n        parent: {\n          page: { pageNumber },\n        },\n      } = data;\n      initialData = data = {\n        annotationType: AnnotationEditorType.HIGHLIGHT,\n        color: Array.from(color),\n        thickness,\n        inkLists,\n        boxes: null,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        id,\n        deleted: false,\n        popupRef,\n      };\n    }\n\n    const { color, quadPoints, inkLists, opacity } = data;\n    const editor = await super.deserialize(data, parent, uiManager);\n\n    editor.color = Util.makeHexColor(...color);\n    editor.#opacity = opacity || 1;\n    if (inkLists) {\n      editor.#thickness = data.thickness;\n    }\n    editor.annotationElementId = data.id || null;\n    editor._initialData = initialData;\n\n    const [pageWidth, pageHeight] = editor.pageDimensions;\n    const [pageX, pageY] = editor.pageTranslation;\n\n    if (quadPoints) {\n      const boxes = (editor.#boxes = []);\n      for (let i = 0; i < quadPoints.length; i += 8) {\n        boxes.push({\n          x: (quadPoints[i] - pageX) / pageWidth,\n          y: 1 - (quadPoints[i + 1] - pageY) / pageHeight,\n          width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth,\n          height: (quadPoints[i + 1] - quadPoints[i + 5]) / pageHeight,\n        });\n      }\n      editor.#createOutlines();\n      editor.#addToDrawLayer();\n      editor.rotate(editor.rotation);\n    } else if (inkLists) {\n      editor.#isFreeHighlight = true;\n      const points = inkLists[0];\n      const point = {\n        x: points[0] - pageX,\n        y: pageHeight - (points[1] - pageY),\n      };\n      const outliner = new FreeHighlightOutliner(\n        point,\n        [0, 0, pageWidth, pageHeight],\n        1,\n        editor.#thickness / 2,\n        true,\n        0.001\n      );\n      for (let i = 0, ii = points.length; i < ii; i += 2) {\n        point.x = points[i] - pageX;\n        point.y = pageHeight - (points[i + 1] - pageY);\n        outliner.add(point);\n      }\n      const { id, clipPathId } = parent.drawLayer.draw(\n        {\n          bbox: [0, 0, 1, 1],\n          root: {\n            viewBox: \"0 0 1 1\",\n            fill: editor.color,\n            \"fill-opacity\": editor._defaultOpacity,\n          },\n          rootClass: {\n            highlight: true,\n            free: true,\n          },\n          path: {\n            d: outliner.toSVGPath(),\n          },\n        },\n        /* isPathUpdatable = */ true,\n        /* hasClip = */ true\n      );\n      editor.#createFreeOutlines({\n        highlightOutlines: outliner.getOutlines(),\n        highlightId: id,\n        clipPathId,\n      });\n      editor.#addToDrawLayer();\n    }\n\n    return editor;\n  }\n\n  /** @inheritdoc */\n  serialize(isForCopying = false) {\n    // It doesn't make sense to copy/paste a highlight annotation.\n    if (this.isEmpty() || isForCopying) {\n      return null;\n    }\n\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n\n    const rect = this.getRect(0, 0);\n    const color = AnnotationEditor._colorManager.convert(this.color);\n\n    const serialized = {\n      annotationType: AnnotationEditorType.HIGHLIGHT,\n      color,\n      opacity: this.#opacity,\n      thickness: this.#thickness,\n      quadPoints: this.#serializeBoxes(),\n      outlines: this.#serializeOutlines(rect),\n      pageIndex: this.pageIndex,\n      rect,\n      rotation: this.#getRotation(),\n      structTreeParentId: this._structTreeParentId,\n    };\n\n    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {\n      return null;\n    }\n\n    serialized.id = this.annotationElementId;\n    return serialized;\n  }\n\n  #hasElementChanged(serialized) {\n    const { color } = this._initialData;\n    return serialized.color.some((c, i) => c !== color[i]);\n  }\n\n  /** @inheritdoc */\n  renderAnnotationElement(annotation) {\n    annotation.updateEdited({\n      rect: this.getRect(0, 0),\n    });\n\n    return null;\n  }\n\n  static canCreateNewEmptyEditor() {\n    return false;\n  }\n}\n\nexport { HighlightEditor };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AnnotationEditorParamsType, unreachable } from \"../../shared/util.js\";\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\nimport { AnnotationEditor } from \"./editor.js\";\n\nclass DrawingOptions {\n  #svgProperties = Object.create(null);\n\n  updateProperty(name, value) {\n    this[name] = value;\n    this.updateSVGProperty(name, value);\n  }\n\n  updateProperties(properties) {\n    if (!properties) {\n      return;\n    }\n    for (const [name, value] of Object.entries(properties)) {\n      this.updateProperty(name, value);\n    }\n  }\n\n  updateSVGProperty(name, value) {\n    this.#svgProperties[name] = value;\n  }\n\n  toSVGProperties() {\n    const root = this.#svgProperties;\n    this.#svgProperties = Object.create(null);\n    return { root };\n  }\n\n  reset() {\n    this.#svgProperties = Object.create(null);\n  }\n\n  updateAll(options = this) {\n    this.updateProperties(options);\n  }\n\n  clone() {\n    unreachable(\"Not implemented\");\n  }\n}\n\n/**\n * Basic draw editor.\n */\nclass DrawingEditor extends AnnotationEditor {\n  #drawOutlines = null;\n\n  #mustBeCommitted;\n\n  _drawId = null;\n\n  static _currentDrawId = -1;\n\n  static _currentParent = null;\n\n  static #currentDraw = null;\n\n  static #currentDrawingAC = null;\n\n  static #currentDrawingOptions = null;\n\n  static #currentPointerId = NaN;\n\n  static #currentPointerType = null;\n\n  static #currentPointerIds = null;\n\n  static #currentMoveTimestamp = NaN;\n\n  static _INNER_MARGIN = 3;\n\n  constructor(params) {\n    super(params);\n    this.#mustBeCommitted = params.mustBeCommitted || false;\n\n    if (params.drawOutlines) {\n      this.#createDrawOutlines(params);\n      this.#addToDrawLayer();\n    }\n  }\n\n  #createDrawOutlines({ drawOutlines, drawId, drawingOptions }) {\n    this.#drawOutlines = drawOutlines;\n    this._drawingOptions ||= drawingOptions;\n\n    if (drawId >= 0) {\n      this._drawId = drawId;\n      // We need to redraw the drawing because we changed the coordinates to be\n      // in the box coordinate system.\n      this.parent.drawLayer.finalizeDraw(\n        drawId,\n        drawOutlines.defaultProperties\n      );\n    } else {\n      // We create a new drawing.\n      this._drawId = this.#createDrawing(drawOutlines, this.parent);\n    }\n\n    this.#updateBbox(drawOutlines.box);\n  }\n\n  #createDrawing(drawOutlines, parent) {\n    const { id } = parent.drawLayer.draw(\n      DrawingEditor._mergeSVGProperties(\n        this._drawingOptions.toSVGProperties(),\n        drawOutlines.defaultSVGProperties\n      ),\n      /* isPathUpdatable = */ false,\n      /* hasClip = */ false\n    );\n    return id;\n  }\n\n  static _mergeSVGProperties(p1, p2) {\n    const p1Keys = new Set(Object.keys(p1));\n\n    for (const [key, value] of Object.entries(p2)) {\n      if (p1Keys.has(key)) {\n        Object.assign(p1[key], value);\n      } else {\n        p1[key] = value;\n      }\n    }\n    return p1;\n  }\n\n  /**\n   * @param {Object} options\n   * @return {DrawingOptions} the default options to use for a new editor.\n   */\n  static getDefaultDrawingOptions(_options) {\n    unreachable(\"Not implemented\");\n  }\n\n  /**\n   * @return {Map<AnnotationEditorParamsType, string>} a map between the\n   *   parameter types and the name of the options.\n   */\n  // eslint-disable-next-line getter-return\n  static get typesMap() {\n    unreachable(\"Not implemented\");\n  }\n\n  static get isDrawer() {\n    return true;\n  }\n\n  /**\n   * @returns {boolean} `true` if several drawings can be added to the\n   * annotation.\n   */\n  static get supportMultipleDrawings() {\n    return false;\n  }\n\n  /** @inheritdoc */\n  static updateDefaultParams(type, value) {\n    const propertyName = this.typesMap.get(type);\n    if (propertyName) {\n      this._defaultDrawingOptions.updateProperty(propertyName, value);\n    }\n    if (this._currentParent) {\n      DrawingEditor.#currentDraw.updateProperty(propertyName, value);\n      this._currentParent.drawLayer.updateProperties(\n        this._currentDrawId,\n        this._defaultDrawingOptions.toSVGProperties()\n      );\n    }\n  }\n\n  /** @inheritdoc */\n  updateParams(type, value) {\n    const propertyName = this.constructor.typesMap.get(type);\n    if (propertyName) {\n      this._updateProperty(type, propertyName, value);\n    }\n  }\n\n  /** @inheritdoc */\n  static get defaultPropertiesToUpdate() {\n    const properties = [];\n    const options = this._defaultDrawingOptions;\n    for (const [type, name] of this.typesMap) {\n      properties.push([type, options[name]]);\n    }\n    return properties;\n  }\n\n  /** @inheritdoc */\n  get propertiesToUpdate() {\n    const properties = [];\n    const { _drawingOptions } = this;\n    for (const [type, name] of this.constructor.typesMap) {\n      properties.push([type, _drawingOptions[name]]);\n    }\n    return properties;\n  }\n\n  /**\n   * Update a property and make this action undoable.\n   * @param {string} color\n   */\n  _updateProperty(type, name, value) {\n    const options = this._drawingOptions;\n    const savedValue = options[name];\n    const setter = val => {\n      options.updateProperty(name, val);\n      const bbox = this.#drawOutlines.updateProperty(name, val);\n      if (bbox) {\n        this.#updateBbox(bbox);\n      }\n      this.parent?.drawLayer.updateProperties(\n        this._drawId,\n        options.toSVGProperties()\n      );\n    };\n    this.addCommands({\n      cmd: setter.bind(this, value),\n      undo: setter.bind(this, savedValue),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n  }\n\n  /** @inheritdoc */\n  _onResizing() {\n    this.parent?.drawLayer.updateProperties(\n      this._drawId,\n      DrawingEditor._mergeSVGProperties(\n        this.#drawOutlines.getPathResizingSVGProperties(\n          this.#convertToDrawSpace()\n        ),\n        {\n          bbox: this.#rotateBox(),\n        }\n      )\n    );\n  }\n\n  /** @inheritdoc */\n  _onResized() {\n    this.parent?.drawLayer.updateProperties(\n      this._drawId,\n      DrawingEditor._mergeSVGProperties(\n        this.#drawOutlines.getPathResizedSVGProperties(\n          this.#convertToDrawSpace()\n        ),\n        {\n          bbox: this.#rotateBox(),\n        }\n      )\n    );\n  }\n\n  /** @inheritdoc */\n  _onTranslating(x, y) {\n    this.parent?.drawLayer.updateProperties(this._drawId, {\n      bbox: this.#rotateBox(x, y),\n    });\n  }\n\n  /** @inheritdoc */\n  _onTranslated() {\n    this.parent?.drawLayer.updateProperties(\n      this._drawId,\n      DrawingEditor._mergeSVGProperties(\n        this.#drawOutlines.getPathTranslatedSVGProperties(\n          this.#convertToDrawSpace(),\n          this.parentDimensions\n        ),\n        {\n          bbox: this.#rotateBox(),\n        }\n      )\n    );\n  }\n\n  _onStartDragging() {\n    this.parent?.drawLayer.updateProperties(this._drawId, {\n      rootClass: {\n        moving: true,\n      },\n    });\n  }\n\n  _onStopDragging() {\n    this.parent?.drawLayer.updateProperties(this._drawId, {\n      rootClass: {\n        moving: false,\n      },\n    });\n  }\n\n  /** @inheritdoc */\n  commit() {\n    super.commit();\n\n    this.disableEditMode();\n    this.disableEditing();\n  }\n\n  /** @inheritdoc */\n  disableEditing() {\n    super.disableEditing();\n    this.div.classList.toggle(\"disabled\", true);\n  }\n\n  /** @inheritdoc */\n  enableEditing() {\n    super.enableEditing();\n    this.div.classList.toggle(\"disabled\", false);\n  }\n\n  /** @inheritdoc */\n  getBaseTranslation() {\n    // The editor itself doesn't have any CSS border (we're drawing one\n    // ourselves in using SVG).\n    return [0, 0];\n  }\n\n  /** @inheritdoc */\n  get isResizable() {\n    return true;\n  }\n\n  /** @inheritdoc */\n  onceAdded(focus) {\n    if (!this.annotationElementId) {\n      this.parent.addUndoableEditor(this);\n    }\n    this._isDraggable = true;\n    if (this.#mustBeCommitted) {\n      this.#mustBeCommitted = false;\n      this.commit();\n      this.parent.setSelected(this);\n      if (focus && this.isOnScreen) {\n        this.div.focus();\n      }\n    }\n  }\n\n  /** @inheritdoc */\n  remove() {\n    this.#cleanDrawLayer();\n    super.remove();\n  }\n\n  /** @inheritdoc */\n  rebuild() {\n    if (!this.parent) {\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n\n    this.#addToDrawLayer();\n    this.#updateBbox(this.#drawOutlines.box);\n\n    if (!this.isAttachedToDOM) {\n      // At some point this editor was removed and we're rebuilding it,\n      // hence we must add it to its parent.\n      this.parent.add(this);\n    }\n  }\n\n  setParent(parent) {\n    let mustBeSelected = false;\n    if (this.parent && !parent) {\n      this._uiManager.removeShouldRescale(this);\n      this.#cleanDrawLayer();\n    } else if (parent) {\n      this._uiManager.addShouldRescale(this);\n      this.#addToDrawLayer(parent);\n      // If mustBeSelected is true it means that this editor was selected\n      // when its parent has been destroyed, hence we must select it again.\n      mustBeSelected =\n        !this.parent && this.div?.classList.contains(\"selectedEditor\");\n    }\n    super.setParent(parent);\n    if (mustBeSelected) {\n      // We select it after the parent has been set.\n      this.select();\n    }\n  }\n\n  #cleanDrawLayer() {\n    if (this._drawId === null || !this.parent) {\n      return;\n    }\n    this.parent.drawLayer.remove(this._drawId);\n    this._drawId = null;\n\n    // All the SVG properties must be reset in order to make it possible to\n    // undo.\n    this._drawingOptions.reset();\n  }\n\n  #addToDrawLayer(parent = this.parent) {\n    if (this._drawId !== null && this.parent === parent) {\n      return;\n    }\n    if (this._drawId !== null) {\n      // The parent has changed, we need to move the drawing to the new parent.\n      this.parent.drawLayer.updateParent(this._drawId, parent.drawLayer);\n      return;\n    }\n    this._drawingOptions.updateAll();\n    this._drawId = this.#createDrawing(this.#drawOutlines, parent);\n  }\n\n  #convertToParentSpace([x, y, width, height]) {\n    const {\n      parentDimensions: [pW, pH],\n      rotation,\n    } = this;\n    switch (rotation) {\n      case 90:\n        return [y, 1 - x, width * (pH / pW), height * (pW / pH)];\n      case 180:\n        return [1 - x, 1 - y, width, height];\n      case 270:\n        return [1 - y, x, width * (pH / pW), height * (pW / pH)];\n      default:\n        return [x, y, width, height];\n    }\n  }\n\n  #convertToDrawSpace() {\n    const {\n      x,\n      y,\n      width,\n      height,\n      parentDimensions: [pW, pH],\n      rotation,\n    } = this;\n    switch (rotation) {\n      case 90:\n        return [1 - y, x, width * (pW / pH), height * (pH / pW)];\n      case 180:\n        return [1 - x, 1 - y, width, height];\n      case 270:\n        return [y, 1 - x, width * (pW / pH), height * (pH / pW)];\n      default:\n        return [x, y, width, height];\n    }\n  }\n\n  #updateBbox(bbox) {\n    [this.x, this.y, this.width, this.height] =\n      this.#convertToParentSpace(bbox);\n    if (this.div) {\n      this.fixAndSetPosition();\n      const [parentWidth, parentHeight] = this.parentDimensions;\n      this.setDims(this.width * parentWidth, this.height * parentHeight);\n    }\n    this._onResized();\n  }\n\n  #rotateBox() {\n    // We've to deal with two rotations: the rotation of the annotation and the\n    // rotation of the parent page.\n    // When the page is rotated, all the layers are just rotated thanks to CSS\n    // but there is a notable exception: the canvas wrapper.\n    // The canvas wrapper is not rotated but the dimensions are (or not) swapped\n    // and the page is redrawn with the rotation applied to the canvas.\n    // The drawn layer is under the canvas wrapper and is not rotated so we have\n    // to \"manually\" rotate the coordinates.\n    //\n    // The coordinates (this.x, this.y) correspond to the top-left corner of\n    // the editor after it has been rotated in the page coordinate system.\n\n    const {\n      x,\n      y,\n      width,\n      height,\n      rotation,\n      parentRotation,\n      parentDimensions: [pW, pH],\n    } = this;\n    switch ((rotation * 4 + parentRotation) / 90) {\n      case 1:\n        // 0 -> 90\n        return [1 - y - height, x, height, width];\n      case 2:\n        // 0 -> 180\n        return [1 - x - width, 1 - y - height, width, height];\n      case 3:\n        // 0 -> 270\n        return [y, 1 - x - width, height, width];\n      case 4:\n        // 90 -> 0\n        return [\n          x,\n          y - width * (pW / pH),\n          height * (pH / pW),\n          width * (pW / pH),\n        ];\n      case 5:\n        // 90 -> 90\n        return [1 - y, x, width * (pW / pH), height * (pH / pW)];\n      case 6:\n        // 90 -> 180\n        return [\n          1 - x - height * (pH / pW),\n          1 - y,\n          height * (pH / pW),\n          width * (pW / pH),\n        ];\n      case 7:\n        // 90 -> 270\n        return [\n          y - width * (pW / pH),\n          1 - x - height * (pH / pW),\n          width * (pW / pH),\n          height * (pH / pW),\n        ];\n      case 8:\n        // 180 -> 0\n        return [x - width, y - height, width, height];\n      case 9:\n        // 180 -> 90\n        return [1 - y, x - width, height, width];\n      case 10:\n        // 180 -> 180\n        return [1 - x, 1 - y, width, height];\n      case 11:\n        // 180 -> 270\n        return [y - height, 1 - x, height, width];\n      case 12:\n        // 270 -> 0\n        return [\n          x - height * (pH / pW),\n          y,\n          height * (pH / pW),\n          width * (pW / pH),\n        ];\n      case 13:\n        // 270 -> 90\n        return [\n          1 - y - width * (pW / pH),\n          x - height * (pH / pW),\n          width * (pW / pH),\n          height * (pH / pW),\n        ];\n      case 14:\n        // 270 -> 180\n        return [\n          1 - x,\n          1 - y - width * (pW / pH),\n          height * (pH / pW),\n          width * (pW / pH),\n        ];\n      case 15:\n        // 270 -> 270\n        return [y, 1 - x, width * (pW / pH), height * (pH / pW)];\n      default:\n        // 0 -> 0\n        return [x, y, width, height];\n    }\n  }\n\n  /** @inheritdoc */\n  rotate() {\n    if (!this.parent) {\n      return;\n    }\n    this.parent.drawLayer.updateProperties(\n      this._drawId,\n      DrawingEditor._mergeSVGProperties(\n        {\n          bbox: this.#rotateBox(),\n        },\n        this.#drawOutlines.updateRotation(\n          (this.parentRotation - this.rotation + 360) % 360\n        )\n      )\n    );\n  }\n\n  onScaleChanging() {\n    if (!this.parent) {\n      return;\n    }\n    this.#updateBbox(\n      this.#drawOutlines.updateParentDimensions(\n        this.parentDimensions,\n        this.parent.scale\n      )\n    );\n  }\n\n  static onScaleChangingWhenDrawing() {}\n\n  /** @inheritdoc */\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n\n    const div = super.render();\n    div.classList.add(\"draw\");\n\n    const drawDiv = document.createElement(\"div\");\n    div.append(drawDiv);\n    drawDiv.setAttribute(\"aria-hidden\", \"true\");\n    drawDiv.className = \"internal\";\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    this.setDims(this.width * parentWidth, this.height * parentHeight);\n    this._uiManager.addShouldRescale(this);\n    this.disableEditing();\n\n    return div;\n  }\n\n  /**\n   * Create a new drawer instance.\n   * @param {number} x - The x coordinate of the event.\n   * @param {number} y - The y coordinate of the event.\n   * @param {number} parentWidth - The parent width.\n   * @param {number} parentHeight - The parent height.\n   * @param {number} rotation - The parent rotation.\n   */\n  static createDrawerInstance(_x, _y, _parentWidth, _parentHeight, _rotation) {\n    unreachable(\"Not implemented\");\n  }\n\n  static startDrawing(parent, uiManager, _isLTR, event) {\n    // The _currentPointerType is set when the user starts an empty drawing\n    // session. If, in the same drawing session, the user starts using a\n    // different type of pointer (e.g. a pen and then a finger), we just return.\n    //\n    // The _currentPointerId  and _currentPointerIds are used to keep track of\n    // the pointers with a same type (e.g. two fingers). If the user starts to\n    // draw with a finger and then uses a second finger, we just stop the\n    // current drawing and let the user zoom the document.\n\n    const { target, offsetX: x, offsetY: y, pointerId, pointerType } = event;\n    if (\n      DrawingEditor.#currentPointerType &&\n      DrawingEditor.#currentPointerType !== pointerType\n    ) {\n      return;\n    }\n\n    const {\n      viewport: { rotation },\n    } = parent;\n    const { width: parentWidth, height: parentHeight } =\n      target.getBoundingClientRect();\n\n    const ac = (DrawingEditor.#currentDrawingAC = new AbortController());\n    const signal = parent.combinedSignal(ac);\n\n    DrawingEditor.#currentPointerId ||= pointerId;\n    DrawingEditor.#currentPointerType ??= pointerType;\n\n    window.addEventListener(\n      \"pointerup\",\n      e => {\n        if (DrawingEditor.#currentPointerId === e.pointerId) {\n          this._endDraw(e);\n        } else {\n          DrawingEditor.#currentPointerIds?.delete(e.pointerId);\n        }\n      },\n      { signal }\n    );\n    window.addEventListener(\n      \"pointercancel\",\n      e => {\n        if (DrawingEditor.#currentPointerId === e.pointerId) {\n          this._currentParent.endDrawingSession();\n        } else {\n          DrawingEditor.#currentPointerIds?.delete(e.pointerId);\n        }\n      },\n      { signal }\n    );\n    window.addEventListener(\n      \"pointerdown\",\n      e => {\n        if (DrawingEditor.#currentPointerType !== e.pointerType) {\n          // For example, we started with a pen and the user\n          // is now using a finger.\n          return;\n        }\n\n        // For example, the user is using a second finger.\n        (DrawingEditor.#currentPointerIds ||= new Set()).add(e.pointerId);\n\n        // The first finger created a first point and a second finger just\n        // started, so we stop the drawing and remove this only point.\n        if (DrawingEditor.#currentDraw.isCancellable()) {\n          DrawingEditor.#currentDraw.removeLastElement();\n          if (DrawingEditor.#currentDraw.isEmpty()) {\n            this._currentParent.endDrawingSession(/* isAborted = */ true);\n          } else {\n            this._endDraw(null);\n          }\n        }\n      },\n      {\n        capture: true,\n        passive: false,\n        signal,\n      }\n    );\n    window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    target.addEventListener(\"pointermove\", this._drawMove.bind(this), {\n      signal,\n    });\n    target.addEventListener(\n      \"touchmove\",\n      e => {\n        if (e.timeStamp === DrawingEditor.#currentMoveTimestamp) {\n          // This move event is used to draw so we don't want to scroll.\n          stopEvent(e);\n        }\n      },\n      { signal }\n    );\n    parent.toggleDrawing();\n    uiManager._editorUndoBar?.hide();\n\n    if (DrawingEditor.#currentDraw) {\n      parent.drawLayer.updateProperties(\n        this._currentDrawId,\n        DrawingEditor.#currentDraw.startNew(\n          x,\n          y,\n          parentWidth,\n          parentHeight,\n          rotation\n        )\n      );\n      return;\n    }\n\n    uiManager.updateUIForDefaultProperties(this);\n\n    DrawingEditor.#currentDraw = this.createDrawerInstance(\n      x,\n      y,\n      parentWidth,\n      parentHeight,\n      rotation\n    );\n    DrawingEditor.#currentDrawingOptions = this.getDefaultDrawingOptions();\n    this._currentParent = parent;\n\n    ({ id: this._currentDrawId } = parent.drawLayer.draw(\n      this._mergeSVGProperties(\n        DrawingEditor.#currentDrawingOptions.toSVGProperties(),\n        DrawingEditor.#currentDraw.defaultSVGProperties\n      ),\n      /* isPathUpdatable = */ true,\n      /* hasClip = */ false\n    ));\n  }\n\n  static _drawMove(event) {\n    DrawingEditor.#currentMoveTimestamp = -1;\n    if (!DrawingEditor.#currentDraw) {\n      return;\n    }\n    const { offsetX, offsetY, pointerId } = event;\n\n    if (DrawingEditor.#currentPointerId !== pointerId) {\n      return;\n    }\n    if (DrawingEditor.#currentPointerIds?.size >= 1) {\n      // The user is using multiple fingers and the first one is moving.\n      this._endDraw(event);\n      return;\n    }\n    this._currentParent.drawLayer.updateProperties(\n      this._currentDrawId,\n      DrawingEditor.#currentDraw.add(offsetX, offsetY)\n    );\n    // We track the timestamp to know if the touchmove event is used to draw.\n    DrawingEditor.#currentMoveTimestamp = event.timeStamp;\n    stopEvent(event);\n  }\n\n  static _cleanup(all) {\n    if (all) {\n      this._currentDrawId = -1;\n      this._currentParent = null;\n      DrawingEditor.#currentDraw = null;\n      DrawingEditor.#currentDrawingOptions = null;\n      DrawingEditor.#currentPointerType = null;\n      DrawingEditor.#currentMoveTimestamp = NaN;\n    }\n\n    if (DrawingEditor.#currentDrawingAC) {\n      DrawingEditor.#currentDrawingAC.abort();\n      DrawingEditor.#currentDrawingAC = null;\n      DrawingEditor.#currentPointerId = NaN;\n      DrawingEditor.#currentPointerIds = null;\n    }\n  }\n\n  static _endDraw(event) {\n    const parent = this._currentParent;\n    if (!parent) {\n      return;\n    }\n\n    parent.toggleDrawing(true);\n    this._cleanup(false);\n\n    if (event) {\n      parent.drawLayer.updateProperties(\n        this._currentDrawId,\n        DrawingEditor.#currentDraw.end(event.offsetX, event.offsetY)\n      );\n    }\n    if (this.supportMultipleDrawings) {\n      const draw = DrawingEditor.#currentDraw;\n      const drawId = this._currentDrawId;\n      const lastElement = draw.getLastElement();\n      parent.addCommands({\n        cmd: () => {\n          parent.drawLayer.updateProperties(\n            drawId,\n            draw.setLastElement(lastElement)\n          );\n        },\n        undo: () => {\n          parent.drawLayer.updateProperties(drawId, draw.removeLastElement());\n        },\n        mustExec: false,\n        type: AnnotationEditorParamsType.DRAW_STEP,\n      });\n\n      return;\n    }\n\n    this.endDrawing(/* isAborted = */ false);\n  }\n\n  static endDrawing(isAborted) {\n    const parent = this._currentParent;\n    if (!parent) {\n      return null;\n    }\n    parent.toggleDrawing(true);\n    parent.cleanUndoStack(AnnotationEditorParamsType.DRAW_STEP);\n\n    if (!DrawingEditor.#currentDraw.isEmpty()) {\n      const {\n        pageDimensions: [pageWidth, pageHeight],\n        scale,\n      } = parent;\n\n      const editor = parent.createAndAddNewEditor(\n        { offsetX: 0, offsetY: 0 },\n        false,\n        {\n          drawId: this._currentDrawId,\n          drawOutlines: DrawingEditor.#currentDraw.getOutlines(\n            pageWidth * scale,\n            pageHeight * scale,\n            scale,\n            this._INNER_MARGIN\n          ),\n          drawingOptions: DrawingEditor.#currentDrawingOptions,\n          mustBeCommitted: !isAborted,\n        }\n      );\n      this._cleanup(true);\n      return editor;\n    }\n\n    parent.drawLayer.remove(this._currentDrawId);\n    this._cleanup(true);\n    return null;\n  }\n\n  /**\n   * Create the drawing options.\n   * @param {Object} _data\n   */\n  createDrawingOptions(_data) {}\n\n  /**\n   * Deserialize the drawing outlines.\n   * @param {number} pageX - The x coordinate of the page.\n   * @param {number} pageY - The y coordinate of the page.\n   * @param {number} pageWidth - The width of the page.\n   * @param {number} pageHeight - The height of the page.\n   * @param {number} innerWidth - The inner width.\n   * @param {Object} data - The data to deserialize.\n   * @returns {Object} The deserialized outlines.\n   */\n  static deserializeDraw(\n    _pageX,\n    _pageY,\n    _pageWidth,\n    _pageHeight,\n    _innerWidth,\n    _data\n  ) {\n    unreachable(\"Not implemented\");\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    const {\n      rawDims: { pageWidth, pageHeight, pageX, pageY },\n    } = parent.viewport;\n    const drawOutlines = this.deserializeDraw(\n      pageX,\n      pageY,\n      pageWidth,\n      pageHeight,\n      this._INNER_MARGIN,\n      data\n    );\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor.createDrawingOptions(data);\n    editor.#createDrawOutlines({ drawOutlines });\n    editor.#addToDrawLayer();\n    editor.onScaleChanging();\n    editor.rotate();\n\n    return editor;\n  }\n\n  serializeDraw(isForCopying) {\n    const [pageX, pageY] = this.pageTranslation;\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    return this.#drawOutlines.serialize(\n      [pageX, pageY, pageWidth, pageHeight],\n      isForCopying\n    );\n  }\n\n  /** @inheritdoc */\n  renderAnnotationElement(annotation) {\n    annotation.updateEdited({\n      rect: this.getRect(0, 0),\n    });\n\n    return null;\n  }\n\n  static canCreateNewEmptyEditor() {\n    return false;\n  }\n}\n\nexport { DrawingEditor, DrawingOptions };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Outline } from \"./outline.js\";\nimport { Util } from \"../../../shared/util.js\";\n\nclass InkDrawOutliner {\n  // The last 3 points of the line.\n  #last = new Float64Array(6);\n\n  #line;\n\n  #lines;\n\n  #rotation;\n\n  #thickness;\n\n  #points;\n\n  #lastSVGPath = \"\";\n\n  #lastIndex = 0;\n\n  #outlines = new InkDrawOutline();\n\n  #parentWidth;\n\n  #parentHeight;\n\n  constructor(x, y, parentWidth, parentHeight, rotation, thickness) {\n    this.#parentWidth = parentWidth;\n    this.#parentHeight = parentHeight;\n    this.#rotation = rotation;\n    this.#thickness = thickness;\n\n    [x, y] = this.#normalizePoint(x, y);\n\n    const line = (this.#line = [NaN, NaN, NaN, NaN, x, y]);\n    this.#points = [x, y];\n    this.#lines = [{ line, points: this.#points }];\n    this.#last.set(line, 0);\n  }\n\n  updateProperty(name, value) {\n    if (name === \"stroke-width\") {\n      this.#thickness = value;\n    }\n  }\n\n  #normalizePoint(x, y) {\n    return Outline._normalizePoint(\n      x,\n      y,\n      this.#parentWidth,\n      this.#parentHeight,\n      this.#rotation\n    );\n  }\n\n  isEmpty() {\n    return !this.#lines || this.#lines.length === 0;\n  }\n\n  isCancellable() {\n    // The user a second finger after drawing 5 points: it's small enough\n    // to not be a real drawing.\n    return this.#points.length <= 10;\n  }\n\n  add(x, y) {\n    // The point is in canvas coordinates which means that there is no rotation.\n    // It's the same as parent coordinates.\n    [x, y] = this.#normalizePoint(x, y);\n    const [x1, y1, x2, y2] = this.#last.subarray(2, 6);\n    const diffX = x - x2;\n    const diffY = y - y2;\n    const d = Math.hypot(this.#parentWidth * diffX, this.#parentHeight * diffY);\n    if (d <= 2) {\n      // The idea is to avoid garbage points around the last point.\n      // When the points are too close, it just leads to bad normal vectors and\n      // control points.\n      return null;\n    }\n\n    this.#points.push(x, y);\n\n    if (isNaN(x1)) {\n      // We've only one point.\n      this.#last.set([x2, y2, x, y], 2);\n      this.#line.push(NaN, NaN, NaN, NaN, x, y);\n      return {\n        path: {\n          d: this.toSVGPath(),\n        },\n      };\n    }\n\n    if (isNaN(this.#last[0])) {\n      // We've only two points.\n      this.#line.splice(6, 6);\n    }\n\n    this.#last.set([x1, y1, x2, y2, x, y], 0);\n    this.#line.push(...Outline.createBezierPoints(x1, y1, x2, y2, x, y));\n\n    return {\n      path: {\n        d: this.toSVGPath(),\n      },\n    };\n  }\n\n  end(x, y) {\n    const change = this.add(x, y);\n    if (change) {\n      return change;\n    }\n    if (this.#points.length === 2) {\n      // We've only one point.\n      return {\n        path: {\n          d: this.toSVGPath(),\n        },\n      };\n    }\n    return null;\n  }\n\n  startNew(x, y, parentWidth, parentHeight, rotation) {\n    this.#parentWidth = parentWidth;\n    this.#parentHeight = parentHeight;\n    this.#rotation = rotation;\n\n    [x, y] = this.#normalizePoint(x, y);\n\n    const line = (this.#line = [NaN, NaN, NaN, NaN, x, y]);\n    this.#points = [x, y];\n    const last = this.#lines.at(-1);\n    if (last) {\n      last.line = new Float32Array(last.line);\n      last.points = new Float32Array(last.points);\n    }\n    this.#lines.push({ line, points: this.#points });\n    this.#last.set(line, 0);\n    this.#lastIndex = 0;\n    this.toSVGPath();\n\n    return null;\n  }\n\n  getLastElement() {\n    return this.#lines.at(-1);\n  }\n\n  setLastElement(element) {\n    if (!this.#lines) {\n      return this.#outlines.setLastElement(element);\n    }\n    this.#lines.push(element);\n    this.#line = element.line;\n    this.#points = element.points;\n    this.#lastIndex = 0;\n    return {\n      path: {\n        d: this.toSVGPath(),\n      },\n    };\n  }\n\n  removeLastElement() {\n    if (!this.#lines) {\n      return this.#outlines.removeLastElement();\n    }\n    this.#lines.pop();\n    this.#lastSVGPath = \"\";\n    for (let i = 0, ii = this.#lines.length; i < ii; i++) {\n      const { line, points } = this.#lines[i];\n      this.#line = line;\n      this.#points = points;\n      this.#lastIndex = 0;\n      this.toSVGPath();\n    }\n\n    return {\n      path: {\n        d: this.#lastSVGPath,\n      },\n    };\n  }\n\n  toSVGPath() {\n    const firstX = Outline.svgRound(this.#line[4]);\n    const firstY = Outline.svgRound(this.#line[5]);\n    if (this.#points.length === 2) {\n      this.#lastSVGPath = `${this.#lastSVGPath} M ${firstX} ${firstY} Z`;\n      return this.#lastSVGPath;\n    }\n\n    if (this.#points.length <= 6) {\n      // We've 2 or 3 points.\n      const i = this.#lastSVGPath.lastIndexOf(\"M\");\n      this.#lastSVGPath = `${this.#lastSVGPath.slice(0, i)} M ${firstX} ${firstY}`;\n      this.#lastIndex = 6;\n    }\n\n    if (this.#points.length === 4) {\n      const secondX = Outline.svgRound(this.#line[10]);\n      const secondY = Outline.svgRound(this.#line[11]);\n      this.#lastSVGPath = `${this.#lastSVGPath} L ${secondX} ${secondY}`;\n      this.#lastIndex = 12;\n      return this.#lastSVGPath;\n    }\n\n    const buffer = [];\n    if (this.#lastIndex === 0) {\n      buffer.push(`M ${firstX} ${firstY}`);\n      this.#lastIndex = 6;\n    }\n\n    for (let i = this.#lastIndex, ii = this.#line.length; i < ii; i += 6) {\n      const [c1x, c1y, c2x, c2y, x, y] = this.#line\n        .slice(i, i + 6)\n        .map(Outline.svgRound);\n      buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`);\n    }\n    this.#lastSVGPath += buffer.join(\" \");\n    this.#lastIndex = this.#line.length;\n\n    return this.#lastSVGPath;\n  }\n\n  getOutlines(parentWidth, parentHeight, scale, innerMargin) {\n    const last = this.#lines.at(-1);\n    last.line = new Float32Array(last.line);\n    last.points = new Float32Array(last.points);\n\n    this.#outlines.build(\n      this.#lines,\n      parentWidth,\n      parentHeight,\n      scale,\n      this.#rotation,\n      this.#thickness,\n      innerMargin\n    );\n\n    // We reset everything: the drawing is done.\n    this.#last = null;\n    this.#line = null;\n    this.#lines = null;\n    this.#lastSVGPath = null;\n\n    return this.#outlines;\n  }\n\n  get defaultSVGProperties() {\n    return {\n      root: {\n        viewBox: \"0 0 10000 10000\",\n      },\n      rootClass: {\n        draw: true,\n      },\n      bbox: [0, 0, 1, 1],\n    };\n  }\n}\n\nclass InkDrawOutline extends Outline {\n  #bbox;\n\n  #currentRotation = 0;\n\n  #innerMargin;\n\n  #lines;\n\n  #parentWidth;\n\n  #parentHeight;\n\n  #parentScale;\n\n  #rotation;\n\n  #thickness;\n\n  build(\n    lines,\n    parentWidth,\n    parentHeight,\n    parentScale,\n    rotation,\n    thickness,\n    innerMargin\n  ) {\n    this.#parentWidth = parentWidth;\n    this.#parentHeight = parentHeight;\n    this.#parentScale = parentScale;\n    this.#rotation = rotation;\n    this.#thickness = thickness;\n    this.#innerMargin = innerMargin ?? 0;\n    this.#lines = lines;\n\n    this.#computeBbox();\n  }\n\n  setLastElement(element) {\n    this.#lines.push(element);\n    return {\n      path: {\n        d: this.toSVGPath(),\n      },\n    };\n  }\n\n  removeLastElement() {\n    this.#lines.pop();\n    return {\n      path: {\n        d: this.toSVGPath(),\n      },\n    };\n  }\n\n  toSVGPath() {\n    const buffer = [];\n    for (const { line } of this.#lines) {\n      buffer.push(`M${Outline.svgRound(line[4])} ${Outline.svgRound(line[5])}`);\n      if (line.length === 6) {\n        buffer.push(\"Z\");\n        continue;\n      }\n      if (line.length === 12) {\n        buffer.push(\n          `L${Outline.svgRound(line[10])} ${Outline.svgRound(line[11])}`\n        );\n        continue;\n      }\n      for (let i = 6, ii = line.length; i < ii; i += 6) {\n        const [c1x, c1y, c2x, c2y, x, y] = line\n          .subarray(i, i + 6)\n          .map(Outline.svgRound);\n        buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`);\n      }\n    }\n    return buffer.join(\"\");\n  }\n\n  serialize([pageX, pageY, pageWidth, pageHeight], isForCopying) {\n    const serializedLines = [];\n    const serializedPoints = [];\n    const [x, y, width, height] = this.#getBBoxWithNoMargin();\n    let tx, ty, sx, sy, x1, y1, x2, y2, rescaleFn;\n\n    switch (this.#rotation) {\n      case 0:\n        rescaleFn = Outline._rescale;\n        tx = pageX;\n        ty = pageY + pageHeight;\n        sx = pageWidth;\n        sy = -pageHeight;\n        x1 = pageX + x * pageWidth;\n        y1 = pageY + (1 - y - height) * pageHeight;\n        x2 = pageX + (x + width) * pageWidth;\n        y2 = pageY + (1 - y) * pageHeight;\n        break;\n      case 90:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = pageX;\n        ty = pageY;\n        sx = pageWidth;\n        sy = pageHeight;\n        x1 = pageX + y * pageWidth;\n        y1 = pageY + x * pageHeight;\n        x2 = pageX + (y + height) * pageWidth;\n        y2 = pageY + (x + width) * pageHeight;\n        break;\n      case 180:\n        rescaleFn = Outline._rescale;\n        tx = pageX + pageWidth;\n        ty = pageY;\n        sx = -pageWidth;\n        sy = pageHeight;\n        x1 = pageX + (1 - x - width) * pageWidth;\n        y1 = pageY + y * pageHeight;\n        x2 = pageX + (1 - x) * pageWidth;\n        y2 = pageY + (y + height) * pageHeight;\n        break;\n      case 270:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = pageX + pageWidth;\n        ty = pageY + pageHeight;\n        sx = -pageWidth;\n        sy = -pageHeight;\n        x1 = pageX + (1 - y - height) * pageWidth;\n        y1 = pageY + (1 - x - width) * pageHeight;\n        x2 = pageX + (1 - y) * pageWidth;\n        y2 = pageY + (1 - x) * pageHeight;\n        break;\n    }\n\n    for (const { line, points } of this.#lines) {\n      serializedLines.push(\n        rescaleFn(\n          line,\n          tx,\n          ty,\n          sx,\n          sy,\n          isForCopying ? new Array(line.length) : null\n        )\n      );\n      serializedPoints.push(\n        rescaleFn(\n          points,\n          tx,\n          ty,\n          sx,\n          sy,\n          isForCopying ? new Array(points.length) : null\n        )\n      );\n    }\n\n    return {\n      lines: serializedLines,\n      points: serializedPoints,\n      rect: [x1, y1, x2, y2],\n    };\n  }\n\n  static deserialize(\n    pageX,\n    pageY,\n    pageWidth,\n    pageHeight,\n    innerMargin,\n    { paths: { lines, points }, rotation, thickness }\n  ) {\n    const newLines = [];\n    let tx, ty, sx, sy, rescaleFn;\n    switch (rotation) {\n      case 0:\n        rescaleFn = Outline._rescale;\n        tx = -pageX / pageWidth;\n        ty = pageY / pageHeight + 1;\n        sx = 1 / pageWidth;\n        sy = -1 / pageHeight;\n        break;\n      case 90:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = -pageY / pageHeight;\n        ty = -pageX / pageWidth;\n        sx = 1 / pageHeight;\n        sy = 1 / pageWidth;\n        break;\n      case 180:\n        rescaleFn = Outline._rescale;\n        tx = pageX / pageWidth + 1;\n        ty = -pageY / pageHeight;\n        sx = -1 / pageWidth;\n        sy = 1 / pageHeight;\n        break;\n      case 270:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = pageY / pageHeight + 1;\n        ty = pageX / pageWidth + 1;\n        sx = -1 / pageHeight;\n        sy = -1 / pageWidth;\n        break;\n    }\n\n    if (!lines) {\n      lines = [];\n      for (const point of points) {\n        const len = point.length;\n        if (len === 2) {\n          lines.push(\n            new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1]])\n          );\n          continue;\n        }\n        if (len === 4) {\n          lines.push(\n            new Float32Array([\n              NaN,\n              NaN,\n              NaN,\n              NaN,\n              point[0],\n              point[1],\n              NaN,\n              NaN,\n              NaN,\n              NaN,\n              point[2],\n              point[3],\n            ])\n          );\n          continue;\n        }\n        const line = new Float32Array(3 * (len - 2));\n        lines.push(line);\n        let [x1, y1, x2, y2] = point.subarray(0, 4);\n        line.set([NaN, NaN, NaN, NaN, x1, y1], 0);\n        for (let i = 4; i < len; i += 2) {\n          const x = point[i];\n          const y = point[i + 1];\n          line.set(\n            Outline.createBezierPoints(x1, y1, x2, y2, x, y),\n            (i - 2) * 3\n          );\n          [x1, y1, x2, y2] = [x2, y2, x, y];\n        }\n      }\n    }\n\n    for (let i = 0, ii = lines.length; i < ii; i++) {\n      newLines.push({\n        line: rescaleFn(\n          lines[i].map(x => x ?? NaN),\n          tx,\n          ty,\n          sx,\n          sy\n        ),\n        points: rescaleFn(\n          points[i].map(x => x ?? NaN),\n          tx,\n          ty,\n          sx,\n          sy\n        ),\n      });\n    }\n\n    const outlines = new InkDrawOutline();\n    outlines.build(\n      newLines,\n      pageWidth,\n      pageHeight,\n      1,\n      rotation,\n      thickness,\n      innerMargin\n    );\n\n    return outlines;\n  }\n\n  #getMarginComponents(thickness = this.#thickness) {\n    const margin = this.#innerMargin + (thickness / 2) * this.#parentScale;\n    return this.#rotation % 180 === 0\n      ? [margin / this.#parentWidth, margin / this.#parentHeight]\n      : [margin / this.#parentHeight, margin / this.#parentWidth];\n  }\n\n  #getBBoxWithNoMargin() {\n    const [x, y, width, height] = this.#bbox;\n    const [marginX, marginY] = this.#getMarginComponents(0);\n\n    return [\n      x + marginX,\n      y + marginY,\n      width - 2 * marginX,\n      height - 2 * marginY,\n    ];\n  }\n\n  #computeBbox() {\n    const bbox = (this.#bbox = new Float32Array([\n      Infinity,\n      Infinity,\n      -Infinity,\n      -Infinity,\n    ]));\n\n    for (const { line } of this.#lines) {\n      if (line.length <= 12) {\n        // We've only one or two points => no bezier curve.\n        for (let i = 4, ii = line.length; i < ii; i += 6) {\n          const [x, y] = line.subarray(i, i + 2);\n          bbox[0] = Math.min(bbox[0], x);\n          bbox[1] = Math.min(bbox[1], y);\n          bbox[2] = Math.max(bbox[2], x);\n          bbox[3] = Math.max(bbox[3], y);\n        }\n        continue;\n      }\n      let lastX = line[4],\n        lastY = line[5];\n      for (let i = 6, ii = line.length; i < ii; i += 6) {\n        const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6);\n        Util.bezierBoundingBox(lastX, lastY, c1x, c1y, c2x, c2y, x, y, bbox);\n        lastX = x;\n        lastY = y;\n      }\n    }\n\n    const [marginX, marginY] = this.#getMarginComponents();\n    bbox[0] = Math.min(1, Math.max(0, bbox[0] - marginX));\n    bbox[1] = Math.min(1, Math.max(0, bbox[1] - marginY));\n    bbox[2] = Math.min(1, Math.max(0, bbox[2] + marginX));\n    bbox[3] = Math.min(1, Math.max(0, bbox[3] + marginY));\n\n    bbox[2] -= bbox[0];\n    bbox[3] -= bbox[1];\n  }\n\n  get box() {\n    return this.#bbox;\n  }\n\n  updateProperty(name, value) {\n    if (name === \"stroke-width\") {\n      return this.#updateThickness(value);\n    }\n    return null;\n  }\n\n  #updateThickness(thickness) {\n    const [oldMarginX, oldMarginY] = this.#getMarginComponents();\n    this.#thickness = thickness;\n    const [newMarginX, newMarginY] = this.#getMarginComponents();\n    const [diffMarginX, diffMarginY] = [\n      newMarginX - oldMarginX,\n      newMarginY - oldMarginY,\n    ];\n    const bbox = this.#bbox;\n    bbox[0] -= diffMarginX;\n    bbox[1] -= diffMarginY;\n    bbox[2] += 2 * diffMarginX;\n    bbox[3] += 2 * diffMarginY;\n\n    return bbox;\n  }\n\n  updateParentDimensions([width, height], scale) {\n    const [oldMarginX, oldMarginY] = this.#getMarginComponents();\n    this.#parentWidth = width;\n    this.#parentHeight = height;\n    this.#parentScale = scale;\n    const [newMarginX, newMarginY] = this.#getMarginComponents();\n    const diffMarginX = newMarginX - oldMarginX;\n    const diffMarginY = newMarginY - oldMarginY;\n\n    const bbox = this.#bbox;\n    bbox[0] -= diffMarginX;\n    bbox[1] -= diffMarginY;\n    bbox[2] += 2 * diffMarginX;\n    bbox[3] += 2 * diffMarginY;\n\n    return bbox;\n  }\n\n  updateRotation(rotation) {\n    this.#currentRotation = rotation;\n    return {\n      path: {\n        transform: this.rotationTransform,\n      },\n    };\n  }\n\n  get viewBox() {\n    return this.#bbox.map(Outline.svgRound).join(\" \");\n  }\n\n  get defaultProperties() {\n    const [x, y] = this.#bbox;\n    return {\n      root: {\n        viewBox: this.viewBox,\n      },\n      path: {\n        \"transform-origin\": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`,\n      },\n    };\n  }\n\n  get rotationTransform() {\n    const [, , width, height] = this.#bbox;\n    let a = 0,\n      b = 0,\n      c = 0,\n      d = 0,\n      e = 0,\n      f = 0;\n    switch (this.#currentRotation) {\n      case 90:\n        b = height / width;\n        c = -width / height;\n        e = width;\n        break;\n      case 180:\n        a = -1;\n        d = -1;\n        e = width;\n        f = height;\n        break;\n      case 270:\n        b = -height / width;\n        c = width / height;\n        f = height;\n        break;\n      default:\n        return \"\";\n    }\n    return `matrix(${a} ${b} ${c} ${d} ${Outline.svgRound(e)} ${Outline.svgRound(f)})`;\n  }\n\n  getPathResizingSVGProperties([newX, newY, newWidth, newHeight]) {\n    const [marginX, marginY] = this.#getMarginComponents();\n    const [x, y, width, height] = this.#bbox;\n\n    if (\n      Math.abs(width - marginX) <= Outline.PRECISION ||\n      Math.abs(height - marginY) <= Outline.PRECISION\n    ) {\n      // Center the path in the new bounding box.\n      const tx = newX + newWidth / 2 - (x + width / 2);\n      const ty = newY + newHeight / 2 - (y + height / 2);\n      return {\n        path: {\n          \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n          transform: `${this.rotationTransform} translate(${tx} ${ty})`,\n        },\n      };\n    }\n\n    // We compute the following transform:\n    //  1. Translate the path to the origin (-marginX, -marginY).\n    //  2. Scale the path to the new size:\n    //   ((newWidth - 2*marginX) / (bbox.width - 2*marginX),\n    //   (newHeight - 2*marginY) / (bbox.height - 2*marginY)).\n    //  3. Translate the path back to its original position\n    //   (marginX, marginY).\n    //  4. Scale the inverse of bbox scaling:\n    //   (bbox.width / newWidth, bbox.height / newHeight).\n\n    const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX);\n    const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY);\n    const s2x = width / newWidth;\n    const s2y = height / newHeight;\n\n    return {\n      path: {\n        \"transform-origin\": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`,\n        transform:\n          `${this.rotationTransform} scale(${s2x} ${s2y}) ` +\n          `translate(${Outline.svgRound(marginX)} ${Outline.svgRound(marginY)}) scale(${s1x} ${s1y}) ` +\n          `translate(${Outline.svgRound(-marginX)} ${Outline.svgRound(-marginY)})`,\n      },\n    };\n  }\n\n  getPathResizedSVGProperties([newX, newY, newWidth, newHeight]) {\n    const [marginX, marginY] = this.#getMarginComponents();\n    const bbox = this.#bbox;\n    const [x, y, width, height] = bbox;\n\n    bbox[0] = newX;\n    bbox[1] = newY;\n    bbox[2] = newWidth;\n    bbox[3] = newHeight;\n\n    if (\n      Math.abs(width - marginX) <= Outline.PRECISION ||\n      Math.abs(height - marginY) <= Outline.PRECISION\n    ) {\n      // Center the path in the new bounding box.\n      const tx = newX + newWidth / 2 - (x + width / 2);\n      const ty = newY + newHeight / 2 - (y + height / 2);\n      for (const { line, points } of this.#lines) {\n        Outline._translate(line, tx, ty, line);\n        Outline._translate(points, tx, ty, points);\n      }\n      return {\n        root: {\n          viewBox: this.viewBox,\n        },\n        path: {\n          \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n          transform: this.rotationTransform || null,\n          d: this.toSVGPath(),\n        },\n      };\n    }\n\n    // We compute the following transform:\n    //  1. Translate the path to the origin (-(x + marginX), -(y + marginY)).\n    //  2. Scale the path to the new size:\n    //   ((newWidth - 2*marginX) / (bbox.width - 2*marginX),\n    //   (newHeight - 2*marginY) / (bbox.height - 2*marginY)).\n    //  3. Translate the path back to its new position\n    //     (newX + marginX,y newY + marginY).\n\n    const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX);\n    const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY);\n    const tx = -s1x * (x + marginX) + newX + marginX;\n    const ty = -s1y * (y + marginY) + newY + marginY;\n\n    if (s1x !== 1 || s1y !== 1 || tx !== 0 || ty !== 0) {\n      for (const { line, points } of this.#lines) {\n        Outline._rescale(line, tx, ty, s1x, s1y, line);\n        Outline._rescale(points, tx, ty, s1x, s1y, points);\n      }\n    }\n\n    return {\n      root: {\n        viewBox: this.viewBox,\n      },\n      path: {\n        \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n        transform: this.rotationTransform || null,\n        d: this.toSVGPath(),\n      },\n    };\n  }\n\n  getPathTranslatedSVGProperties([newX, newY], parentDimensions) {\n    const [newParentWidth, newParentHeight] = parentDimensions;\n    const bbox = this.#bbox;\n    const tx = newX - bbox[0];\n    const ty = newY - bbox[1];\n\n    if (\n      this.#parentWidth === newParentWidth &&\n      this.#parentHeight === newParentHeight\n    ) {\n      // We don't change the parent dimensions so it's a simple translation.\n      for (const { line, points } of this.#lines) {\n        Outline._translate(line, tx, ty, line);\n        Outline._translate(points, tx, ty, points);\n      }\n    } else {\n      const sx = this.#parentWidth / newParentWidth;\n      const sy = this.#parentHeight / newParentHeight;\n      this.#parentWidth = newParentWidth;\n      this.#parentHeight = newParentHeight;\n\n      for (const { line, points } of this.#lines) {\n        Outline._rescale(line, tx, ty, sx, sy, line);\n        Outline._rescale(points, tx, ty, sx, sy, points);\n      }\n      bbox[2] *= sx;\n      bbox[3] *= sy;\n    }\n    bbox[0] = newX;\n    bbox[1] = newY;\n\n    return {\n      root: {\n        viewBox: this.viewBox,\n      },\n      path: {\n        d: this.toSVGPath(),\n        \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n      },\n    };\n  }\n\n  get defaultSVGProperties() {\n    const bbox = this.#bbox;\n    return {\n      root: {\n        viewBox: this.viewBox,\n      },\n      rootClass: {\n        draw: true,\n      },\n      path: {\n        d: this.toSVGPath(),\n        \"transform-origin\": `${Outline.svgRound(bbox[0])} ${Outline.svgRound(bbox[1])}`,\n        transform: this.rotationTransform || null,\n      },\n      bbox,\n    };\n  }\n}\n\nexport { InkDrawOutline, InkDrawOutliner };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  shadow,\n  Util,\n} from \"../../shared/util.js\";\nimport { DrawingEditor, DrawingOptions } from \"./draw.js\";\nimport { InkDrawOutline, InkDrawOutliner } from \"./drawers/inkdraw.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { InkAnnotationElement } from \"../annotation_layer.js\";\n\nclass InkDrawingOptions extends DrawingOptions {\n  #viewParameters;\n\n  constructor(viewerParameters) {\n    super();\n    this.#viewParameters = viewerParameters;\n\n    super.updateProperties({\n      fill: \"none\",\n      stroke: AnnotationEditor._defaultLineColor,\n      \"stroke-opacity\": 1,\n      \"stroke-width\": 1,\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      \"stroke-miterlimit\": 10,\n    });\n  }\n\n  updateSVGProperty(name, value) {\n    if (name === \"stroke-width\") {\n      value ??= this[\"stroke-width\"];\n      value *= this.#viewParameters.realScale;\n    }\n    super.updateSVGProperty(name, value);\n  }\n\n  clone() {\n    const clone = new InkDrawingOptions(this.#viewParameters);\n    clone.updateAll(this);\n    return clone;\n  }\n}\n\n/**\n * Basic draw editor in order to generate an Ink annotation.\n */\nclass InkEditor extends DrawingEditor {\n  static _type = \"ink\";\n\n  static _editorType = AnnotationEditorType.INK;\n\n  static _defaultDrawingOptions = null;\n\n  constructor(params) {\n    super({ ...params, name: \"inkEditor\" });\n    this._willKeepAspectRatio = true;\n  }\n\n  /** @inheritdoc */\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n    this._defaultDrawingOptions = new InkDrawingOptions(\n      uiManager.viewParameters\n    );\n  }\n\n  /** @inheritdoc */\n  static getDefaultDrawingOptions(options) {\n    const clone = this._defaultDrawingOptions.clone();\n    clone.updateProperties(options);\n    return clone;\n  }\n\n  /** @inheritdoc */\n  static get supportMultipleDrawings() {\n    return true;\n  }\n\n  /** @inheritdoc */\n  static get typesMap() {\n    return shadow(\n      this,\n      \"typesMap\",\n      new Map([\n        [AnnotationEditorParamsType.INK_THICKNESS, \"stroke-width\"],\n        [AnnotationEditorParamsType.INK_COLOR, \"stroke\"],\n        [AnnotationEditorParamsType.INK_OPACITY, \"stroke-opacity\"],\n      ])\n    );\n  }\n\n  /** @inheritdoc */\n  static createDrawerInstance(x, y, parentWidth, parentHeight, rotation) {\n    return new InkDrawOutliner(\n      x,\n      y,\n      parentWidth,\n      parentHeight,\n      rotation,\n      this._defaultDrawingOptions[\"stroke-width\"]\n    );\n  }\n\n  /** @inheritdoc */\n  static deserializeDraw(\n    pageX,\n    pageY,\n    pageWidth,\n    pageHeight,\n    innerMargin,\n    data\n  ) {\n    return InkDrawOutline.deserialize(\n      pageX,\n      pageY,\n      pageWidth,\n      pageHeight,\n      innerMargin,\n      data\n    );\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    if (data instanceof InkAnnotationElement) {\n      const {\n        data: {\n          inkLists,\n          rect,\n          rotation,\n          id,\n          color,\n          opacity,\n          borderStyle: { rawWidth: thickness },\n          popupRef,\n        },\n        parent: {\n          page: { pageNumber },\n        },\n      } = data;\n      initialData = data = {\n        annotationType: AnnotationEditorType.INK,\n        color: Array.from(color),\n        thickness,\n        opacity,\n        paths: { points: inkLists },\n        boxes: null,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        id,\n        deleted: false,\n        popupRef,\n      };\n    }\n\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor.annotationElementId = data.id || null;\n    editor._initialData = initialData;\n\n    return editor;\n  }\n\n  /** @inheritdoc */\n  onScaleChanging() {\n    if (!this.parent) {\n      return;\n    }\n    super.onScaleChanging();\n    const { _drawId, _drawingOptions, parent } = this;\n    _drawingOptions.updateSVGProperty(\"stroke-width\");\n    parent.drawLayer.updateProperties(\n      _drawId,\n      _drawingOptions.toSVGProperties()\n    );\n  }\n\n  static onScaleChangingWhenDrawing() {\n    const parent = this._currentParent;\n    if (!parent) {\n      return;\n    }\n    super.onScaleChangingWhenDrawing();\n    this._defaultDrawingOptions.updateSVGProperty(\"stroke-width\");\n    parent.drawLayer.updateProperties(\n      this._currentDrawId,\n      this._defaultDrawingOptions.toSVGProperties()\n    );\n  }\n\n  /** @inheritdoc */\n  createDrawingOptions({ color, thickness, opacity }) {\n    this._drawingOptions = InkEditor.getDefaultDrawingOptions({\n      stroke: Util.makeHexColor(...color),\n      \"stroke-width\": thickness,\n      \"stroke-opacity\": opacity,\n    });\n  }\n\n  /** @inheritdoc */\n  serialize(isForCopying = false) {\n    if (this.isEmpty()) {\n      return null;\n    }\n\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n\n    const { lines, points, rect } = this.serializeDraw(isForCopying);\n    const {\n      _drawingOptions: {\n        stroke,\n        \"stroke-opacity\": opacity,\n        \"stroke-width\": thickness,\n      },\n    } = this;\n    const serialized = {\n      annotationType: AnnotationEditorType.INK,\n      color: AnnotationEditor._colorManager.convert(stroke),\n      opacity,\n      thickness,\n      paths: {\n        lines,\n        points,\n      },\n      pageIndex: this.pageIndex,\n      rect,\n      rotation: this.rotation,\n      structTreeParentId: this._structTreeParentId,\n    };\n\n    if (isForCopying) {\n      return serialized;\n    }\n\n    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {\n      return null;\n    }\n\n    serialized.id = this.annotationElementId;\n    return serialized;\n  }\n\n  #hasElementChanged(serialized) {\n    const { color, thickness, opacity, pageIndex } = this._initialData;\n    return (\n      this._hasBeenMoved ||\n      this._hasBeenResized ||\n      serialized.color.some((c, i) => c !== color[i]) ||\n      serialized.thickness !== thickness ||\n      serialized.opacity !== opacity ||\n      serialized.pageIndex !== pageIndex\n    );\n  }\n\n  /** @inheritdoc */\n  renderAnnotationElement(annotation) {\n    const { points, rect } = this.serializeDraw(/* isForCopying = */ false);\n    annotation.updateEdited({\n      rect,\n      thickness: this._drawingOptions[\"stroke-width\"],\n      points,\n    });\n\n    return null;\n  }\n}\n\nexport { InkEditor };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationEditorType,\n  AnnotationPrefix,\n  shadow,\n} from \"../../shared/util.js\";\nimport { OutputScale, PixelsPerInch } from \"../display_utils.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { StampAnnotationElement } from \"../annotation_layer.js\";\n\n/**\n * Basic text editor in order to create a FreeTex annotation.\n */\nclass StampEditor extends AnnotationEditor {\n  #bitmap = null;\n\n  #bitmapId = null;\n\n  #bitmapPromise = null;\n\n  #bitmapUrl = null;\n\n  #bitmapFile = null;\n\n  #bitmapFileName = \"\";\n\n  #canvas = null;\n\n  #resizeTimeoutId = null;\n\n  #isSvg = false;\n\n  #hasBeenAddedInUndoStack = false;\n\n  static _type = \"stamp\";\n\n  static _editorType = AnnotationEditorType.STAMP;\n\n  constructor(params) {\n    super({ ...params, name: \"stampEditor\" });\n    this.#bitmapUrl = params.bitmapUrl;\n    this.#bitmapFile = params.bitmapFile;\n  }\n\n  /** @inheritdoc */\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n  }\n\n  static get supportedTypes() {\n    // See https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types\n    // to know which types are supported by the browser.\n    const types = [\n      \"apng\",\n      \"avif\",\n      \"bmp\",\n      \"gif\",\n      \"jpeg\",\n      \"png\",\n      \"svg+xml\",\n      \"webp\",\n      \"x-icon\",\n    ];\n    return shadow(\n      this,\n      \"supportedTypes\",\n      types.map(type => `image/${type}`)\n    );\n  }\n\n  static get supportedTypesStr() {\n    return shadow(this, \"supportedTypesStr\", this.supportedTypes.join(\",\"));\n  }\n\n  /** @inheritdoc */\n  static isHandlingMimeForPasting(mime) {\n    return this.supportedTypes.includes(mime);\n  }\n\n  /** @inheritdoc */\n  static paste(item, parent) {\n    parent.pasteEditor(AnnotationEditorType.STAMP, {\n      bitmapFile: item.getAsFile(),\n    });\n  }\n\n  /** @inheritdoc */\n  altTextFinish() {\n    if (this._uiManager.useNewAltTextFlow) {\n      this.div.hidden = false;\n    }\n    super.altTextFinish();\n  }\n\n  /** @inheritdoc */\n  get telemetryFinalData() {\n    return {\n      type: \"stamp\",\n      hasAltText: !!this.altTextData?.altText,\n    };\n  }\n\n  static computeTelemetryFinalData(data) {\n    const hasAltTextStats = data.get(\"hasAltText\");\n    return {\n      hasAltText: hasAltTextStats.get(true) ?? 0,\n      hasNoAltText: hasAltTextStats.get(false) ?? 0,\n    };\n  }\n\n  #getBitmapFetched(data, fromId = false) {\n    if (!data) {\n      this.remove();\n      return;\n    }\n    this.#bitmap = data.bitmap;\n    if (!fromId) {\n      this.#bitmapId = data.id;\n      this.#isSvg = data.isSvg;\n    }\n    if (data.file) {\n      this.#bitmapFileName = data.file.name;\n    }\n    this.#createCanvas();\n  }\n\n  #getBitmapDone() {\n    this.#bitmapPromise = null;\n    this._uiManager.enableWaiting(false);\n    if (!this.#canvas) {\n      return;\n    }\n    if (\n      this._uiManager.useNewAltTextWhenAddingImage &&\n      this._uiManager.useNewAltTextFlow &&\n      this.#bitmap\n    ) {\n      this._editToolbar.hide();\n      this._uiManager.editAltText(this, /* firstTime = */ true);\n      return;\n    }\n\n    if (\n      !this._uiManager.useNewAltTextWhenAddingImage &&\n      this._uiManager.useNewAltTextFlow &&\n      this.#bitmap\n    ) {\n      this._reportTelemetry({\n        action: \"pdfjs.image.image_added\",\n        data: { alt_text_modal: false, alt_text_type: \"empty\" },\n      });\n      try {\n        // The alt-text dialog isn't opened but we still want to guess the alt\n        // text.\n        this.mlGuessAltText();\n      } catch {}\n    }\n\n    this.div.focus();\n  }\n\n  async mlGuessAltText(imageData = null, updateAltTextData = true) {\n    if (this.hasAltTextData()) {\n      return null;\n    }\n\n    const { mlManager } = this._uiManager;\n    if (!mlManager) {\n      throw new Error(\"No ML.\");\n    }\n    if (!(await mlManager.isEnabledFor(\"altText\"))) {\n      throw new Error(\"ML isn't enabled for alt text.\");\n    }\n    const { data, width, height } =\n      imageData ||\n      this.copyCanvas(null, null, /* createImageData = */ true).imageData;\n    const response = await mlManager.guess({\n      name: \"altText\",\n      request: {\n        data,\n        width,\n        height,\n        channels: data.length / (width * height),\n      },\n    });\n    if (!response) {\n      throw new Error(\"No response from the AI service.\");\n    }\n    if (response.error) {\n      throw new Error(\"Error from the AI service.\");\n    }\n    if (response.cancel) {\n      return null;\n    }\n    if (!response.output) {\n      throw new Error(\"No valid response from the AI service.\");\n    }\n    const altText = response.output;\n    await this.setGuessedAltText(altText);\n    if (updateAltTextData && !this.hasAltTextData()) {\n      this.altTextData = { alt: altText, decorative: false };\n    }\n    return altText;\n  }\n\n  #getBitmap() {\n    if (this.#bitmapId) {\n      this._uiManager.enableWaiting(true);\n      this._uiManager.imageManager\n        .getFromId(this.#bitmapId)\n        .then(data => this.#getBitmapFetched(data, /* fromId = */ true))\n        .finally(() => this.#getBitmapDone());\n      return;\n    }\n\n    if (this.#bitmapUrl) {\n      const url = this.#bitmapUrl;\n      this.#bitmapUrl = null;\n      this._uiManager.enableWaiting(true);\n      this.#bitmapPromise = this._uiManager.imageManager\n        .getFromUrl(url)\n        .then(data => this.#getBitmapFetched(data))\n        .finally(() => this.#getBitmapDone());\n      return;\n    }\n\n    if (this.#bitmapFile) {\n      const file = this.#bitmapFile;\n      this.#bitmapFile = null;\n      this._uiManager.enableWaiting(true);\n      this.#bitmapPromise = this._uiManager.imageManager\n        .getFromFile(file)\n        .then(data => this.#getBitmapFetched(data))\n        .finally(() => this.#getBitmapDone());\n      return;\n    }\n\n    const input = document.createElement(\"input\");\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      input.hidden = true;\n      input.id = \"stampEditorFileInput\";\n      document.body.append(input);\n    }\n    input.type = \"file\";\n    input.accept = StampEditor.supportedTypesStr;\n    const signal = this._uiManager._signal;\n    this.#bitmapPromise = new Promise(resolve => {\n      input.addEventListener(\n        \"change\",\n        async () => {\n          if (!input.files || input.files.length === 0) {\n            this.remove();\n          } else {\n            this._uiManager.enableWaiting(true);\n            const data = await this._uiManager.imageManager.getFromFile(\n              input.files[0]\n            );\n            this._reportTelemetry({\n              action: \"pdfjs.image.image_selected\",\n              data: { alt_text_modal: this._uiManager.useNewAltTextFlow },\n            });\n            this.#getBitmapFetched(data);\n          }\n          if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n            input.remove();\n          }\n          resolve();\n        },\n        { signal }\n      );\n      input.addEventListener(\n        \"cancel\",\n        () => {\n          this.remove();\n          resolve();\n        },\n        { signal }\n      );\n    }).finally(() => this.#getBitmapDone());\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"TESTING\")) {\n      input.click();\n    }\n  }\n\n  /** @inheritdoc */\n  remove() {\n    if (this.#bitmapId) {\n      this.#bitmap = null;\n      this._uiManager.imageManager.deleteId(this.#bitmapId);\n      this.#canvas?.remove();\n      this.#canvas = null;\n      if (this.#resizeTimeoutId) {\n        clearTimeout(this.#resizeTimeoutId);\n        this.#resizeTimeoutId = null;\n      }\n    }\n    super.remove();\n  }\n\n  /** @inheritdoc */\n  rebuild() {\n    if (!this.parent) {\n      // It's possible to have to rebuild an editor which is not on a visible\n      // page.\n      if (this.#bitmapId) {\n        this.#getBitmap();\n      }\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n\n    if (this.#bitmapId && this.#canvas === null) {\n      this.#getBitmap();\n    }\n\n    if (!this.isAttachedToDOM) {\n      // At some point this editor was removed and we're rebuilting it,\n      // hence we must add it to its parent.\n      this.parent.add(this);\n    }\n  }\n\n  /** @inheritdoc */\n  onceAdded(focus) {\n    this._isDraggable = true;\n    if (focus) {\n      this.div.focus();\n    }\n  }\n\n  /** @inheritdoc */\n  isEmpty() {\n    return !(\n      this.#bitmapPromise ||\n      this.#bitmap ||\n      this.#bitmapUrl ||\n      this.#bitmapFile ||\n      this.#bitmapId\n    );\n  }\n\n  /** @inheritdoc */\n  get isResizable() {\n    return true;\n  }\n\n  /** @inheritdoc */\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n\n    let baseX, baseY;\n    if (this.width) {\n      baseX = this.x;\n      baseY = this.y;\n    }\n\n    super.render();\n    this.div.hidden = true;\n    this.div.setAttribute(\"role\", \"figure\");\n\n    this.addAltTextButton();\n\n    if (this.#bitmap) {\n      this.#createCanvas();\n    } else {\n      this.#getBitmap();\n    }\n\n    if (this.width && !this.annotationElementId) {\n      // This editor was created in using copy (ctrl+c).\n      const [parentWidth, parentHeight] = this.parentDimensions;\n      this.setAt(\n        baseX * parentWidth,\n        baseY * parentHeight,\n        this.width * parentWidth,\n        this.height * parentHeight\n      );\n    }\n\n    this._uiManager.addShouldRescale(this);\n\n    return this.div;\n  }\n\n  /** @inheritdoc */\n  _onResized() {\n    // We used a CSS-zoom during the resizing, but now it's resized we can\n    // rescale correctly the bitmap to fit the new dimensions.\n    this.onScaleChanging();\n  }\n\n  onScaleChanging() {\n    if (!this.parent) {\n      return;\n    }\n    if (this.#resizeTimeoutId !== null) {\n      clearTimeout(this.#resizeTimeoutId);\n    }\n    // The user's zooming the page, there is no need to redraw the bitmap at\n    // each step, hence we wait a bit before redrawing it.\n    const TIME_TO_WAIT = 200;\n    this.#resizeTimeoutId = setTimeout(() => {\n      this.#resizeTimeoutId = null;\n      this.#drawBitmap();\n    }, TIME_TO_WAIT);\n  }\n\n  #createCanvas() {\n    const { div } = this;\n    let { width, height } = this.#bitmap;\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    const MAX_RATIO = 0.75;\n    if (this.width) {\n      width = this.width * pageWidth;\n      height = this.height * pageHeight;\n    } else if (\n      width > MAX_RATIO * pageWidth ||\n      height > MAX_RATIO * pageHeight\n    ) {\n      // If the the image is too big compared to the page dimensions\n      // (more than MAX_RATIO) then we scale it down.\n      const factor = Math.min(\n        (MAX_RATIO * pageWidth) / width,\n        (MAX_RATIO * pageHeight) / height\n      );\n      width *= factor;\n      height *= factor;\n    }\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    this.setDims(\n      (width * parentWidth) / pageWidth,\n      (height * parentHeight) / pageHeight\n    );\n\n    this._uiManager.enableWaiting(false);\n    const canvas = (this.#canvas = document.createElement(\"canvas\"));\n    canvas.setAttribute(\"role\", \"img\");\n    this.addContainer(canvas);\n\n    this.width = width / pageWidth;\n    this.height = height / pageHeight;\n    if (this._initialOptions?.isCentered) {\n      this.center();\n    } else {\n      this.fixAndSetPosition();\n    }\n    this._initialOptions = null;\n\n    if (\n      !this._uiManager.useNewAltTextWhenAddingImage ||\n      !this._uiManager.useNewAltTextFlow ||\n      this.annotationElementId\n    ) {\n      div.hidden = false;\n    }\n    this.#drawBitmap();\n    if (!this.#hasBeenAddedInUndoStack) {\n      this.parent.addUndoableEditor(this);\n      this.#hasBeenAddedInUndoStack = true;\n    }\n\n    // There are multiple ways to add an image to the page, so here we just\n    // count the number of times an image is added to the page whatever the way\n    // is.\n    this._reportTelemetry({\n      action: \"inserted_image\",\n    });\n    if (this.#bitmapFileName) {\n      canvas.setAttribute(\"aria-label\", this.#bitmapFileName);\n    }\n  }\n\n  copyCanvas(maxDataDimension, maxPreviewDimension, createImageData = false) {\n    if (!maxDataDimension) {\n      // TODO: get this value from Firefox\n      //   (https://bugzilla.mozilla.org/show_bug.cgi?id=1908184)\n      // It's the maximum dimension that the AI can handle.\n      maxDataDimension = 224;\n    }\n\n    const { width: bitmapWidth, height: bitmapHeight } = this.#bitmap;\n    const outputScale = new OutputScale();\n\n    let bitmap = this.#bitmap;\n    let width = bitmapWidth,\n      height = bitmapHeight;\n    let canvas = null;\n\n    if (maxPreviewDimension) {\n      if (\n        bitmapWidth > maxPreviewDimension ||\n        bitmapHeight > maxPreviewDimension\n      ) {\n        const ratio = Math.min(\n          maxPreviewDimension / bitmapWidth,\n          maxPreviewDimension / bitmapHeight\n        );\n        width = Math.floor(bitmapWidth * ratio);\n        height = Math.floor(bitmapHeight * ratio);\n      }\n\n      canvas = document.createElement(\"canvas\");\n      const scaledWidth = (canvas.width = Math.ceil(width * outputScale.sx));\n      const scaledHeight = (canvas.height = Math.ceil(height * outputScale.sy));\n\n      if (!this.#isSvg) {\n        bitmap = this.#scaleBitmap(scaledWidth, scaledHeight);\n      }\n\n      const ctx = canvas.getContext(\"2d\");\n      ctx.filter = this._uiManager.hcmFilter;\n\n      // Add a checkerboard pattern as a background in case the image has some\n      // transparency.\n      let white = \"white\",\n        black = \"#cfcfd8\";\n      if (this._uiManager.hcmFilter !== \"none\") {\n        black = \"black\";\n      } else if (window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches) {\n        white = \"#8f8f9d\";\n        black = \"#42414d\";\n      }\n      const boxDim = 15;\n      const boxDimWidth = boxDim * outputScale.sx;\n      const boxDimHeight = boxDim * outputScale.sy;\n      const pattern = new OffscreenCanvas(boxDimWidth * 2, boxDimHeight * 2);\n      const patternCtx = pattern.getContext(\"2d\");\n      patternCtx.fillStyle = white;\n      patternCtx.fillRect(0, 0, boxDimWidth * 2, boxDimHeight * 2);\n      patternCtx.fillStyle = black;\n      patternCtx.fillRect(0, 0, boxDimWidth, boxDimHeight);\n      patternCtx.fillRect(boxDimWidth, boxDimHeight, boxDimWidth, boxDimHeight);\n      ctx.fillStyle = ctx.createPattern(pattern, \"repeat\");\n      ctx.fillRect(0, 0, scaledWidth, scaledHeight);\n      ctx.drawImage(\n        bitmap,\n        0,\n        0,\n        bitmap.width,\n        bitmap.height,\n        0,\n        0,\n        scaledWidth,\n        scaledHeight\n      );\n    }\n\n    let imageData = null;\n    if (createImageData) {\n      let dataWidth, dataHeight;\n      if (\n        outputScale.symmetric &&\n        bitmap.width < maxDataDimension &&\n        bitmap.height < maxDataDimension\n      ) {\n        dataWidth = bitmap.width;\n        dataHeight = bitmap.height;\n      } else {\n        bitmap = this.#bitmap;\n        if (bitmapWidth > maxDataDimension || bitmapHeight > maxDataDimension) {\n          const ratio = Math.min(\n            maxDataDimension / bitmapWidth,\n            maxDataDimension / bitmapHeight\n          );\n          dataWidth = Math.floor(bitmapWidth * ratio);\n          dataHeight = Math.floor(bitmapHeight * ratio);\n\n          if (!this.#isSvg) {\n            bitmap = this.#scaleBitmap(dataWidth, dataHeight);\n          }\n        }\n      }\n\n      const offscreen = new OffscreenCanvas(dataWidth, dataHeight);\n      const offscreenCtx = offscreen.getContext(\"2d\", {\n        willReadFrequently: true,\n      });\n      offscreenCtx.drawImage(\n        bitmap,\n        0,\n        0,\n        bitmap.width,\n        bitmap.height,\n        0,\n        0,\n        dataWidth,\n        dataHeight\n      );\n      imageData = {\n        width: dataWidth,\n        height: dataHeight,\n        data: offscreenCtx.getImageData(0, 0, dataWidth, dataHeight).data,\n      };\n    }\n\n    return { canvas, width, height, imageData };\n  }\n\n  #scaleBitmap(width, height) {\n    const { width: bitmapWidth, height: bitmapHeight } = this.#bitmap;\n\n    let newWidth = bitmapWidth;\n    let newHeight = bitmapHeight;\n    let bitmap = this.#bitmap;\n    while (newWidth > 2 * width || newHeight > 2 * height) {\n      const prevWidth = newWidth;\n      const prevHeight = newHeight;\n\n      if (newWidth > 2 * width) {\n        // See bug 1820511 (Windows specific bug).\n        // TODO: once the above bug is fixed we could revert to:\n        // newWidth = Math.ceil(newWidth / 2);\n        newWidth =\n          newWidth >= 16384\n            ? Math.floor(newWidth / 2) - 1\n            : Math.ceil(newWidth / 2);\n      }\n      if (newHeight > 2 * height) {\n        newHeight =\n          newHeight >= 16384\n            ? Math.floor(newHeight / 2) - 1\n            : Math.ceil(newHeight / 2);\n      }\n\n      const offscreen = new OffscreenCanvas(newWidth, newHeight);\n      const ctx = offscreen.getContext(\"2d\");\n      ctx.drawImage(\n        bitmap,\n        0,\n        0,\n        prevWidth,\n        prevHeight,\n        0,\n        0,\n        newWidth,\n        newHeight\n      );\n      bitmap = offscreen.transferToImageBitmap();\n    }\n\n    return bitmap;\n  }\n\n  #drawBitmap() {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const { width, height } = this;\n    const outputScale = new OutputScale();\n    const scaledWidth = Math.ceil(width * parentWidth * outputScale.sx);\n    const scaledHeight = Math.ceil(height * parentHeight * outputScale.sy);\n    const canvas = this.#canvas;\n\n    if (\n      !canvas ||\n      (canvas.width === scaledWidth && canvas.height === scaledHeight)\n    ) {\n      return;\n    }\n\n    canvas.width = scaledWidth;\n    canvas.height = scaledHeight;\n\n    const bitmap = this.#isSvg\n      ? this.#bitmap\n      : this.#scaleBitmap(scaledWidth, scaledHeight);\n\n    const ctx = canvas.getContext(\"2d\");\n    ctx.filter = this._uiManager.hcmFilter;\n    ctx.drawImage(\n      bitmap,\n      0,\n      0,\n      bitmap.width,\n      bitmap.height,\n      0,\n      0,\n      scaledWidth,\n      scaledHeight\n    );\n  }\n\n  /** @inheritdoc */\n  getImageForAltText() {\n    return this.#canvas;\n  }\n\n  #serializeBitmap(toUrl) {\n    if (toUrl) {\n      if (this.#isSvg) {\n        const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId);\n        if (url) {\n          return url;\n        }\n      }\n      // We convert to a data url because it's sync and the url can live in the\n      // clipboard.\n      const canvas = document.createElement(\"canvas\");\n      ({ width: canvas.width, height: canvas.height } = this.#bitmap);\n      const ctx = canvas.getContext(\"2d\");\n      ctx.drawImage(this.#bitmap, 0, 0);\n\n      return canvas.toDataURL();\n    }\n\n    if (this.#isSvg) {\n      const [pageWidth, pageHeight] = this.pageDimensions;\n      // Multiply by PixelsPerInch.PDF_TO_CSS_UNITS in order to increase the\n      // image resolution when rasterizing it.\n      const width = Math.round(\n        this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS\n      );\n      const height = Math.round(\n        this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS\n      );\n      const offscreen = new OffscreenCanvas(width, height);\n      const ctx = offscreen.getContext(\"2d\");\n      ctx.drawImage(\n        this.#bitmap,\n        0,\n        0,\n        this.#bitmap.width,\n        this.#bitmap.height,\n        0,\n        0,\n        width,\n        height\n      );\n      return offscreen.transferToImageBitmap();\n    }\n\n    return structuredClone(this.#bitmap);\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    if (data instanceof StampAnnotationElement) {\n      const {\n        data: { rect, rotation, id, structParent, popupRef },\n        container,\n        parent: {\n          page: { pageNumber },\n        },\n      } = data;\n      const canvas = container.querySelector(\"canvas\");\n      const imageData = uiManager.imageManager.getFromCanvas(\n        container.id,\n        canvas\n      );\n      canvas.remove();\n\n      // When switching to edit mode, we wait for the structure tree to be\n      // ready (see pdf_viewer.js), so it's fine to use getAriaAttributesSync.\n      const altText =\n        (\n          await parent._structTree.getAriaAttributes(`${AnnotationPrefix}${id}`)\n        )?.get(\"aria-label\") || \"\";\n\n      initialData = data = {\n        annotationType: AnnotationEditorType.STAMP,\n        bitmapId: imageData.id,\n        bitmap: imageData.bitmap,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        id,\n        deleted: false,\n        accessibilityData: {\n          decorative: false,\n          altText,\n        },\n        isSvg: false,\n        structParent,\n        popupRef,\n      };\n    }\n    const editor = await super.deserialize(data, parent, uiManager);\n    const { rect, bitmap, bitmapUrl, bitmapId, isSvg, accessibilityData } =\n      data;\n    if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) {\n      editor.#bitmapId = bitmapId;\n      if (bitmap) {\n        editor.#bitmap = bitmap;\n      }\n    } else {\n      editor.#bitmapUrl = bitmapUrl;\n    }\n    editor.#isSvg = isSvg;\n\n    const [parentWidth, parentHeight] = editor.pageDimensions;\n    editor.width = (rect[2] - rect[0]) / parentWidth;\n    editor.height = (rect[3] - rect[1]) / parentHeight;\n\n    editor.annotationElementId = data.id || null;\n    if (accessibilityData) {\n      editor.altTextData = accessibilityData;\n    }\n    editor._initialData = initialData;\n    // No need to be add in the undo stack if the editor is created from an\n    // existing one.\n    editor.#hasBeenAddedInUndoStack = !!initialData;\n\n    return editor;\n  }\n\n  /** @inheritdoc */\n  serialize(isForCopying = false, context = null) {\n    if (this.isEmpty()) {\n      return null;\n    }\n\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n\n    const serialized = {\n      annotationType: AnnotationEditorType.STAMP,\n      bitmapId: this.#bitmapId,\n      pageIndex: this.pageIndex,\n      rect: this.getRect(0, 0),\n      rotation: this.rotation,\n      isSvg: this.#isSvg,\n      structTreeParentId: this._structTreeParentId,\n    };\n\n    if (isForCopying) {\n      // We don't know what's the final destination (this pdf or another one)\n      // of this annotation and the clipboard doesn't support ImageBitmaps,\n      // hence we serialize the bitmap to a data url.\n      serialized.bitmapUrl = this.#serializeBitmap(/* toUrl = */ true);\n      serialized.accessibilityData = this.serializeAltText(true);\n      return serialized;\n    }\n\n    const { decorative, altText } = this.serializeAltText(false);\n    if (!decorative && altText) {\n      serialized.accessibilityData = { type: \"Figure\", alt: altText };\n    }\n    if (this.annotationElementId) {\n      const changes = this.#hasElementChanged(serialized);\n      if (changes.isSame) {\n        // Nothing has been changed.\n        return null;\n      }\n      if (changes.isSameAltText) {\n        delete serialized.accessibilityData;\n      } else {\n        serialized.accessibilityData.structParent =\n          this._initialData.structParent ?? -1;\n      }\n    }\n    serialized.id = this.annotationElementId;\n\n    if (context === null) {\n      return serialized;\n    }\n\n    context.stamps ||= new Map();\n    const area = this.#isSvg\n      ? (serialized.rect[2] - serialized.rect[0]) *\n        (serialized.rect[3] - serialized.rect[1])\n      : null;\n    if (!context.stamps.has(this.#bitmapId)) {\n      // We don't want to have multiple copies of the same bitmap in the\n      // annotationMap, hence we only add the bitmap the first time we meet it.\n      context.stamps.set(this.#bitmapId, { area, serialized });\n      serialized.bitmap = this.#serializeBitmap(/* toUrl = */ false);\n    } else if (this.#isSvg) {\n      // If we have multiple copies of the same svg but with different sizes,\n      // then we want to keep the biggest one.\n      const prevData = context.stamps.get(this.#bitmapId);\n      if (area > prevData.area) {\n        prevData.area = area;\n        prevData.serialized.bitmap.close();\n        prevData.serialized.bitmap = this.#serializeBitmap(/* toUrl = */ false);\n      }\n    }\n    return serialized;\n  }\n\n  #hasElementChanged(serialized) {\n    const {\n      pageIndex,\n      accessibilityData: { altText },\n    } = this._initialData;\n\n    const isSamePageIndex = serialized.pageIndex === pageIndex;\n    const isSameAltText = (serialized.accessibilityData?.alt || \"\") === altText;\n\n    return {\n      isSame:\n        !this._hasBeenMoved &&\n        !this._hasBeenResized &&\n        isSamePageIndex &&\n        isSameAltText,\n      isSameAltText,\n    };\n  }\n\n  /** @inheritdoc */\n  renderAnnotationElement(annotation) {\n    annotation.updateEdited({\n      rect: this.getRect(0, 0),\n    });\n\n    return null;\n  }\n}\n\nexport { StampEditor };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./tools.js\").AnnotationEditorUIManager} AnnotationEditorUIManager */\n/** @typedef {import(\"../display_utils.js\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../../web/text_accessibility.js\").TextAccessibilityManager} TextAccessibilityManager */\n/** @typedef {import(\"../../../web/interfaces\").IL10n} IL10n */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../annotation_layer.js\").AnnotationLayer} AnnotationLayer */\n/** @typedef {import(\"../draw_layer.js\").DrawLayer} DrawLayer */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/struct_tree_layer_builder.js\").StructTreeLayerBuilder} StructTreeLayerBuilder */\n\nimport { AnnotationEditorType, FeatureTest } from \"../../shared/util.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { FreeTextEditor } from \"./freetext.js\";\nimport { HighlightEditor } from \"./highlight.js\";\nimport { InkEditor } from \"./ink.js\";\nimport { setLayerDimensions } from \"../display_utils.js\";\nimport { StampEditor } from \"./stamp.js\";\n\n/**\n * @typedef {Object} AnnotationEditorLayerOptions\n * @property {Object} mode\n * @property {HTMLDivElement} div\n * @property {StructTreeLayerBuilder} structTreeLayer\n * @property {AnnotationEditorUIManager} uiManager\n * @property {boolean} enabled\n * @property {TextAccessibilityManager} [accessibilityManager]\n * @property {number} pageIndex\n * @property {IL10n} l10n\n * @property {AnnotationLayer} [annotationLayer]\n * @property {HTMLDivElement} [textLayer]\n * @property {DrawLayer} drawLayer\n * @property {PageViewport} viewport\n */\n\n/**\n * @typedef {Object} RenderEditorLayerOptions\n * @property {PageViewport} viewport\n */\n\n/**\n * Manage all the different editors on a page.\n */\nclass AnnotationEditorLayer {\n  #accessibilityManager;\n\n  #allowClick = false;\n\n  #annotationLayer = null;\n\n  #clickAC = null;\n\n  #editorFocusTimeoutId = null;\n\n  #editors = new Map();\n\n  #hadPointerDown = false;\n\n  #isDisabling = false;\n\n  #isEnabling = false;\n\n  #drawingAC = null;\n\n  #focusedElement = null;\n\n  #textLayer = null;\n\n  #textSelectionAC = null;\n\n  #uiManager;\n\n  static _initialized = false;\n\n  static #editorTypes = new Map(\n    [FreeTextEditor, InkEditor, StampEditor, HighlightEditor].map(type => [\n      type._editorType,\n      type,\n    ])\n  );\n\n  /**\n   * @param {AnnotationEditorLayerOptions} options\n   */\n  constructor({\n    uiManager,\n    pageIndex,\n    div,\n    structTreeLayer,\n    accessibilityManager,\n    annotationLayer,\n    drawLayer,\n    textLayer,\n    viewport,\n    l10n,\n  }) {\n    const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()];\n    if (!AnnotationEditorLayer._initialized) {\n      AnnotationEditorLayer._initialized = true;\n      for (const editorType of editorTypes) {\n        editorType.initialize(l10n, uiManager);\n      }\n    }\n    uiManager.registerEditorTypes(editorTypes);\n\n    this.#uiManager = uiManager;\n    this.pageIndex = pageIndex;\n    this.div = div;\n    this.#accessibilityManager = accessibilityManager;\n    this.#annotationLayer = annotationLayer;\n    this.viewport = viewport;\n    this.#textLayer = textLayer;\n    this.drawLayer = drawLayer;\n    this._structTree = structTreeLayer;\n\n    this.#uiManager.addLayer(this);\n  }\n\n  get isEmpty() {\n    return this.#editors.size === 0;\n  }\n\n  get isInvisible() {\n    return (\n      this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE\n    );\n  }\n\n  /**\n   * Update the toolbar if it's required to reflect the tool currently used.\n   * @param {number} mode\n   */\n  updateToolbar(mode) {\n    this.#uiManager.updateToolbar(mode);\n  }\n\n  /**\n   * The mode has changed: it must be updated.\n   * @param {number} mode\n   */\n  updateMode(mode = this.#uiManager.getMode()) {\n    this.#cleanup();\n    switch (mode) {\n      case AnnotationEditorType.NONE:\n        this.disableTextSelection();\n        this.togglePointerEvents(false);\n        this.toggleAnnotationLayerPointerEvents(true);\n        this.disableClick();\n        return;\n      case AnnotationEditorType.INK:\n        this.disableTextSelection();\n        this.togglePointerEvents(true);\n        this.enableClick();\n        break;\n      case AnnotationEditorType.HIGHLIGHT:\n        this.enableTextSelection();\n        this.togglePointerEvents(false);\n        this.disableClick();\n        break;\n      default:\n        this.disableTextSelection();\n        this.togglePointerEvents(true);\n        this.enableClick();\n    }\n\n    this.toggleAnnotationLayerPointerEvents(false);\n    const { classList } = this.div;\n    for (const editorType of AnnotationEditorLayer.#editorTypes.values()) {\n      classList.toggle(\n        `${editorType._type}Editing`,\n        mode === editorType._editorType\n      );\n    }\n    this.div.hidden = false;\n  }\n\n  hasTextLayer(textLayer) {\n    return textLayer === this.#textLayer?.div;\n  }\n\n  /**\n   * Set the editing state.\n   * @param {boolean} isEditing\n   */\n  setEditingState(isEditing) {\n    this.#uiManager.setEditingState(isEditing);\n  }\n\n  /**\n   * Add some commands into the CommandManager (undo/redo stuff).\n   * @param {Object} params\n   */\n  addCommands(params) {\n    this.#uiManager.addCommands(params);\n  }\n\n  cleanUndoStack(type) {\n    this.#uiManager.cleanUndoStack(type);\n  }\n\n  toggleDrawing(enabled = false) {\n    this.div.classList.toggle(\"drawing\", !enabled);\n  }\n\n  togglePointerEvents(enabled = false) {\n    this.div.classList.toggle(\"disabled\", !enabled);\n  }\n\n  toggleAnnotationLayerPointerEvents(enabled = false) {\n    this.#annotationLayer?.div.classList.toggle(\"disabled\", !enabled);\n  }\n\n  /**\n   * Enable pointer events on the main div in order to enable\n   * editor creation.\n   */\n  async enable() {\n    this.#isEnabling = true;\n    this.div.tabIndex = 0;\n    this.togglePointerEvents(true);\n    const annotationElementIds = new Set();\n    for (const editor of this.#editors.values()) {\n      editor.enableEditing();\n      editor.show(true);\n      if (editor.annotationElementId) {\n        this.#uiManager.removeChangedExistingAnnotation(editor);\n        annotationElementIds.add(editor.annotationElementId);\n      }\n    }\n\n    if (!this.#annotationLayer) {\n      this.#isEnabling = false;\n      return;\n    }\n\n    const editables = this.#annotationLayer.getEditableAnnotations();\n    for (const editable of editables) {\n      // The element must be hidden whatever its state is.\n      editable.hide();\n      if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) {\n        continue;\n      }\n      if (annotationElementIds.has(editable.data.id)) {\n        continue;\n      }\n      const editor = await this.deserialize(editable);\n      if (!editor) {\n        continue;\n      }\n      this.addOrRebuild(editor);\n      editor.enableEditing();\n    }\n    this.#isEnabling = false;\n  }\n\n  /**\n   * Disable editor creation.\n   */\n  disable() {\n    this.#isDisabling = true;\n    this.div.tabIndex = -1;\n    this.togglePointerEvents(false);\n    const changedAnnotations = new Map();\n    const resetAnnotations = new Map();\n    for (const editor of this.#editors.values()) {\n      editor.disableEditing();\n      if (!editor.annotationElementId) {\n        continue;\n      }\n      if (editor.serialize() !== null) {\n        changedAnnotations.set(editor.annotationElementId, editor);\n        continue;\n      } else {\n        resetAnnotations.set(editor.annotationElementId, editor);\n      }\n      this.getEditableAnnotation(editor.annotationElementId)?.show();\n      editor.remove();\n    }\n\n    if (this.#annotationLayer) {\n      // Show the annotations that were hidden in enable().\n      const editables = this.#annotationLayer.getEditableAnnotations();\n      for (const editable of editables) {\n        const { id } = editable.data;\n        if (this.#uiManager.isDeletedAnnotationElement(id)) {\n          continue;\n        }\n        let editor = resetAnnotations.get(id);\n        if (editor) {\n          editor.resetAnnotationElement(editable);\n          editor.show(false);\n          editable.show();\n          continue;\n        }\n\n        editor = changedAnnotations.get(id);\n        if (editor) {\n          this.#uiManager.addChangedExistingAnnotation(editor);\n          if (editor.renderAnnotationElement(editable)) {\n            // Content has changed, so we need to hide the editor.\n            editor.show(false);\n          }\n        }\n        editable.show();\n      }\n    }\n\n    this.#cleanup();\n    if (this.isEmpty) {\n      this.div.hidden = true;\n    }\n    const { classList } = this.div;\n    for (const editorType of AnnotationEditorLayer.#editorTypes.values()) {\n      classList.remove(`${editorType._type}Editing`);\n    }\n    this.disableTextSelection();\n    this.toggleAnnotationLayerPointerEvents(true);\n\n    this.#isDisabling = false;\n  }\n\n  getEditableAnnotation(id) {\n    return this.#annotationLayer?.getEditableAnnotation(id) || null;\n  }\n\n  /**\n   * Set the current editor.\n   * @param {AnnotationEditor} editor\n   */\n  setActiveEditor(editor) {\n    const currentActive = this.#uiManager.getActive();\n    if (currentActive === editor) {\n      return;\n    }\n\n    this.#uiManager.setActiveEditor(editor);\n  }\n\n  enableTextSelection() {\n    this.div.tabIndex = -1;\n    if (this.#textLayer?.div && !this.#textSelectionAC) {\n      this.#textSelectionAC = new AbortController();\n      const signal = this.#uiManager.combinedSignal(this.#textSelectionAC);\n\n      this.#textLayer.div.addEventListener(\n        \"pointerdown\",\n        this.#textLayerPointerDown.bind(this),\n        { signal }\n      );\n      this.#textLayer.div.classList.add(\"highlighting\");\n    }\n  }\n\n  disableTextSelection() {\n    this.div.tabIndex = 0;\n    if (this.#textLayer?.div && this.#textSelectionAC) {\n      this.#textSelectionAC.abort();\n      this.#textSelectionAC = null;\n\n      this.#textLayer.div.classList.remove(\"highlighting\");\n    }\n  }\n\n  #textLayerPointerDown(event) {\n    // Unselect all the editors in order to let the user select some text\n    // without being annoyed by an editor toolbar.\n    this.#uiManager.unselectAll();\n    const { target } = event;\n    if (\n      target === this.#textLayer.div ||\n      ((target.getAttribute(\"role\") === \"img\" ||\n        target.classList.contains(\"endOfContent\")) &&\n        this.#textLayer.div.contains(target))\n    ) {\n      const { isMac } = FeatureTest.platform;\n      if (event.button !== 0 || (event.ctrlKey && isMac)) {\n        // Do nothing on right click.\n        return;\n      }\n      this.#uiManager.showAllEditors(\n        \"highlight\",\n        true,\n        /* updateButton = */ true\n      );\n      this.#textLayer.div.classList.add(\"free\");\n      this.toggleDrawing();\n      HighlightEditor.startHighlighting(\n        this,\n        this.#uiManager.direction === \"ltr\",\n        { target: this.#textLayer.div, x: event.x, y: event.y }\n      );\n      this.#textLayer.div.addEventListener(\n        \"pointerup\",\n        () => {\n          this.#textLayer.div.classList.remove(\"free\");\n          this.toggleDrawing(true);\n        },\n        { once: true, signal: this.#uiManager._signal }\n      );\n      event.preventDefault();\n    }\n  }\n\n  enableClick() {\n    if (this.#clickAC) {\n      return;\n    }\n    this.#clickAC = new AbortController();\n    const signal = this.#uiManager.combinedSignal(this.#clickAC);\n\n    this.div.addEventListener(\"pointerdown\", this.pointerdown.bind(this), {\n      signal,\n    });\n    const pointerup = this.pointerup.bind(this);\n    this.div.addEventListener(\"pointerup\", pointerup, { signal });\n    this.div.addEventListener(\"pointercancel\", pointerup, { signal });\n  }\n\n  disableClick() {\n    this.#clickAC?.abort();\n    this.#clickAC = null;\n  }\n\n  attach(editor) {\n    this.#editors.set(editor.id, editor);\n    const { annotationElementId } = editor;\n    if (\n      annotationElementId &&\n      this.#uiManager.isDeletedAnnotationElement(annotationElementId)\n    ) {\n      this.#uiManager.removeDeletedAnnotationElement(editor);\n    }\n  }\n\n  detach(editor) {\n    this.#editors.delete(editor.id);\n    this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);\n\n    if (!this.#isDisabling && editor.annotationElementId) {\n      this.#uiManager.addDeletedAnnotationElement(editor);\n    }\n  }\n\n  /**\n   * Remove an editor.\n   * @param {AnnotationEditor} editor\n   */\n  remove(editor) {\n    this.detach(editor);\n    this.#uiManager.removeEditor(editor);\n    editor.div.remove();\n    editor.isAttachedToDOM = false;\n  }\n\n  /**\n   * An editor can have a different parent, for example after having\n   * being dragged and droped from a page to another.\n   * @param {AnnotationEditor} editor\n   */\n  changeParent(editor) {\n    if (editor.parent === this) {\n      return;\n    }\n\n    if (editor.parent && editor.annotationElementId) {\n      this.#uiManager.addDeletedAnnotationElement(editor.annotationElementId);\n      AnnotationEditor.deleteAnnotationElement(editor);\n      editor.annotationElementId = null;\n    }\n\n    this.attach(editor);\n    editor.parent?.detach(editor);\n    editor.setParent(this);\n    if (editor.div && editor.isAttachedToDOM) {\n      editor.div.remove();\n      this.div.append(editor.div);\n    }\n  }\n\n  /**\n   * Add a new editor in the current view.\n   * @param {AnnotationEditor} editor\n   */\n  add(editor) {\n    if (editor.parent === this && editor.isAttachedToDOM) {\n      return;\n    }\n    this.changeParent(editor);\n    this.#uiManager.addEditor(editor);\n    this.attach(editor);\n\n    if (!editor.isAttachedToDOM) {\n      const div = editor.render();\n      this.div.append(div);\n      editor.isAttachedToDOM = true;\n    }\n\n    // The editor will be correctly moved into the DOM (see fixAndSetPosition).\n    editor.fixAndSetPosition();\n    editor.onceAdded(/* focus = */ !this.#isEnabling);\n    this.#uiManager.addToAnnotationStorage(editor);\n    editor._reportTelemetry(editor.telemetryInitialData);\n  }\n\n  moveEditorInDOM(editor) {\n    if (!editor.isAttachedToDOM) {\n      return;\n    }\n\n    const { activeElement } = document;\n    if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) {\n      // When the div is moved in the DOM the focus can move somewhere else,\n      // so we want to be sure that the focus will stay on the editor but we\n      // don't want to call any focus callbacks, hence we disable them and only\n      // re-enable them when the editor has the focus.\n      editor._focusEventsAllowed = false;\n      this.#editorFocusTimeoutId = setTimeout(() => {\n        this.#editorFocusTimeoutId = null;\n        if (!editor.div.contains(document.activeElement)) {\n          editor.div.addEventListener(\n            \"focusin\",\n            () => {\n              editor._focusEventsAllowed = true;\n            },\n            { once: true, signal: this.#uiManager._signal }\n          );\n          activeElement.focus();\n        } else {\n          editor._focusEventsAllowed = true;\n        }\n      }, 0);\n    }\n\n    editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(\n      this.div,\n      editor.div,\n      editor.contentDiv,\n      /* isRemovable = */ true\n    );\n  }\n\n  /**\n   * Add or rebuild depending if it has been removed or not.\n   * @param {AnnotationEditor} editor\n   */\n  addOrRebuild(editor) {\n    if (editor.needsToBeRebuilt()) {\n      editor.parent ||= this;\n      editor.rebuild();\n      editor.show();\n    } else {\n      this.add(editor);\n    }\n  }\n\n  /**\n   * Add a new editor and make this addition undoable.\n   * @param {AnnotationEditor} editor\n   */\n  addUndoableEditor(editor) {\n    const cmd = () => editor._uiManager.rebuild(editor);\n    const undo = () => {\n      editor.remove();\n    };\n\n    this.addCommands({ cmd, undo, mustExec: false });\n  }\n\n  /**\n   * Get an id for an editor.\n   * @returns {string}\n   */\n  getNextId() {\n    return this.#uiManager.getId();\n  }\n\n  get #currentEditorType() {\n    return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode());\n  }\n\n  combinedSignal(ac) {\n    return this.#uiManager.combinedSignal(ac);\n  }\n\n  /**\n   * Create a new editor\n   * @param {Object} params\n   * @returns {AnnotationEditor}\n   */\n  #createNewEditor(params) {\n    const editorType = this.#currentEditorType;\n    return editorType ? new editorType.prototype.constructor(params) : null;\n  }\n\n  canCreateNewEmptyEditor() {\n    return this.#currentEditorType?.canCreateNewEmptyEditor();\n  }\n\n  /**\n   * Paste some content into a new editor.\n   * @param {number} mode\n   * @param {Object} params\n   */\n  pasteEditor(mode, params) {\n    this.#uiManager.updateToolbar(mode);\n    this.#uiManager.updateMode(mode);\n\n    const { offsetX, offsetY } = this.#getCenterPoint();\n    const id = this.getNextId();\n    const editor = this.#createNewEditor({\n      parent: this,\n      id,\n      x: offsetX,\n      y: offsetY,\n      uiManager: this.#uiManager,\n      isCentered: true,\n      ...params,\n    });\n    if (editor) {\n      this.add(editor);\n    }\n  }\n\n  /**\n   * Create a new editor\n   * @param {Object} data\n   * @returns {AnnotationEditor | null}\n   */\n  async deserialize(data) {\n    return (\n      (await AnnotationEditorLayer.#editorTypes\n        .get(data.annotationType ?? data.annotationEditorType)\n        ?.deserialize(data, this, this.#uiManager)) || null\n    );\n  }\n\n  /**\n   * Create and add a new editor.\n   * @param {PointerEvent} event\n   * @param {boolean} isCentered\n   * @param [Object] data\n   * @returns {AnnotationEditor}\n   */\n  createAndAddNewEditor(event, isCentered, data = {}) {\n    const id = this.getNextId();\n    const editor = this.#createNewEditor({\n      parent: this,\n      id,\n      x: event.offsetX,\n      y: event.offsetY,\n      uiManager: this.#uiManager,\n      isCentered,\n      ...data,\n    });\n    if (editor) {\n      this.add(editor);\n    }\n\n    return editor;\n  }\n\n  #getCenterPoint() {\n    const { x, y, width, height } = this.div.getBoundingClientRect();\n    const tlX = Math.max(0, x);\n    const tlY = Math.max(0, y);\n    const brX = Math.min(window.innerWidth, x + width);\n    const brY = Math.min(window.innerHeight, y + height);\n    const centerX = (tlX + brX) / 2 - x;\n    const centerY = (tlY + brY) / 2 - y;\n    const [offsetX, offsetY] =\n      this.viewport.rotation % 180 === 0\n        ? [centerX, centerY]\n        : [centerY, centerX];\n\n    return { offsetX, offsetY };\n  }\n\n  /**\n   * Create and add a new editor.\n   */\n  addNewEditor() {\n    this.createAndAddNewEditor(this.#getCenterPoint(), /* isCentered = */ true);\n  }\n\n  /**\n   * Set the last selected editor.\n   * @param {AnnotationEditor} editor\n   */\n  setSelected(editor) {\n    this.#uiManager.setSelected(editor);\n  }\n\n  /**\n   * Add or remove an editor the current selection.\n   * @param {AnnotationEditor} editor\n   */\n  toggleSelected(editor) {\n    this.#uiManager.toggleSelected(editor);\n  }\n\n  /**\n   * Unselect an editor.\n   * @param {AnnotationEditor} editor\n   */\n  unselect(editor) {\n    this.#uiManager.unselect(editor);\n  }\n\n  /**\n   * Pointerup callback.\n   * @param {PointerEvent} event\n   */\n  pointerup(event) {\n    const { isMac } = FeatureTest.platform;\n    if (event.button !== 0 || (event.ctrlKey && isMac)) {\n      // Don't create an editor on right click.\n      return;\n    }\n\n    if (event.target !== this.div) {\n      return;\n    }\n\n    if (!this.#hadPointerDown) {\n      // It can happen when the user starts a drag inside a text editor\n      // and then releases the mouse button outside of it. In such a case\n      // we don't want to create a new editor, hence we check that a pointerdown\n      // occurred on this div previously.\n      return;\n    }\n    this.#hadPointerDown = false;\n\n    if (\n      this.#currentEditorType?.isDrawer &&\n      this.#currentEditorType.supportMultipleDrawings\n    ) {\n      return;\n    }\n\n    if (!this.#allowClick) {\n      this.#allowClick = true;\n      return;\n    }\n\n    if (this.#uiManager.getMode() === AnnotationEditorType.STAMP) {\n      this.#uiManager.unselectAll();\n      return;\n    }\n\n    this.createAndAddNewEditor(event, /* isCentered = */ false);\n  }\n\n  /**\n   * Pointerdown callback.\n   * @param {PointerEvent} event\n   */\n  pointerdown(event) {\n    if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) {\n      this.enableTextSelection();\n    }\n    if (this.#hadPointerDown) {\n      // It's possible to have a second pointerdown event before a pointerup one\n      // when the user puts a finger on a touchscreen and then add a second one\n      // to start a pinch-to-zoom gesture.\n      // That said, in case it's possible to have two pointerdown events with\n      // a mouse, we don't want to create a new editor in such a case either.\n      this.#hadPointerDown = false;\n      return;\n    }\n    const { isMac } = FeatureTest.platform;\n    if (event.button !== 0 || (event.ctrlKey && isMac)) {\n      // Do nothing on right click.\n      return;\n    }\n\n    if (event.target !== this.div) {\n      return;\n    }\n\n    this.#hadPointerDown = true;\n\n    if (this.#currentEditorType?.isDrawer) {\n      this.startDrawingSession(event);\n      return;\n    }\n\n    const editor = this.#uiManager.getActive();\n    this.#allowClick = !editor || editor.isEmpty();\n  }\n\n  startDrawingSession(event) {\n    this.div.focus();\n    if (this.#drawingAC) {\n      this.#currentEditorType.startDrawing(this, this.#uiManager, false, event);\n      return;\n    }\n\n    this.#uiManager.setCurrentDrawingSession(this);\n    this.#drawingAC = new AbortController();\n    const signal = this.#uiManager.combinedSignal(this.#drawingAC);\n    this.div.addEventListener(\n      \"blur\",\n      ({ relatedTarget }) => {\n        if (relatedTarget && !this.div.contains(relatedTarget)) {\n          this.#focusedElement = null;\n          this.commitOrRemove();\n        }\n      },\n      { signal }\n    );\n    this.#currentEditorType.startDrawing(this, this.#uiManager, false, event);\n  }\n\n  pause(on) {\n    if (on) {\n      const { activeElement } = document;\n      if (this.div.contains(activeElement)) {\n        this.#focusedElement = activeElement;\n      }\n      return;\n    }\n    if (this.#focusedElement) {\n      setTimeout(() => {\n        this.#focusedElement?.focus();\n        this.#focusedElement = null;\n      }, 0);\n    }\n  }\n\n  endDrawingSession(isAborted = false) {\n    if (!this.#drawingAC) {\n      return null;\n    }\n    this.#uiManager.setCurrentDrawingSession(null);\n    this.#drawingAC.abort();\n    this.#drawingAC = null;\n    this.#focusedElement = null;\n    return this.#currentEditorType.endDrawing(isAborted);\n  }\n\n  /**\n   *\n   * @param {AnnotationEditor} editor\n   * @param {number} x\n   * @param {number} y\n   * @returns\n   */\n  findNewParent(editor, x, y) {\n    const layer = this.#uiManager.findParent(x, y);\n    if (layer === null || layer === this) {\n      return false;\n    }\n    layer.changeParent(editor);\n    return true;\n  }\n\n  commitOrRemove() {\n    if (this.#drawingAC) {\n      this.endDrawingSession();\n      return true;\n    }\n    return false;\n  }\n\n  onScaleChanging() {\n    if (!this.#drawingAC) {\n      return;\n    }\n    this.#currentEditorType.onScaleChangingWhenDrawing(this);\n  }\n\n  /**\n   * Destroy the main editor.\n   */\n  destroy() {\n    this.commitOrRemove();\n    if (this.#uiManager.getActive()?.parent === this) {\n      // We need to commit the current editor before destroying the layer.\n      this.#uiManager.commitOrRemove();\n      this.#uiManager.setActiveEditor(null);\n    }\n\n    if (this.#editorFocusTimeoutId) {\n      clearTimeout(this.#editorFocusTimeoutId);\n      this.#editorFocusTimeoutId = null;\n    }\n\n    for (const editor of this.#editors.values()) {\n      this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);\n      editor.setParent(null);\n      editor.isAttachedToDOM = false;\n      editor.div.remove();\n    }\n    this.div = null;\n    this.#editors.clear();\n    this.#uiManager.removeLayer(this);\n  }\n\n  #cleanup() {\n    // When we're cleaning up, some editors are removed but we don't want\n    // to add a new one which will induce an addition in this.#editors, hence\n    // an infinite loop.\n    for (const editor of this.#editors.values()) {\n      if (editor.isEmpty()) {\n        editor.remove();\n      }\n    }\n  }\n\n  /**\n   * Render the main editor.\n   * @param {RenderEditorLayerOptions} parameters\n   */\n  render({ viewport }) {\n    this.viewport = viewport;\n    setLayerDimensions(this.div, viewport);\n    for (const editor of this.#uiManager.getEditors(this.pageIndex)) {\n      this.add(editor);\n      editor.rebuild();\n    }\n    // We're maybe rendering a layer which was invisible when we started to edit\n    // so we must set the different callbacks for it.\n    this.updateMode();\n  }\n\n  /**\n   * Update the main editor.\n   * @param {RenderEditorLayerOptions} parameters\n   */\n  update({ viewport }) {\n    // Editors have their dimensions/positions in percent so to avoid any\n    // issues (see #15582), we must commit the current one before changing\n    // the viewport.\n    this.#uiManager.commitOrRemove();\n    this.#cleanup();\n\n    const oldRotation = this.viewport.rotation;\n    const rotation = viewport.rotation;\n\n    this.viewport = viewport;\n    setLayerDimensions(this.div, { rotation });\n    if (oldRotation !== rotation) {\n      for (const editor of this.#editors.values()) {\n        editor.rotate(rotation);\n      }\n    }\n  }\n\n  /**\n   * Get page dimensions.\n   * @returns {Object} dimensions.\n   */\n  get pageDimensions() {\n    const { pageWidth, pageHeight } = this.viewport.rawDims;\n    return [pageWidth, pageHeight];\n  }\n\n  get scale() {\n    return this.#uiManager.viewParameters.realScale;\n  }\n}\n\nexport { AnnotationEditorLayer };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DOMSVGFactory } from \"./svg_factory.js\";\nimport { shadow } from \"../shared/util.js\";\n\n/**\n * Manage the SVGs drawn on top of the page canvas.\n * It's important to have them directly on top of the canvas because we want to\n * be able to use mix-blend-mode for some of them.\n */\nclass DrawLayer {\n  #parent = null;\n\n  #id = 0;\n\n  #mapping = new Map();\n\n  #toUpdate = new Map();\n\n  constructor({ pageIndex }) {\n    this.pageIndex = pageIndex;\n  }\n\n  setParent(parent) {\n    if (!this.#parent) {\n      this.#parent = parent;\n      return;\n    }\n\n    if (this.#parent !== parent) {\n      if (this.#mapping.size > 0) {\n        for (const root of this.#mapping.values()) {\n          root.remove();\n          parent.append(root);\n        }\n      }\n      this.#parent = parent;\n    }\n  }\n\n  static get _svgFactory() {\n    return shadow(this, \"_svgFactory\", new DOMSVGFactory());\n  }\n\n  static #setBox(element, [x, y, width, height]) {\n    const { style } = element;\n    style.top = `${100 * y}%`;\n    style.left = `${100 * x}%`;\n    style.width = `${100 * width}%`;\n    style.height = `${100 * height}%`;\n  }\n\n  #createSVG() {\n    const svg = DrawLayer._svgFactory.create(1, 1, /* skipDimensions = */ true);\n    this.#parent.append(svg);\n    svg.setAttribute(\"aria-hidden\", true);\n\n    return svg;\n  }\n\n  #createClipPath(defs, pathId) {\n    const clipPath = DrawLayer._svgFactory.createElement(\"clipPath\");\n    defs.append(clipPath);\n    const clipPathId = `clip_${pathId}`;\n    clipPath.setAttribute(\"id\", clipPathId);\n    clipPath.setAttribute(\"clipPathUnits\", \"objectBoundingBox\");\n    const clipPathUse = DrawLayer._svgFactory.createElement(\"use\");\n    clipPath.append(clipPathUse);\n    clipPathUse.setAttribute(\"href\", `#${pathId}`);\n    clipPathUse.classList.add(\"clip\");\n\n    return clipPathId;\n  }\n\n  #updateProperties(element, properties) {\n    for (const [key, value] of Object.entries(properties)) {\n      if (value === null) {\n        element.removeAttribute(key);\n      } else {\n        element.setAttribute(key, value);\n      }\n    }\n  }\n\n  draw(properties, isPathUpdatable = false, hasClip = false) {\n    const id = this.#id++;\n    const root = this.#createSVG();\n\n    const defs = DrawLayer._svgFactory.createElement(\"defs\");\n    root.append(defs);\n    const path = DrawLayer._svgFactory.createElement(\"path\");\n    defs.append(path);\n    const pathId = `path_p${this.pageIndex}_${id}`;\n    path.setAttribute(\"id\", pathId);\n    path.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n\n    if (isPathUpdatable) {\n      this.#toUpdate.set(id, path);\n    }\n\n    // Create the clipping path for the editor div.\n    const clipPathId = hasClip ? this.#createClipPath(defs, pathId) : null;\n\n    const use = DrawLayer._svgFactory.createElement(\"use\");\n    root.append(use);\n    use.setAttribute(\"href\", `#${pathId}`);\n    this.updateProperties(root, properties);\n\n    this.#mapping.set(id, root);\n\n    return { id, clipPathId: `url(#${clipPathId})` };\n  }\n\n  drawOutline(properties, mustRemoveSelfIntersections) {\n    // We cannot draw the outline directly in the SVG for highlights because\n    // it composes with its parent with mix-blend-mode: multiply.\n    // But the outline has a different mix-blend-mode, so we need to draw it in\n    // its own SVG.\n    const id = this.#id++;\n    const root = this.#createSVG();\n    const defs = DrawLayer._svgFactory.createElement(\"defs\");\n    root.append(defs);\n    const path = DrawLayer._svgFactory.createElement(\"path\");\n    defs.append(path);\n    const pathId = `path_p${this.pageIndex}_${id}`;\n    path.setAttribute(\"id\", pathId);\n    path.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n\n    let maskId;\n    if (mustRemoveSelfIntersections) {\n      const mask = DrawLayer._svgFactory.createElement(\"mask\");\n      defs.append(mask);\n      maskId = `mask_p${this.pageIndex}_${id}`;\n      mask.setAttribute(\"id\", maskId);\n      mask.setAttribute(\"maskUnits\", \"objectBoundingBox\");\n      const rect = DrawLayer._svgFactory.createElement(\"rect\");\n      mask.append(rect);\n      rect.setAttribute(\"width\", \"1\");\n      rect.setAttribute(\"height\", \"1\");\n      rect.setAttribute(\"fill\", \"white\");\n      const use = DrawLayer._svgFactory.createElement(\"use\");\n      mask.append(use);\n      use.setAttribute(\"href\", `#${pathId}`);\n      use.setAttribute(\"stroke\", \"none\");\n      use.setAttribute(\"fill\", \"black\");\n      use.setAttribute(\"fill-rule\", \"nonzero\");\n      use.classList.add(\"mask\");\n    }\n\n    const use1 = DrawLayer._svgFactory.createElement(\"use\");\n    root.append(use1);\n    use1.setAttribute(\"href\", `#${pathId}`);\n    if (maskId) {\n      use1.setAttribute(\"mask\", `url(#${maskId})`);\n    }\n    const use2 = use1.cloneNode();\n    root.append(use2);\n    use1.classList.add(\"mainOutline\");\n    use2.classList.add(\"secondaryOutline\");\n\n    this.updateProperties(root, properties);\n\n    this.#mapping.set(id, root);\n\n    return id;\n  }\n\n  finalizeDraw(id, properties) {\n    this.#toUpdate.delete(id);\n    this.updateProperties(id, properties);\n  }\n\n  updateProperties(elementOrId, properties) {\n    if (!properties) {\n      return;\n    }\n    const { root, bbox, rootClass, path } = properties;\n    const element =\n      typeof elementOrId === \"number\"\n        ? this.#mapping.get(elementOrId)\n        : elementOrId;\n    if (!element) {\n      return;\n    }\n    if (root) {\n      this.#updateProperties(element, root);\n    }\n    if (bbox) {\n      DrawLayer.#setBox(element, bbox);\n    }\n    if (rootClass) {\n      const { classList } = element;\n      for (const [className, value] of Object.entries(rootClass)) {\n        classList.toggle(className, value);\n      }\n    }\n    if (path) {\n      const defs = element.firstChild;\n      const pathElement = defs.firstChild;\n      this.#updateProperties(pathElement, path);\n    }\n  }\n\n  updateParent(id, layer) {\n    if (layer === this) {\n      return;\n    }\n    const root = this.#mapping.get(id);\n    if (!root) {\n      return;\n    }\n    layer.#parent.append(root);\n    this.#mapping.delete(id);\n    layer.#mapping.set(id, root);\n  }\n\n  remove(id) {\n    this.#toUpdate.delete(id);\n    if (this.#parent === null) {\n      return;\n    }\n    this.#mapping.get(id).remove();\n    this.#mapping.delete(id);\n  }\n\n  destroy() {\n    this.#parent = null;\n    for (const root of this.#mapping.values()) {\n      root.remove();\n    }\n    this.#mapping.clear();\n    this.#toUpdate.clear();\n  }\n}\n\nexport { DrawLayer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./display/api\").OnProgressParameters} OnProgressParameters */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./display/api\").PDFDocumentLoadingTask} PDFDocumentLoadingTask */\n/** @typedef {import(\"./display/api\").PDFDocumentProxy} PDFDocumentProxy */\n/** @typedef {import(\"./display/api\").PDFPageProxy} PDFPageProxy */\n/** @typedef {import(\"./display/api\").RenderTask} RenderTask */\n/** @typedef {import(\"./display/display_utils\").PageViewport} PageViewport */\n\nimport {\n  AbortException,\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  AnnotationMode,\n  createValidAbsoluteUrl,\n  FeatureTest,\n  ImageKind,\n  InvalidPDFException,\n  MissingPDFException,\n  normalizeUnicode,\n  OPS,\n  PasswordResponses,\n  PermissionFlag,\n  shadow,\n  UnexpectedResponseException,\n  Util,\n  VerbosityLevel,\n} from \"./shared/util.js\";\nimport {\n  build,\n  getDocument,\n  PDFDataRangeTransport,\n  PDFWorker,\n  version,\n} from \"./display/api.js\";\nimport {\n  fetchData,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getXfaPageViewport,\n  isDataScheme,\n  isPdfFile,\n  noContextMenu,\n  OutputScale,\n  PDFDateString,\n  PixelsPerInch,\n  RenderingCancelledException,\n  setLayerDimensions,\n  stopEvent,\n} from \"./display/display_utils.js\";\nimport { AnnotationEditorLayer } from \"./display/editor/annotation_editor_layer.js\";\nimport { AnnotationEditorUIManager } from \"./display/editor/tools.js\";\nimport { AnnotationLayer } from \"./display/annotation_layer.js\";\nimport { ColorPicker } from \"./display/editor/color_picker.js\";\nimport { DOMSVGFactory } from \"./display/svg_factory.js\";\nimport { DrawLayer } from \"./display/draw_layer.js\";\nimport { GlobalWorkerOptions } from \"./display/worker_options.js\";\nimport { HighlightOutliner } from \"./display/editor/drawers/highlight.js\";\nimport { TextLayer } from \"./display/text_layer.js\";\nimport { TouchManager } from \"./display/touch_manager.js\";\nimport { XfaLayer } from \"./display/xfa_layer.js\";\n\n/* eslint-disable-next-line no-unused-vars */\nconst pdfjsVersion =\n  typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_VERSION\") : void 0;\n/* eslint-disable-next-line no-unused-vars */\nconst pdfjsBuild =\n  typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_BUILD\") : void 0;\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING || GENERIC\")) {\n  globalThis.pdfjsTestingUtils = {\n    HighlightOutliner,\n  };\n}\n\nexport {\n  AbortException,\n  AnnotationEditorLayer,\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  AnnotationEditorUIManager,\n  AnnotationLayer,\n  AnnotationMode,\n  build,\n  ColorPicker,\n  createValidAbsoluteUrl,\n  DOMSVGFactory,\n  DrawLayer,\n  FeatureTest,\n  fetchData,\n  getDocument,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getXfaPageViewport,\n  GlobalWorkerOptions,\n  ImageKind,\n  InvalidPDFException,\n  isDataScheme,\n  isPdfFile,\n  MissingPDFException,\n  noContextMenu,\n  normalizeUnicode,\n  OPS,\n  OutputScale,\n  PasswordResponses,\n  PDFDataRangeTransport,\n  PDFDateString,\n  PDFWorker,\n  PermissionFlag,\n  PixelsPerInch,\n  RenderingCancelledException,\n  setLayerDimensions,\n  shadow,\n  stopEvent,\n  TextLayer,\n  TouchManager,\n  UnexpectedResponseException,\n  Util,\n  VerbosityLevel,\n  version,\n  XfaLayer,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DEFAULT_SCALE_VALUE = \"auto\";\nconst DEFAULT_SCALE = 1.0;\nconst DEFAULT_SCALE_DELTA = 1.1;\nconst MIN_SCALE = 0.1;\nconst MAX_SCALE = 10.0;\nconst UNKNOWN_SCALE = 0;\nconst MAX_AUTO_SCALE = 1.25;\nconst SCROLLBAR_PADDING = 40;\nconst VERTICAL_PADDING = 5;\n\nconst RenderingStates = {\n  INITIAL: 0,\n  RUNNING: 1,\n  PAUSED: 2,\n  FINISHED: 3,\n};\n\nconst PresentationModeState = {\n  UNKNOWN: 0,\n  NORMAL: 1,\n  CHANGING: 2,\n  FULLSCREEN: 3,\n};\n\nconst SidebarView = {\n  UNKNOWN: -1,\n  NONE: 0,\n  THUMBS: 1, // Default value.\n  OUTLINE: 2,\n  ATTACHMENTS: 3,\n  LAYERS: 4,\n};\n\nconst TextLayerMode = {\n  DISABLE: 0,\n  ENABLE: 1,\n  ENABLE_PERMISSIONS: 2,\n};\n\nconst ScrollMode = {\n  UNKNOWN: -1,\n  VERTICAL: 0, // Default value.\n  HORIZONTAL: 1,\n  WRAPPED: 2,\n  PAGE: 3,\n};\n\nconst SpreadMode = {\n  UNKNOWN: -1,\n  NONE: 0, // Default value.\n  ODD: 1,\n  EVEN: 2,\n};\n\nconst CursorTool = {\n  SELECT: 0, // The default value.\n  HAND: 1,\n  ZOOM: 2,\n};\n\n// Used by `PDFViewerApplication`, and by the API unit-tests.\nconst AutoPrintRegExp = /\\bprint\\s*\\(/;\n\n/**\n * Scrolls specified element into view of its parent.\n * @param {HTMLElement} element - The element to be visible.\n * @param {Object} [spot] - An object with optional top and left properties,\n *   specifying the offset from the top left edge.\n * @param {number} [spot.left]\n * @param {number} [spot.top]\n * @param {boolean} [scrollMatches] - When scrolling search results into view,\n *   ignore elements that either: Contains marked content identifiers,\n *   or have the CSS-rule `overflow: hidden;` set. The default value is `false`.\n */\nfunction scrollIntoView(element, spot, scrollMatches = false) {\n  // Assuming offsetParent is available (it's not available when viewer is in\n  // hidden iframe or object). We have to scroll: if the offsetParent is not set\n  // producing the error. See also animationStarted.\n  let parent = element.offsetParent;\n  if (!parent) {\n    console.error(\"offsetParent is not set -- cannot scroll\");\n    return;\n  }\n  let offsetY = element.offsetTop + element.clientTop;\n  let offsetX = element.offsetLeft + element.clientLeft;\n  while (\n    (parent.clientHeight === parent.scrollHeight &&\n      parent.clientWidth === parent.scrollWidth) ||\n    (scrollMatches &&\n      (parent.classList.contains(\"markedContent\") ||\n        getComputedStyle(parent).overflow === \"hidden\"))\n  ) {\n    offsetY += parent.offsetTop;\n    offsetX += parent.offsetLeft;\n\n    parent = parent.offsetParent;\n    if (!parent) {\n      return; // no need to scroll\n    }\n  }\n  if (spot) {\n    if (spot.top !== undefined) {\n      offsetY += spot.top;\n    }\n    if (spot.left !== undefined) {\n      offsetX += spot.left;\n      parent.scrollLeft = offsetX;\n    }\n  }\n  parent.scrollTop = offsetY;\n}\n\n/**\n * Helper function to start monitoring the scroll event and converting them into\n * PDF.js friendly one: with scroll debounce and scroll direction.\n */\nfunction watchScroll(viewAreaElement, callback, abortSignal = undefined) {\n  const debounceScroll = function (evt) {\n    if (rAF) {\n      return;\n    }\n    // schedule an invocation of scroll for next animation frame.\n    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n      rAF = null;\n\n      const currentX = viewAreaElement.scrollLeft;\n      const lastX = state.lastX;\n      if (currentX !== lastX) {\n        state.right = currentX > lastX;\n      }\n      state.lastX = currentX;\n      const currentY = viewAreaElement.scrollTop;\n      const lastY = state.lastY;\n      if (currentY !== lastY) {\n        state.down = currentY > lastY;\n      }\n      state.lastY = currentY;\n      callback(state);\n    });\n  };\n\n  const state = {\n    right: true,\n    down: true,\n    lastX: viewAreaElement.scrollLeft,\n    lastY: viewAreaElement.scrollTop,\n    _eventHandler: debounceScroll,\n  };\n\n  let rAF = null;\n  viewAreaElement.addEventListener(\"scroll\", debounceScroll, {\n    useCapture: true,\n    signal: abortSignal,\n  });\n  abortSignal?.addEventListener(\n    \"abort\",\n    () => window.cancelAnimationFrame(rAF),\n    { once: true }\n  );\n  return state;\n}\n\n/**\n * Helper function to parse query string (e.g. ?param1=value&param2=...).\n * @param {string} query\n * @returns {Map}\n */\nfunction parseQueryString(query) {\n  const params = new Map();\n  for (const [key, value] of new URLSearchParams(query)) {\n    params.set(key.toLowerCase(), value);\n  }\n  return params;\n}\n\nconst InvisibleCharsRegExp = /[\\x00-\\x1F]/g;\n\n/**\n * @param {string} str\n * @param {boolean} [replaceInvisible]\n */\nfunction removeNullCharacters(str, replaceInvisible = false) {\n  if (!InvisibleCharsRegExp.test(str)) {\n    return str;\n  }\n  if (replaceInvisible) {\n    return str.replaceAll(InvisibleCharsRegExp, m => (m === \"\\x00\" ? \"\" : \" \"));\n  }\n  return str.replaceAll(\"\\x00\", \"\");\n}\n\n/**\n * Use binary search to find the index of the first item in a given array which\n * passes a given condition. The items are expected to be sorted in the sense\n * that if the condition is true for one item in the array, then it is also true\n * for all following items.\n *\n * @returns {number} Index of the first array element to pass the test,\n *                   or |items.length| if no such element exists.\n */\nfunction binarySearchFirstItem(items, condition, start = 0) {\n  let minIndex = start;\n  let maxIndex = items.length - 1;\n\n  if (maxIndex < 0 || !condition(items[maxIndex])) {\n    return items.length;\n  }\n  if (condition(items[minIndex])) {\n    return minIndex;\n  }\n\n  while (minIndex < maxIndex) {\n    const currentIndex = (minIndex + maxIndex) >> 1;\n    const currentItem = items[currentIndex];\n    if (condition(currentItem)) {\n      maxIndex = currentIndex;\n    } else {\n      minIndex = currentIndex + 1;\n    }\n  }\n  return minIndex; /* === maxIndex */\n}\n\n/**\n *  Approximates float number as a fraction using Farey sequence (max order\n *  of 8).\n *  @param {number} x - Positive float number.\n *  @returns {Array} Estimated fraction: the first array item is a numerator,\n *                   the second one is a denominator.\n *                   They are both natural numbers.\n */\nfunction approximateFraction(x) {\n  // Fast paths for int numbers or their inversions.\n  if (Math.floor(x) === x) {\n    return [x, 1];\n  }\n  const xinv = 1 / x;\n  const limit = 8;\n  if (xinv > limit) {\n    return [1, limit];\n  } else if (Math.floor(xinv) === xinv) {\n    return [1, xinv];\n  }\n\n  const x_ = x > 1 ? xinv : x;\n  // a/b and c/d are neighbours in Farey sequence.\n  let a = 0,\n    b = 1,\n    c = 1,\n    d = 1;\n  // Limiting search to order 8.\n  while (true) {\n    // Generating next term in sequence (order of q).\n    const p = a + c,\n      q = b + d;\n    if (q > limit) {\n      break;\n    }\n    if (x_ <= p / q) {\n      c = p;\n      d = q;\n    } else {\n      a = p;\n      b = q;\n    }\n  }\n  let result;\n  // Select closest of the neighbours to x.\n  if (x_ - a / b < c / d - x_) {\n    result = x_ === x ? [a, b] : [b, a];\n  } else {\n    result = x_ === x ? [c, d] : [d, c];\n  }\n  return result;\n}\n\n/**\n * @param {number} x - A positive number to round to a multiple of `div`.\n * @param {number} div - A natural number.\n */\nfunction floorToDivide(x, div) {\n  return x - (x % div);\n}\n\n/**\n * @typedef {Object} GetPageSizeInchesParameters\n * @property {number[]} view\n * @property {number} userUnit\n * @property {number} rotate\n */\n\n/**\n * @typedef {Object} PageSize\n * @property {number} width - In inches.\n * @property {number} height - In inches.\n */\n\n/**\n * Gets the size of the specified page, converted from PDF units to inches.\n * @param {GetPageSizeInchesParameters} params\n * @returns {PageSize}\n */\nfunction getPageSizeInches({ view, userUnit, rotate }) {\n  const [x1, y1, x2, y2] = view;\n  // We need to take the page rotation into account as well.\n  const changeOrientation = rotate % 180 !== 0;\n\n  const width = ((x2 - x1) / 72) * userUnit;\n  const height = ((y2 - y1) / 72) * userUnit;\n\n  return {\n    width: changeOrientation ? height : width,\n    height: changeOrientation ? width : height,\n  };\n}\n\n/**\n * Helper function for getVisibleElements.\n *\n * @param {number} index - initial guess at the first visible element\n * @param {Array} views - array of pages, into which `index` is an index\n * @param {number} top - the top of the scroll pane\n * @returns {number} less than or equal to `index` that is definitely at or\n *   before the first visible element in `views`, but not by too much. (Usually,\n *   this will be the first element in the first partially visible row in\n *   `views`, although sometimes it goes back one row further.)\n */\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n  // binarySearchFirstItem's assumption is that the input is ordered, with only\n  // one index where the conditions flips from false to true: [false ...,\n  // true...]. With vertical scrolling and spreads, it is possible to have\n  // [false ..., true, false, true ...]. With wrapped scrolling we can have a\n  // similar sequence, with many more mixed true and false in the middle.\n  //\n  // So there is no guarantee that the binary search yields the index of the\n  // first visible element. It could have been any of the other visible elements\n  // that were preceded by a hidden element.\n\n  // Of course, if either this element or the previous (hidden) element is also\n  // the first element, there's nothing to worry about.\n  if (index < 2) {\n    return index;\n  }\n\n  // That aside, the possible cases are represented below.\n  //\n  //     ****  = fully hidden\n  //     A*B*  = mix of partially visible and/or hidden pages\n  //     CDEF  = fully visible\n  //\n  // (1) Binary search could have returned A, in which case we can stop.\n  // (2) Binary search could also have returned B, in which case we need to\n  // check the whole row.\n  // (3) Binary search could also have returned C, in which case we need to\n  // check the whole previous row.\n  //\n  // There's one other possibility:\n  //\n  //     ****  = fully hidden\n  //     ABCD  = mix of fully and/or partially visible pages\n  //\n  // (4) Binary search could only have returned A.\n\n  // Initially assume that we need to find the beginning of the current row\n  // (case 1, 2, or 4), which means finding a page that is above the current\n  // page's top. If the found page is partially visible, we're definitely not in\n  // case 3, and this assumption is correct.\n  let elt = views[index].div;\n  let pageTop = elt.offsetTop + elt.clientTop;\n\n  if (pageTop >= top) {\n    // The found page is fully visible, so we're actually either in case 3 or 4,\n    // and unfortunately we can't tell the difference between them without\n    // scanning the entire previous row, so we just conservatively assume that\n    // we do need to backtrack to that row. In both cases, the previous page is\n    // in the previous row, so use its top instead.\n    elt = views[index - 1].div;\n    pageTop = elt.offsetTop + elt.clientTop;\n  }\n\n  // Now we backtrack to the first page that still has its bottom below\n  // `pageTop`, which is the top of a page in the first visible row (unless\n  // we're in case 4, in which case it's the row before that).\n  // `index` is found by binary search, so the page at `index - 1` is\n  // invisible and we can start looking for potentially visible pages from\n  // `index - 2`. (However, if this loop terminates on its first iteration,\n  // which is the case when pages are stacked vertically, `index` should remain\n  // unchanged, so we use a distinct loop variable.)\n  for (let i = index - 2; i >= 0; --i) {\n    elt = views[i].div;\n    if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n      // We have reached the previous row, so stop now.\n      // This loop is expected to terminate relatively quickly because the\n      // number of pages per row is expected to be small.\n      break;\n    }\n    index = i;\n  }\n  return index;\n}\n\n/**\n * @typedef {Object} GetVisibleElementsParameters\n * @property {HTMLElement} scrollEl - A container that can possibly scroll.\n * @property {Array} views - Objects with a `div` property that contains an\n *   HTMLElement, which should all be descendants of `scrollEl` satisfying the\n *   relevant layout assumptions.\n * @property {boolean} sortByVisibility - If `true`, the returned elements are\n *   sorted in descending order of the percent of their padding box that is\n *   visible. The default value is `false`.\n * @property {boolean} horizontal - If `true`, the elements are assumed to be\n *   laid out horizontally instead of vertically. The default value is `false`.\n * @property {boolean} rtl - If `true`, the `scrollEl` container is assumed to\n *   be in right-to-left mode. The default value is `false`.\n */\n\n/**\n * Generic helper to find out what elements are visible within a scroll pane.\n *\n * Well, pretty generic. There are some assumptions placed on the elements\n * referenced by `views`:\n *   - If `horizontal`, no left of any earlier element is to the right of the\n *     left of any later element.\n *   - Otherwise, `views` can be split into contiguous rows where, within a row,\n *     no top of any element is below the bottom of any other element, and\n *     between rows, no bottom of any element in an earlier row is below the\n *     top of any element in a later row.\n *\n * (Here, top, left, etc. all refer to the padding edge of the element in\n * question. For pages, that ends up being equivalent to the bounding box of the\n * rendering canvas. Earlier and later refer to index in `views`, not page\n * layout.)\n *\n * @param {GetVisibleElementsParameters} params\n * @returns {Object} `{ first, last, views: [{ id, x, y, view, percent }] }`\n */\nfunction getVisibleElements({\n  scrollEl,\n  views,\n  sortByVisibility = false,\n  horizontal = false,\n  rtl = false,\n}) {\n  const top = scrollEl.scrollTop,\n    bottom = top + scrollEl.clientHeight;\n  const left = scrollEl.scrollLeft,\n    right = left + scrollEl.clientWidth;\n\n  // Throughout this \"generic\" function, comments will assume we're working with\n  // PDF document pages, which is the most important and complex case. In this\n  // case, the visible elements we're actually interested is the page canvas,\n  // which is contained in a wrapper which adds no padding/border/margin, which\n  // is itself contained in `view.div` which adds no padding (but does add a\n  // border). So, as specified in this function's doc comment, this function\n  // does all of its work on the padding edge of the provided views, starting at\n  // offsetLeft/Top (which includes margin) and adding clientLeft/Top (which is\n  // the border). Adding clientWidth/Height gets us the bottom-right corner of\n  // the padding edge.\n  function isElementBottomAfterViewTop(view) {\n    const element = view.div;\n    const elementBottom =\n      element.offsetTop + element.clientTop + element.clientHeight;\n    return elementBottom > top;\n  }\n  function isElementNextAfterViewHorizontally(view) {\n    const element = view.div;\n    const elementLeft = element.offsetLeft + element.clientLeft;\n    const elementRight = elementLeft + element.clientWidth;\n    return rtl ? elementLeft < right : elementRight > left;\n  }\n\n  const visible = [],\n    ids = new Set(),\n    numViews = views.length;\n  let firstVisibleElementInd = binarySearchFirstItem(\n    views,\n    horizontal\n      ? isElementNextAfterViewHorizontally\n      : isElementBottomAfterViewTop\n  );\n\n  // Please note the return value of the `binarySearchFirstItem` function when\n  // no valid element is found (hence the `firstVisibleElementInd` check below).\n  if (\n    firstVisibleElementInd > 0 &&\n    firstVisibleElementInd < numViews &&\n    !horizontal\n  ) {\n    // In wrapped scrolling (or vertical scrolling with spreads), with some page\n    // sizes, isElementBottomAfterViewTop doesn't satisfy the binary search\n    // condition: there can be pages with bottoms above the view top between\n    // pages with bottoms below. This function detects and corrects that error;\n    // see it for more comments.\n    firstVisibleElementInd = backtrackBeforeAllVisibleElements(\n      firstVisibleElementInd,\n      views,\n      top\n    );\n  }\n\n  // lastEdge acts as a cutoff for us to stop looping, because we know all\n  // subsequent pages will be hidden.\n  //\n  // When using wrapped scrolling or vertical scrolling with spreads, we can't\n  // simply stop the first time we reach a page below the bottom of the view;\n  // the tops of subsequent pages on the same row could still be visible. In\n  // horizontal scrolling, we don't have that issue, so we can stop as soon as\n  // we pass `right`, without needing the code below that handles the -1 case.\n  let lastEdge = horizontal ? right : -1;\n\n  for (let i = firstVisibleElementInd; i < numViews; i++) {\n    const view = views[i],\n      element = view.div;\n    const currentWidth = element.offsetLeft + element.clientLeft;\n    const currentHeight = element.offsetTop + element.clientTop;\n    const viewWidth = element.clientWidth,\n      viewHeight = element.clientHeight;\n    const viewRight = currentWidth + viewWidth;\n    const viewBottom = currentHeight + viewHeight;\n\n    if (lastEdge === -1) {\n      // As commented above, this is only needed in non-horizontal cases.\n      // Setting lastEdge to the bottom of the first page that is partially\n      // visible ensures that the next page fully below lastEdge is on the\n      // next row, which has to be fully hidden along with all subsequent rows.\n      if (viewBottom >= bottom) {\n        lastEdge = viewBottom;\n      }\n    } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n      break;\n    }\n\n    if (\n      viewBottom <= top ||\n      currentHeight >= bottom ||\n      viewRight <= left ||\n      currentWidth >= right\n    ) {\n      continue;\n    }\n\n    const hiddenHeight =\n      Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);\n    const hiddenWidth =\n      Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);\n\n    const fractionHeight = (viewHeight - hiddenHeight) / viewHeight,\n      fractionWidth = (viewWidth - hiddenWidth) / viewWidth;\n    const percent = (fractionHeight * fractionWidth * 100) | 0;\n\n    visible.push({\n      id: view.id,\n      x: currentWidth,\n      y: currentHeight,\n      view,\n      percent,\n      widthPercent: (fractionWidth * 100) | 0,\n    });\n    ids.add(view.id);\n  }\n\n  const first = visible[0],\n    last = visible.at(-1);\n\n  if (sortByVisibility) {\n    visible.sort(function (a, b) {\n      const pc = a.percent - b.percent;\n      if (Math.abs(pc) > 0.001) {\n        return -pc;\n      }\n      return a.id - b.id; // ensure stability\n    });\n  }\n  return { first, last, views: visible, ids };\n}\n\nfunction normalizeWheelEventDirection(evt) {\n  let delta = Math.hypot(evt.deltaX, evt.deltaY);\n  const angle = Math.atan2(evt.deltaY, evt.deltaX);\n  if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n    // All that is left-up oriented has to change the sign.\n    delta = -delta;\n  }\n  return delta;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n  const deltaMode = evt.deltaMode; // Avoid being affected by bug 1392460.\n  let delta = normalizeWheelEventDirection(evt);\n\n  const MOUSE_PIXELS_PER_LINE = 30;\n  const MOUSE_LINES_PER_PAGE = 30;\n\n  // Converts delta to per-page units\n  if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n    delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n  } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) {\n    delta /= MOUSE_LINES_PER_PAGE;\n  }\n  return delta;\n}\n\nfunction isValidRotation(angle) {\n  return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isValidScrollMode(mode) {\n  return (\n    Number.isInteger(mode) &&\n    Object.values(ScrollMode).includes(mode) &&\n    mode !== ScrollMode.UNKNOWN\n  );\n}\n\nfunction isValidSpreadMode(mode) {\n  return (\n    Number.isInteger(mode) &&\n    Object.values(SpreadMode).includes(mode) &&\n    mode !== SpreadMode.UNKNOWN\n  );\n}\n\nfunction isPortraitOrientation(size) {\n  return size.width <= size.height;\n}\n\n/**\n * Promise that is resolved when DOM window becomes visible.\n */\nconst animationStarted = new Promise(function (resolve) {\n  if (\n    typeof PDFJSDev !== \"undefined\" &&\n    PDFJSDev.test(\"LIB\") &&\n    typeof window === \"undefined\"\n  ) {\n    // Prevent \"ReferenceError: window is not defined\" errors when running the\n    // unit-tests in Node.js environments.\n    setTimeout(resolve, 20);\n    return;\n  }\n  window.requestAnimationFrame(resolve);\n});\n\nconst docStyle =\n  typeof PDFJSDev !== \"undefined\" &&\n  PDFJSDev.test(\"LIB\") &&\n  typeof document === \"undefined\"\n    ? null\n    : document.documentElement.style;\n\nfunction clamp(v, min, max) {\n  return Math.min(Math.max(v, min), max);\n}\n\nclass ProgressBar {\n  #classList = null;\n\n  #disableAutoFetchTimeout = null;\n\n  #percent = 0;\n\n  #style = null;\n\n  #visible = true;\n\n  constructor(bar) {\n    this.#classList = bar.classList;\n    this.#style = bar.style;\n  }\n\n  get percent() {\n    return this.#percent;\n  }\n\n  set percent(val) {\n    this.#percent = clamp(val, 0, 100);\n\n    if (isNaN(val)) {\n      this.#classList.add(\"indeterminate\");\n      return;\n    }\n    this.#classList.remove(\"indeterminate\");\n\n    this.#style.setProperty(\"--progressBar-percent\", `${this.#percent}%`);\n  }\n\n  setWidth(viewer) {\n    if (!viewer) {\n      return;\n    }\n    const container = viewer.parentNode;\n    const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n    if (scrollbarWidth > 0) {\n      this.#style.setProperty(\n        \"--progressBar-end-offset\",\n        `${scrollbarWidth}px`\n      );\n    }\n  }\n\n  setDisableAutoFetch(delay = /* ms = */ 5000) {\n    if (this.#percent === 100 || isNaN(this.#percent)) {\n      return;\n    }\n    if (this.#disableAutoFetchTimeout) {\n      clearTimeout(this.#disableAutoFetchTimeout);\n    }\n    this.show();\n\n    this.#disableAutoFetchTimeout = setTimeout(() => {\n      this.#disableAutoFetchTimeout = null;\n      this.hide();\n    }, delay);\n  }\n\n  hide() {\n    if (!this.#visible) {\n      return;\n    }\n    this.#visible = false;\n    this.#classList.add(\"hidden\");\n  }\n\n  show() {\n    if (this.#visible) {\n      return;\n    }\n    this.#visible = true;\n    this.#classList.remove(\"hidden\");\n  }\n}\n\n/**\n * Get the active or focused element in current DOM.\n *\n * Recursively search for the truly active or focused element in case there are\n * shadow DOMs.\n *\n * @returns {Element} the truly active or focused element.\n */\nfunction getActiveOrFocusedElement() {\n  let curRoot = document;\n  let curActiveOrFocused =\n    curRoot.activeElement || curRoot.querySelector(\":focus\");\n\n  while (curActiveOrFocused?.shadowRoot) {\n    curRoot = curActiveOrFocused.shadowRoot;\n    curActiveOrFocused =\n      curRoot.activeElement || curRoot.querySelector(\":focus\");\n  }\n\n  return curActiveOrFocused;\n}\n\n/**\n * Converts API PageLayout values to the format used by `BaseViewer`.\n * @param {string} layout - The API PageLayout value.\n * @returns {Object}\n */\nfunction apiPageLayoutToViewerModes(layout) {\n  let scrollMode = ScrollMode.VERTICAL,\n    spreadMode = SpreadMode.NONE;\n\n  switch (layout) {\n    case \"SinglePage\":\n      scrollMode = ScrollMode.PAGE;\n      break;\n    case \"OneColumn\":\n      break;\n    case \"TwoPageLeft\":\n      scrollMode = ScrollMode.PAGE;\n    /* falls through */\n    case \"TwoColumnLeft\":\n      spreadMode = SpreadMode.ODD;\n      break;\n    case \"TwoPageRight\":\n      scrollMode = ScrollMode.PAGE;\n    /* falls through */\n    case \"TwoColumnRight\":\n      spreadMode = SpreadMode.EVEN;\n      break;\n  }\n  return { scrollMode, spreadMode };\n}\n\n/**\n * Converts API PageMode values to the format used by `PDFSidebar`.\n * NOTE: There's also a \"FullScreen\" parameter which is not possible to support,\n *       since the Fullscreen API used in browsers requires that entering\n *       fullscreen mode only occurs as a result of a user-initiated event.\n * @param {string} mode - The API PageMode value.\n * @returns {number} A value from {SidebarView}.\n */\nfunction apiPageModeToSidebarView(mode) {\n  switch (mode) {\n    case \"UseNone\":\n      return SidebarView.NONE;\n    case \"UseThumbs\":\n      return SidebarView.THUMBS;\n    case \"UseOutlines\":\n      return SidebarView.OUTLINE;\n    case \"UseAttachments\":\n      return SidebarView.ATTACHMENTS;\n    case \"UseOC\":\n      return SidebarView.LAYERS;\n  }\n  return SidebarView.NONE; // Default value.\n}\n\nfunction toggleCheckedBtn(button, toggle, view = null) {\n  button.classList.toggle(\"toggled\", toggle);\n  button.setAttribute(\"aria-checked\", toggle);\n\n  view?.classList.toggle(\"hidden\", !toggle);\n}\n\nfunction toggleExpandedBtn(button, toggle, view = null) {\n  button.classList.toggle(\"toggled\", toggle);\n  button.setAttribute(\"aria-expanded\", toggle);\n\n  view?.classList.toggle(\"hidden\", !toggle);\n}\n\n// In Firefox, the css calc function uses f32 precision but the Chrome or Safari\n// are using f64 one. So in order to have the same rendering in all browsers, we\n// need to use the right precision in order to have correct dimensions.\nconst calcRound =\n  typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n    ? Math.fround\n    : (function () {\n        if (\n          typeof PDFJSDev !== \"undefined\" &&\n          PDFJSDev.test(\"LIB\") &&\n          typeof document === \"undefined\"\n        ) {\n          return x => x;\n        }\n        const e = document.createElement(\"div\");\n        e.style.width = \"round(down, calc(1.6666666666666665 * 792px), 1px)\";\n        return e.style.width === \"calc(1320px)\" ? Math.fround : x => x;\n      })();\n\nexport {\n  animationStarted,\n  apiPageLayoutToViewerModes,\n  apiPageModeToSidebarView,\n  approximateFraction,\n  AutoPrintRegExp,\n  backtrackBeforeAllVisibleElements, // only exported for testing\n  binarySearchFirstItem,\n  calcRound,\n  CursorTool,\n  DEFAULT_SCALE,\n  DEFAULT_SCALE_DELTA,\n  DEFAULT_SCALE_VALUE,\n  docStyle,\n  floorToDivide,\n  getActiveOrFocusedElement,\n  getPageSizeInches,\n  getVisibleElements,\n  isPortraitOrientation,\n  isValidRotation,\n  isValidScrollMode,\n  isValidSpreadMode,\n  MAX_AUTO_SCALE,\n  MAX_SCALE,\n  MIN_SCALE,\n  normalizeWheelEventDelta,\n  normalizeWheelEventDirection,\n  parseQueryString,\n  PresentationModeState,\n  ProgressBar,\n  removeNullCharacters,\n  RenderingStates,\n  SCROLLBAR_PADDING,\n  scrollIntoView,\n  ScrollMode,\n  SidebarView,\n  SpreadMode,\n  TextLayerMode,\n  toggleCheckedBtn,\n  toggleExpandedBtn,\n  UNKNOWN_SCALE,\n  VERTICAL_PADDING,\n  watchScroll,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst CharacterType = {\n  SPACE: 0,\n  ALPHA_LETTER: 1,\n  PUNCT: 2,\n  HAN_LETTER: 3,\n  KATAKANA_LETTER: 4,\n  HIRAGANA_LETTER: 5,\n  HALFWIDTH_KATAKANA_LETTER: 6,\n  THAI_LETTER: 7,\n};\n\nfunction isAlphabeticalScript(charCode) {\n  return charCode < 0x2e80;\n}\n\nfunction isAscii(charCode) {\n  return (charCode & 0xff80) === 0;\n}\n\nfunction isAsciiAlpha(charCode) {\n  return (\n    (charCode >= /* a = */ 0x61 && charCode <= /* z = */ 0x7a) ||\n    (charCode >= /* A = */ 0x41 && charCode <= /* Z = */ 0x5a)\n  );\n}\n\nfunction isAsciiDigit(charCode) {\n  return charCode >= /* 0 = */ 0x30 && charCode <= /* 9 = */ 0x39;\n}\n\nfunction isAsciiSpace(charCode) {\n  return (\n    charCode === /* SPACE = */ 0x20 ||\n    charCode === /* TAB = */ 0x09 ||\n    charCode === /* CR = */ 0x0d ||\n    charCode === /* LF = */ 0x0a\n  );\n}\n\nfunction isHan(charCode) {\n  return (\n    (charCode >= 0x3400 && charCode <= 0x9fff) ||\n    (charCode >= 0xf900 && charCode <= 0xfaff)\n  );\n}\n\nfunction isKatakana(charCode) {\n  return charCode >= 0x30a0 && charCode <= 0x30ff;\n}\n\nfunction isHiragana(charCode) {\n  return charCode >= 0x3040 && charCode <= 0x309f;\n}\n\nfunction isHalfwidthKatakana(charCode) {\n  return charCode >= 0xff60 && charCode <= 0xff9f;\n}\n\nfunction isThai(charCode) {\n  return (charCode & 0xff80) === 0x0e00;\n}\n\n/**\n * This function is based on the word-break detection implemented in:\n * https://hg.mozilla.org/mozilla-central/file/tip/intl/lwbrk/WordBreaker.cpp\n */\nfunction getCharacterType(charCode) {\n  if (isAlphabeticalScript(charCode)) {\n    if (isAscii(charCode)) {\n      if (isAsciiSpace(charCode)) {\n        return CharacterType.SPACE;\n      } else if (\n        isAsciiAlpha(charCode) ||\n        isAsciiDigit(charCode) ||\n        charCode === /* UNDERSCORE = */ 0x5f\n      ) {\n        return CharacterType.ALPHA_LETTER;\n      }\n      return CharacterType.PUNCT;\n    } else if (isThai(charCode)) {\n      return CharacterType.THAI_LETTER;\n    } else if (charCode === /* NBSP = */ 0xa0) {\n      return CharacterType.SPACE;\n    }\n    return CharacterType.ALPHA_LETTER;\n  }\n\n  if (isHan(charCode)) {\n    return CharacterType.HAN_LETTER;\n  } else if (isKatakana(charCode)) {\n    return CharacterType.KATAKANA_LETTER;\n  } else if (isHiragana(charCode)) {\n    return CharacterType.HIRAGANA_LETTER;\n  } else if (isHalfwidthKatakana(charCode)) {\n    return CharacterType.HALFWIDTH_KATAKANA_LETTER;\n  }\n  return CharacterType.ALPHA_LETTER;\n}\n\nlet NormalizeWithNFKC;\nfunction getNormalizeWithNFKC() {\n  /* eslint-disable no-irregular-whitespace */\n  NormalizeWithNFKC ||= ` ¨ª¯²-µ¸-º¼-¾Ĳ-ĳĿ-ŀŉſǄ-ǌǱ-ǳʰ-ʸ˘-˝ˠ-ˤʹͺ;΄-΅·ϐ-ϖϰ-ϲϴ-ϵϹևٵ-ٸक़-य़ড়-ঢ়য়ਲ਼ਸ਼ਖ਼-ਜ਼ਫ਼ଡ଼-ଢ଼ำຳໜ-ໝ༌གྷཌྷདྷབྷཛྷཀྵჼᴬ-ᴮᴰ-ᴺᴼ-ᵍᵏ-ᵪᵸᶛ-ᶿẚ-ẛάέήίόύώΆ᾽-῁ΈΉ῍-῏ΐΊ῝-῟ΰΎ῭-`ΌΏ´-῾ - ‑‗․-… ″-‴‶-‷‼‾⁇-⁉⁗ ⁰-ⁱ⁴-₎ₐ-ₜ₨℀-℃℅-ℇ℉-ℓℕ-№ℙ-ℝ℠-™ℤΩℨK-ℭℯ-ℱℳ-ℹ℻-⅀ⅅ-ⅉ⅐-ⅿ↉∬-∭∯-∰〈-〉①-⓪⨌⩴-⩶⫝̸ⱼ-ⱽⵯ⺟⻳⼀-⿕　〶〸-〺゛-゜ゟヿㄱ-ㆎ㆒-㆟㈀-㈞㈠-㉇㉐-㉾㊀-㏿ꚜ-ꚝꝰꟲ-ꟴꟸ-ꟹꭜ-ꭟꭩ豈-嗀塚晴凞-羽蘒諸逸-都飯-舘並-龎ﬀ-ﬆﬓ-ﬗיִײַ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-﷼︐-︙︰-﹄﹇-﹒﹔-﹦﹨-﹫ﹰ-ﹲﹴﹶ-ﻼ！-ﾾￂ-ￇￊ-ￏￒ-ￗￚ-ￜ￠-￦`;\n\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    const ranges = [];\n    const range = [];\n    const diacriticsRegex = /^\\p{M}$/u;\n    // Some chars must be replaced by their NFKC counterpart during a search.\n    for (let i = 0; i < 65536; i++) {\n      const c = String.fromCharCode(i);\n      if (c.normalize(\"NFKC\") !== c && !diacriticsRegex.test(c)) {\n        if (range.length !== 2) {\n          range[0] = range[1] = i;\n          continue;\n        }\n        if (range[1] + 1 !== i) {\n          if (range[0] === range[1]) {\n            ranges.push(String.fromCharCode(range[0]));\n          } else {\n            ranges.push(\n              `${String.fromCharCode(range[0])}-${String.fromCharCode(\n                range[1]\n              )}`\n            );\n          }\n          range[0] = range[1] = i;\n        } else {\n          range[1] = i;\n        }\n      }\n    }\n    if (ranges.join(\"\") !== NormalizeWithNFKC) {\n      throw new Error(\n        \"getNormalizeWithNFKC - update the `NormalizeWithNFKC` string.\"\n      );\n    }\n  }\n  return NormalizeWithNFKC;\n}\n\nexport { CharacterType, getCharacterType, getNormalizeWithNFKC };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFDocumentProxy} PDFDocumentProxy */\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n/** @typedef {import(\"./interfaces\").IPDFLinkService} IPDFLinkService */\n\nimport { binarySearchFirstItem, scrollIntoView } from \"./ui_utils.js\";\nimport { getCharacterType, getNormalizeWithNFKC } from \"./pdf_find_utils.js\";\n\nconst FindState = {\n  FOUND: 0,\n  NOT_FOUND: 1,\n  WRAPPED: 2,\n  PENDING: 3,\n};\n\nconst FIND_TIMEOUT = 250; // ms\nconst MATCH_SCROLL_OFFSET_TOP = -50; // px\nconst MATCH_SCROLL_OFFSET_LEFT = -400; // px\n\nconst CHARACTERS_TO_NORMALIZE = {\n  \"\\u2010\": \"-\", // Hyphen\n  \"\\u2018\": \"'\", // Left single quotation mark\n  \"\\u2019\": \"'\", // Right single quotation mark\n  \"\\u201A\": \"'\", // Single low-9 quotation mark\n  \"\\u201B\": \"'\", // Single high-reversed-9 quotation mark\n  \"\\u201C\": '\"', // Left double quotation mark\n  \"\\u201D\": '\"', // Right double quotation mark\n  \"\\u201E\": '\"', // Double low-9 quotation mark\n  \"\\u201F\": '\"', // Double high-reversed-9 quotation mark\n  \"\\u00BC\": \"1/4\", // Vulgar fraction one quarter\n  \"\\u00BD\": \"1/2\", // Vulgar fraction one half\n  \"\\u00BE\": \"3/4\", // Vulgar fraction three quarters\n};\n\n// These diacritics aren't considered as combining diacritics\n// when searching in a document:\n//   https://searchfox.org/mozilla-central/source/intl/unicharutil/util/is_combining_diacritic.py.\n// The combining class definitions can be found:\n//   https://www.unicode.org/reports/tr44/#Canonical_Combining_Class_Values\n// Category 0 corresponds to [^\\p{Mn}].\nconst DIACRITICS_EXCEPTION = new Set([\n  // UNICODE_COMBINING_CLASS_KANA_VOICING\n  // https://www.compart.com/fr/unicode/combining/8\n  0x3099, 0x309a,\n  // UNICODE_COMBINING_CLASS_VIRAMA (under 0xFFFF)\n  // https://www.compart.com/fr/unicode/combining/9\n  0x094d, 0x09cd, 0x0a4d, 0x0acd, 0x0b4d, 0x0bcd, 0x0c4d, 0x0ccd, 0x0d3b,\n  0x0d3c, 0x0d4d, 0x0dca, 0x0e3a, 0x0eba, 0x0f84, 0x1039, 0x103a, 0x1714,\n  0x1734, 0x17d2, 0x1a60, 0x1b44, 0x1baa, 0x1bab, 0x1bf2, 0x1bf3, 0x2d7f,\n  0xa806, 0xa82c, 0xa8c4, 0xa953, 0xa9c0, 0xaaf6, 0xabed,\n  // 91\n  // https://www.compart.com/fr/unicode/combining/91\n  0x0c56,\n  // 129\n  // https://www.compart.com/fr/unicode/combining/129\n  0x0f71,\n  // 130\n  // https://www.compart.com/fr/unicode/combining/130\n  0x0f72, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f80,\n  // 132\n  // https://www.compart.com/fr/unicode/combining/132\n  0x0f74,\n]);\nlet DIACRITICS_EXCEPTION_STR; // Lazily initialized, see below.\n\nconst DIACRITICS_REG_EXP = /\\p{M}+/gu;\nconst SPECIAL_CHARS_REG_EXP =\n  /([.*+?^${}()|[\\]\\\\])|(\\p{P})|(\\s+)|(\\p{M})|(\\p{L})/gu;\nconst NOT_DIACRITIC_FROM_END_REG_EXP = /([^\\p{M}])\\p{M}*$/u;\nconst NOT_DIACRITIC_FROM_START_REG_EXP = /^\\p{M}*([^\\p{M}])/u;\n\n// The range [AC00-D7AF] corresponds to the Hangul syllables.\n// The few other chars are some CJK Compatibility Ideographs.\nconst SYLLABLES_REG_EXP = /[\\uAC00-\\uD7AF\\uFA6C\\uFACF-\\uFAD1\\uFAD5-\\uFAD7]+/g;\nconst SYLLABLES_LENGTHS = new Map();\n// When decomposed (in using NFD) the above syllables will start\n// with one of the chars in this regexp.\nconst FIRST_CHAR_SYLLABLES_REG_EXP =\n  \"[\\\\u1100-\\\\u1112\\\\ud7a4-\\\\ud7af\\\\ud84a\\\\ud84c\\\\ud850\\\\ud854\\\\ud857\\\\ud85f]\";\n\nconst NFKC_CHARS_TO_NORMALIZE = new Map();\n\nlet noSyllablesRegExp = null;\nlet withSyllablesRegExp = null;\n\nfunction normalize(text) {\n  // The diacritics in the text or in the query can be composed or not.\n  // So we use a decomposed text using NFD (and the same for the query)\n  // in order to be sure that diacritics are in the same order.\n\n  // Collect syllables length and positions.\n  const syllablePositions = [];\n  let m;\n  while ((m = SYLLABLES_REG_EXP.exec(text)) !== null) {\n    let { index } = m;\n    for (const char of m[0]) {\n      let len = SYLLABLES_LENGTHS.get(char);\n      if (!len) {\n        len = char.normalize(\"NFD\").length;\n        SYLLABLES_LENGTHS.set(char, len);\n      }\n      syllablePositions.push([len, index++]);\n    }\n  }\n\n  let normalizationRegex;\n  if (syllablePositions.length === 0 && noSyllablesRegExp) {\n    normalizationRegex = noSyllablesRegExp;\n  } else if (syllablePositions.length > 0 && withSyllablesRegExp) {\n    normalizationRegex = withSyllablesRegExp;\n  } else {\n    // Compile the regular expression for text normalization once.\n    const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(\"\");\n    const toNormalizeWithNFKC = getNormalizeWithNFKC();\n\n    // 3040-309F: Hiragana\n    // 30A0-30FF: Katakana\n    const CJK = \"(?:\\\\p{Ideographic}|[\\u3040-\\u30FF])\";\n    const HKDiacritics = \"(?:\\u3099|\\u309A)\";\n    const CompoundWord = \"\\\\p{Ll}-\\\\n\\\\p{Lu}\";\n    const regexp = `([${replace}])|([${toNormalizeWithNFKC}])|(${HKDiacritics}\\\\n)|(\\\\p{M}+(?:-\\\\n)?)|(${CompoundWord})|(\\\\S-\\\\n)|(${CJK}\\\\n)|(\\\\n)`;\n\n    if (syllablePositions.length === 0) {\n      // Most of the syllables belong to Hangul so there are no need\n      // to search for them in a non-Hangul document.\n      // We use the \\0 in order to have the same number of groups.\n      normalizationRegex = noSyllablesRegExp = new RegExp(\n        regexp + \"|(\\\\u0000)\",\n        \"gum\"\n      );\n    } else {\n      normalizationRegex = withSyllablesRegExp = new RegExp(\n        regexp + `|(${FIRST_CHAR_SYLLABLES_REG_EXP})`,\n        \"gum\"\n      );\n    }\n  }\n\n  // The goal of this function is to normalize the string and\n  // be able to get from an index in the new string the\n  // corresponding index in the old string.\n  // For example if we have: abCd12ef456gh where C is replaced by ccc\n  // and numbers replaced by nothing (it's the case for diacritics), then\n  // we'll obtain the normalized string: abcccdefgh.\n  // So here the reverse map is: [0,1,2,2,2,3,6,7,11,12].\n\n  // The goal is to obtain the array: [[0, 0], [3, -1], [4, -2],\n  // [6, 0], [8, 3]].\n  // which can be used like this:\n  //  - let say that i is the index in new string and j the index\n  //    the old string.\n  //  - if i is in [0; 3[ then j = i + 0\n  //  - if i is in [3; 4[ then j = i - 1\n  //  - if i is in [4; 6[ then j = i - 2\n  //  ...\n  // Thanks to a binary search it's easy to know where is i and what's the\n  // shift.\n  // Let say that the last entry in the array is [x, s] and we have a\n  // substitution at index y (old string) which will replace o chars by n chars.\n  // Firstly, if o === n, then no need to add a new entry: the shift is\n  // the same.\n  // Secondly, if o < n, then we push the n - o elements:\n  // [y - (s - 1), s - 1], [y - (s - 2), s - 2], ...\n  // Thirdly, if o > n, then we push the element: [y - (s - n), o + s - n]\n\n  // Collect diacritics length and positions.\n  const rawDiacriticsPositions = [];\n  while ((m = DIACRITICS_REG_EXP.exec(text)) !== null) {\n    rawDiacriticsPositions.push([m[0].length, m.index]);\n  }\n\n  let normalized = text.normalize(\"NFD\");\n  const positions = [0, 0];\n  let rawDiacriticsIndex = 0;\n  let syllableIndex = 0;\n  let shift = 0;\n  let shiftOrigin = 0;\n  let eol = 0;\n  let hasDiacritics = false;\n\n  normalized = normalized.replace(\n    normalizationRegex,\n    (match, p1, p2, p3, p4, p5, p6, p7, p8, p9, i) => {\n      i -= shiftOrigin;\n      if (p1) {\n        // Maybe fractions or quotations mark...\n        const replacement = CHARACTERS_TO_NORMALIZE[p1];\n        const jj = replacement.length;\n        for (let j = 1; j < jj; j++) {\n          positions.push(i - shift + j, shift - j);\n        }\n        shift -= jj - 1;\n        return replacement;\n      }\n\n      if (p2) {\n        // Use the NFKC representation to normalize the char.\n        let replacement = NFKC_CHARS_TO_NORMALIZE.get(p2);\n        if (!replacement) {\n          replacement = p2.normalize(\"NFKC\");\n          NFKC_CHARS_TO_NORMALIZE.set(p2, replacement);\n        }\n        const jj = replacement.length;\n        for (let j = 1; j < jj; j++) {\n          positions.push(i - shift + j, shift - j);\n        }\n        shift -= jj - 1;\n        return replacement;\n      }\n\n      if (p3) {\n        // We've a Katakana-Hiragana diacritic followed by a \\n so don't replace\n        // the \\n by a whitespace.\n        hasDiacritics = true;\n\n        // Diacritic.\n        if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) {\n          ++rawDiacriticsIndex;\n        } else {\n          // i is the position of the first diacritic\n          // so (i - 1) is the position for the letter before.\n          positions.push(i - 1 - shift + 1, shift - 1);\n          shift -= 1;\n          shiftOrigin += 1;\n        }\n\n        // End-of-line.\n        positions.push(i - shift + 1, shift);\n        shiftOrigin += 1;\n        eol += 1;\n\n        return p3.charAt(0);\n      }\n\n      if (p4) {\n        const hasTrailingDashEOL = p4.endsWith(\"\\n\");\n        const len = hasTrailingDashEOL ? p4.length - 2 : p4.length;\n\n        // Diacritics.\n        hasDiacritics = true;\n        let jj = len;\n        if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) {\n          jj -= rawDiacriticsPositions[rawDiacriticsIndex][0];\n          ++rawDiacriticsIndex;\n        }\n\n        for (let j = 1; j <= jj; j++) {\n          // i is the position of the first diacritic\n          // so (i - 1) is the position for the letter before.\n          positions.push(i - 1 - shift + j, shift - j);\n        }\n        shift -= jj;\n        shiftOrigin += jj;\n\n        if (hasTrailingDashEOL) {\n          // Diacritics are followed by a -\\n.\n          // See comments in `if (p6)` block.\n          i += len - 1;\n          positions.push(i - shift + 1, 1 + shift);\n          shift += 1;\n          shiftOrigin += 1;\n          eol += 1;\n          return p4.slice(0, len);\n        }\n\n        return p4;\n      }\n\n      if (p5) {\n        // Compound word with a line break after the hyphen.\n        // Since the \\n isn't in the original text, o = 3 and n = 3.\n        shiftOrigin += 1;\n        eol += 1;\n        return p5.replace(\"\\n\", \"\");\n      }\n\n      if (p6) {\n        // \"X-\\n\" is removed because an hyphen at the end of a line\n        // with not a space before is likely here to mark a break\n        // in a word.\n        // If X is encoded with UTF-32 then it can have a length greater than 1.\n        // The \\n isn't in the original text so here y = i, n = X.len - 2 and\n        // o = X.len - 1.\n        const len = p6.length - 2;\n        positions.push(i - shift + len, 1 + shift);\n        shift += 1;\n        shiftOrigin += 1;\n        eol += 1;\n        return p6.slice(0, -2);\n      }\n\n      if (p7) {\n        // An ideographic at the end of a line doesn't imply adding an extra\n        // white space.\n        // A CJK can be encoded in UTF-32, hence their length isn't always 1.\n        const len = p7.length - 1;\n        positions.push(i - shift + len, shift);\n        shiftOrigin += 1;\n        eol += 1;\n        return p7.slice(0, -1);\n      }\n\n      if (p8) {\n        // eol is replaced by space: \"foo\\nbar\" is likely equivalent to\n        // \"foo bar\".\n        positions.push(i - shift + 1, shift - 1);\n        shift -= 1;\n        shiftOrigin += 1;\n        eol += 1;\n        return \" \";\n      }\n\n      // p8\n      if (i + eol === syllablePositions[syllableIndex]?.[1]) {\n        // A syllable (1 char) is replaced with several chars (n) so\n        // newCharsLen = n - 1.\n        const newCharLen = syllablePositions[syllableIndex][0] - 1;\n        ++syllableIndex;\n        for (let j = 1; j <= newCharLen; j++) {\n          positions.push(i - (shift - j), shift - j);\n        }\n        shift -= newCharLen;\n        shiftOrigin += newCharLen;\n      }\n      return p9;\n    }\n  );\n\n  positions.push(normalized.length, shift);\n  const starts = new Uint32Array(positions.length >> 1);\n  const shifts = new Int32Array(positions.length >> 1);\n  for (let i = 0, ii = positions.length; i < ii; i += 2) {\n    starts[i >> 1] = positions[i];\n    shifts[i >> 1] = positions[i + 1];\n  }\n\n  return [normalized, [starts, shifts], hasDiacritics];\n}\n\n// Determine the original, non-normalized, match index such that highlighting of\n// search results is correct in the `textLayer` for strings containing e.g. \"½\"\n// characters; essentially \"inverting\" the result of the `normalize` function.\nfunction getOriginalIndex(diffs, pos, len) {\n  if (!diffs) {\n    return [pos, len];\n  }\n\n  const [starts, shifts] = diffs;\n  // First char in the new string.\n  const start = pos;\n  // Last char in the new string.\n  const end = pos + len - 1;\n  let i = binarySearchFirstItem(starts, x => x >= start);\n  if (starts[i] > start) {\n    --i;\n  }\n\n  let j = binarySearchFirstItem(starts, x => x >= end, i);\n  if (starts[j] > end) {\n    --j;\n  }\n\n  // First char in the old string.\n  const oldStart = start + shifts[i];\n\n  // Last char in the old string.\n  const oldEnd = end + shifts[j];\n  const oldLen = oldEnd + 1 - oldStart;\n\n  return [oldStart, oldLen];\n}\n\n/**\n * @typedef {Object} PDFFindControllerOptions\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n * @property {boolean} [updateMatchesCountOnProgress] - True if the matches\n *   count must be updated on progress or only when the last page is reached.\n *   The default value is `true`.\n */\n\n/**\n * Provides search functionality to find a given string in a PDF document.\n */\nclass PDFFindController {\n  #state = null;\n\n  #updateMatchesCountOnProgress = true;\n\n  #visitedPagesCount = 0;\n\n  /**\n   * @param {PDFFindControllerOptions} options\n   */\n  constructor({ linkService, eventBus, updateMatchesCountOnProgress = true }) {\n    this._linkService = linkService;\n    this._eventBus = eventBus;\n    this.#updateMatchesCountOnProgress = updateMatchesCountOnProgress;\n\n    /**\n     * Callback used to check if a `pageNumber` is currently visible.\n     * @type {function}\n     */\n    this.onIsPageVisible = null;\n\n    this.#reset();\n    eventBus._on(\"find\", this.#onFind.bind(this));\n    eventBus._on(\"findbarclose\", this.#onFindBarClose.bind(this));\n  }\n\n  get highlightMatches() {\n    return this._highlightMatches;\n  }\n\n  get pageMatches() {\n    return this._pageMatches;\n  }\n\n  get pageMatchesLength() {\n    return this._pageMatchesLength;\n  }\n\n  get selected() {\n    return this._selected;\n  }\n\n  get state() {\n    return this.#state;\n  }\n\n  /**\n   * Set a reference to the PDF document in order to search it.\n   * Note that searching is not possible if this method is not called.\n   *\n   * @param {PDFDocumentProxy} pdfDocument - The PDF document to search.\n   */\n  setDocument(pdfDocument) {\n    if (this._pdfDocument) {\n      this.#reset();\n    }\n    if (!pdfDocument) {\n      return;\n    }\n    this._pdfDocument = pdfDocument;\n    this._firstPageCapability.resolve();\n  }\n\n  #onFind(state) {\n    if (!state) {\n      return;\n    }\n    const pdfDocument = this._pdfDocument;\n    const { type } = state;\n\n    if (this.#state === null || this.#shouldDirtyMatch(state)) {\n      this._dirtyMatch = true;\n    }\n    this.#state = state;\n    if (type !== \"highlightallchange\") {\n      this.#updateUIState(FindState.PENDING);\n    }\n\n    this._firstPageCapability.promise.then(() => {\n      // If the document was closed before searching began, or if the search\n      // operation was relevant for a previously opened document, do nothing.\n      if (\n        !this._pdfDocument ||\n        (pdfDocument && this._pdfDocument !== pdfDocument)\n      ) {\n        return;\n      }\n      this.#extractText();\n\n      const findbarClosed = !this._highlightMatches;\n      const pendingTimeout = !!this._findTimeout;\n\n      if (this._findTimeout) {\n        clearTimeout(this._findTimeout);\n        this._findTimeout = null;\n      }\n      if (!type) {\n        // Trigger the find action with a small delay to avoid starting the\n        // search when the user is still typing (saving resources).\n        this._findTimeout = setTimeout(() => {\n          this.#nextMatch();\n          this._findTimeout = null;\n        }, FIND_TIMEOUT);\n      } else if (this._dirtyMatch) {\n        // Immediately trigger searching for non-'find' operations, when the\n        // current state needs to be reset and matches re-calculated.\n        this.#nextMatch();\n      } else if (type === \"again\") {\n        this.#nextMatch();\n\n        // When the findbar was previously closed, and `highlightAll` is set,\n        // ensure that the matches on all active pages are highlighted again.\n        if (findbarClosed && this.#state.highlightAll) {\n          this.#updateAllPages();\n        }\n      } else if (type === \"highlightallchange\") {\n        // If there was a pending search operation, synchronously trigger a new\n        // search *first* to ensure that the correct matches are highlighted.\n        if (pendingTimeout) {\n          this.#nextMatch();\n        } else {\n          this._highlightMatches = true;\n        }\n        this.#updateAllPages(); // Update the highlighting on all active pages.\n      } else {\n        this.#nextMatch();\n      }\n    });\n  }\n\n  /**\n   * @typedef {Object} PDFFindControllerScrollMatchIntoViewParams\n   * @property {HTMLElement} element\n   * @property {number} selectedLeft\n   * @property {number} pageIndex\n   * @property {number} matchIndex\n   */\n\n  /**\n   * Scroll the current match into view.\n   * @param {PDFFindControllerScrollMatchIntoViewParams}\n   */\n  scrollMatchIntoView({\n    element = null,\n    selectedLeft = 0,\n    pageIndex = -1,\n    matchIndex = -1,\n  }) {\n    if (!this._scrollMatches || !element) {\n      return;\n    } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {\n      return;\n    } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {\n      return;\n    }\n    this._scrollMatches = false; // Ensure that scrolling only happens once.\n\n    const spot = {\n      top: MATCH_SCROLL_OFFSET_TOP,\n      left: selectedLeft + MATCH_SCROLL_OFFSET_LEFT,\n    };\n    scrollIntoView(element, spot, /* scrollMatches = */ true);\n  }\n\n  #reset() {\n    this._highlightMatches = false;\n    this._scrollMatches = false;\n    this._pdfDocument = null;\n    this._pageMatches = [];\n    this._pageMatchesLength = [];\n    this.#visitedPagesCount = 0;\n    this.#state = null;\n    // Currently selected match.\n    this._selected = {\n      pageIdx: -1,\n      matchIdx: -1,\n    };\n    // Where the find algorithm currently is in the document.\n    this._offset = {\n      pageIdx: null,\n      matchIdx: null,\n      wrapped: false,\n    };\n    this._extractTextPromises = [];\n    this._pageContents = []; // Stores the normalized text for each page.\n    this._pageDiffs = [];\n    this._hasDiacritics = [];\n    this._matchesCountTotal = 0;\n    this._pagesToSearch = null;\n    this._pendingFindMatches = new Set();\n    this._resumePageIdx = null;\n    this._dirtyMatch = false;\n    clearTimeout(this._findTimeout);\n    this._findTimeout = null;\n\n    this._firstPageCapability = Promise.withResolvers();\n  }\n\n  /**\n   * @type {string|Array} The (current) normalized search query.\n   */\n  get #query() {\n    const { query } = this.#state;\n    if (typeof query === \"string\") {\n      if (query !== this._rawQuery) {\n        this._rawQuery = query;\n        [this._normalizedQuery] = normalize(query);\n      }\n      return this._normalizedQuery;\n    }\n    // We don't bother caching the normalized search query in the Array-case,\n    // since this code-path is *essentially* unused in the default viewer.\n    return (query || []).filter(q => !!q).map(q => normalize(q)[0]);\n  }\n\n  #shouldDirtyMatch(state) {\n    // When the search query changes, regardless of the actual search command\n    // used, always re-calculate matches to avoid errors (fixes bug 1030622).\n    const newQuery = state.query,\n      prevQuery = this.#state.query;\n    const newType = typeof newQuery,\n      prevType = typeof prevQuery;\n\n    if (newType !== prevType) {\n      return true;\n    }\n    if (newType === \"string\") {\n      if (newQuery !== prevQuery) {\n        return true;\n      }\n    } else if (\n      /* isArray && */ JSON.stringify(newQuery) !== JSON.stringify(prevQuery)\n    ) {\n      return true;\n    }\n\n    switch (state.type) {\n      case \"again\":\n        const pageNumber = this._selected.pageIdx + 1;\n        const linkService = this._linkService;\n        // Only treat a 'findagain' event as a new search operation when it's\n        // *absolutely* certain that the currently selected match is no longer\n        // visible, e.g. as a result of the user scrolling in the document.\n        //\n        // NOTE: If only a simple `this._linkService.page` check was used here,\n        // there's a risk that consecutive 'findagain' operations could \"skip\"\n        // over matches at the top/bottom of pages thus making them completely\n        // inaccessible when there's multiple pages visible in the viewer.\n        return (\n          pageNumber >= 1 &&\n          pageNumber <= linkService.pagesCount &&\n          pageNumber !== linkService.page &&\n          !(this.onIsPageVisible?.(pageNumber) ?? true)\n        );\n      case \"highlightallchange\":\n        return false;\n    }\n    return true;\n  }\n\n  /**\n   * Determine if the search query constitutes a \"whole word\", by comparing the\n   * first/last character type with the preceding/following character type.\n   */\n  #isEntireWord(content, startIdx, length) {\n    let match = content\n      .slice(0, startIdx)\n      .match(NOT_DIACRITIC_FROM_END_REG_EXP);\n    if (match) {\n      const first = content.charCodeAt(startIdx);\n      const limit = match[1].charCodeAt(0);\n      if (getCharacterType(first) === getCharacterType(limit)) {\n        return false;\n      }\n    }\n\n    match = content\n      .slice(startIdx + length)\n      .match(NOT_DIACRITIC_FROM_START_REG_EXP);\n    if (match) {\n      const last = content.charCodeAt(startIdx + length - 1);\n      const limit = match[1].charCodeAt(0);\n      if (getCharacterType(last) === getCharacterType(limit)) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  #convertToRegExpString(query, hasDiacritics) {\n    const { matchDiacritics } = this.#state;\n    let isUnicode = false;\n    query = query.replaceAll(\n      SPECIAL_CHARS_REG_EXP,\n      (\n        match,\n        p1 /* to escape */,\n        p2 /* punctuation */,\n        p3 /* whitespaces */,\n        p4 /* diacritics */,\n        p5 /* letters */\n      ) => {\n        // We don't need to use a \\s for whitespaces since all the different\n        // kind of whitespaces are replaced by a single \" \".\n\n        if (p1) {\n          // Escape characters like *+?... to not interfer with regexp syntax.\n          return `[ ]*\\\\${p1}[ ]*`;\n        }\n        if (p2) {\n          // Allow whitespaces around punctuation signs.\n          return `[ ]*${p2}[ ]*`;\n        }\n        if (p3) {\n          // Replace spaces by \\s+ to be sure to match any spaces.\n          return \"[ ]+\";\n        }\n        if (matchDiacritics) {\n          return p4 || p5;\n        }\n\n        if (p4) {\n          // Diacritics are removed with few exceptions.\n          return DIACRITICS_EXCEPTION.has(p4.charCodeAt(0)) ? p4 : \"\";\n        }\n\n        // A letter has been matched and it can be followed by any diacritics\n        // in normalized text.\n        if (hasDiacritics) {\n          isUnicode = true;\n          return `${p5}\\\\p{M}*`;\n        }\n        return p5;\n      }\n    );\n\n    const trailingSpaces = \"[ ]*\";\n    if (query.endsWith(trailingSpaces)) {\n      // The [ ]* has been added in order to help to match \"foo . bar\" but\n      // it doesn't make sense to match some whitespaces after the dot\n      // when it's the last character.\n      query = query.slice(0, query.length - trailingSpaces.length);\n    }\n\n    if (matchDiacritics) {\n      // aX must not match aXY.\n      if (hasDiacritics) {\n        DIACRITICS_EXCEPTION_STR ||= String.fromCharCode(\n          ...DIACRITICS_EXCEPTION\n        );\n\n        isUnicode = true;\n        query = `${query}(?=[${DIACRITICS_EXCEPTION_STR}]|[^\\\\p{M}]|$)`;\n      }\n    }\n\n    return [isUnicode, query];\n  }\n\n  #calculateMatch(pageIndex) {\n    const query = this.#query;\n    if (query.length === 0) {\n      return; // Do nothing: the matches should be wiped out already.\n    }\n    const pageContent = this._pageContents[pageIndex];\n    const matcherResult = this.match(query, pageContent, pageIndex);\n\n    const matches = (this._pageMatches[pageIndex] = []);\n    const matchesLength = (this._pageMatchesLength[pageIndex] = []);\n    const diffs = this._pageDiffs[pageIndex];\n\n    matcherResult?.forEach(({ index, length }) => {\n      const [matchPos, matchLen] = getOriginalIndex(diffs, index, length);\n      if (matchLen) {\n        matches.push(matchPos);\n        matchesLength.push(matchLen);\n      }\n    });\n\n    // When `highlightAll` is set, ensure that the matches on previously\n    // rendered (and still active) pages are correctly highlighted.\n    if (this.#state.highlightAll) {\n      this.#updatePage(pageIndex);\n    }\n    if (this._resumePageIdx === pageIndex) {\n      this._resumePageIdx = null;\n      this.#nextPageMatch();\n    }\n\n    // Update the match count.\n    const pageMatchesCount = matches.length;\n    this._matchesCountTotal += pageMatchesCount;\n    if (this.#updateMatchesCountOnProgress) {\n      if (pageMatchesCount > 0) {\n        this.#updateUIResultsCount();\n      }\n    } else if (++this.#visitedPagesCount === this._linkService.pagesCount) {\n      // For example, in GeckoView we want to have only the final update because\n      // the Java side provides only one object to update the counts.\n      this.#updateUIResultsCount();\n    }\n  }\n\n  /**\n   * @typedef {Object} FindMatch\n   * @property {number} index - The start of the matched text in the page's\n   *   string contents.\n   * @property {number} length - The length of the matched text.\n   */\n\n  /**\n   * @param {string | string[]} query - The search query.\n   * @param {string} pageContent - The text content of the page to search in.\n   * @param {number} pageIndex - The index of the page that is being processed.\n   * @returns {FindMatch[] | undefined} An array of matches in the provided\n   *   page.\n   */\n  match(query, pageContent, pageIndex) {\n    const hasDiacritics = this._hasDiacritics[pageIndex];\n\n    let isUnicode = false;\n    if (typeof query === \"string\") {\n      [isUnicode, query] = this.#convertToRegExpString(query, hasDiacritics);\n    } else {\n      // Words are sorted in reverse order to be sure that \"foobar\" is matched\n      // before \"foo\" in case the query is \"foobar foo\".\n      query = query\n        .sort()\n        .reverse()\n        .map(q => {\n          const [isUnicodePart, queryPart] = this.#convertToRegExpString(\n            q,\n            hasDiacritics\n          );\n          isUnicode ||= isUnicodePart;\n          return `(${queryPart})`;\n        })\n        .join(\"|\");\n    }\n    if (!query) {\n      // The query can be empty because some chars like diacritics could have\n      // been stripped out.\n      return undefined;\n    }\n\n    const { caseSensitive, entireWord } = this.#state;\n    const flags = `g${isUnicode ? \"u\" : \"\"}${caseSensitive ? \"\" : \"i\"}`;\n    query = new RegExp(query, flags);\n\n    const matches = [];\n    let match;\n    while ((match = query.exec(pageContent)) !== null) {\n      if (\n        entireWord &&\n        !this.#isEntireWord(pageContent, match.index, match[0].length)\n      ) {\n        continue;\n      }\n      matches.push({ index: match.index, length: match[0].length });\n    }\n    return matches;\n  }\n\n  #extractText() {\n    // Perform text extraction once if this method is called multiple times.\n    if (this._extractTextPromises.length > 0) {\n      return;\n    }\n\n    let deferred = Promise.resolve();\n    const textOptions = { disableNormalization: true };\n    for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) {\n      const { promise, resolve } = Promise.withResolvers();\n      this._extractTextPromises[i] = promise;\n\n      // eslint-disable-next-line arrow-body-style\n      deferred = deferred.then(() => {\n        return this._pdfDocument\n          .getPage(i + 1)\n          .then(pdfPage => pdfPage.getTextContent(textOptions))\n          .then(\n            textContent => {\n              const strBuf = [];\n\n              for (const textItem of textContent.items) {\n                strBuf.push(textItem.str);\n                if (textItem.hasEOL) {\n                  strBuf.push(\"\\n\");\n                }\n              }\n\n              // Store the normalized page content (text items) as one string.\n              [\n                this._pageContents[i],\n                this._pageDiffs[i],\n                this._hasDiacritics[i],\n              ] = normalize(strBuf.join(\"\"));\n              resolve();\n            },\n            reason => {\n              console.error(\n                `Unable to get text content for page ${i + 1}`,\n                reason\n              );\n              // Page error -- assuming no text content.\n              this._pageContents[i] = \"\";\n              this._pageDiffs[i] = null;\n              this._hasDiacritics[i] = false;\n              resolve();\n            }\n          );\n      });\n    }\n  }\n\n  #updatePage(index) {\n    if (this._scrollMatches && this._selected.pageIdx === index) {\n      // If the page is selected, scroll the page into view, which triggers\n      // rendering the page, which adds the text layer. Once the text layer\n      // is built, it will attempt to scroll the selected match into view.\n      this._linkService.page = index + 1;\n    }\n\n    this._eventBus.dispatch(\"updatetextlayermatches\", {\n      source: this,\n      pageIndex: index,\n    });\n  }\n\n  #updateAllPages() {\n    this._eventBus.dispatch(\"updatetextlayermatches\", {\n      source: this,\n      pageIndex: -1,\n    });\n  }\n\n  #nextMatch() {\n    const previous = this.#state.findPrevious;\n    const currentPageIndex = this._linkService.page - 1;\n    const numPages = this._linkService.pagesCount;\n\n    this._highlightMatches = true;\n\n    if (this._dirtyMatch) {\n      // Need to recalculate the matches, reset everything.\n      this._dirtyMatch = false;\n      this._selected.pageIdx = this._selected.matchIdx = -1;\n      this._offset.pageIdx = currentPageIndex;\n      this._offset.matchIdx = null;\n      this._offset.wrapped = false;\n      this._resumePageIdx = null;\n      this._pageMatches.length = 0;\n      this._pageMatchesLength.length = 0;\n      this.#visitedPagesCount = 0;\n      this._matchesCountTotal = 0;\n\n      this.#updateAllPages(); // Wipe out any previously highlighted matches.\n\n      for (let i = 0; i < numPages; i++) {\n        // Start finding the matches as soon as the text is extracted.\n        if (this._pendingFindMatches.has(i)) {\n          continue;\n        }\n        this._pendingFindMatches.add(i);\n        this._extractTextPromises[i].then(() => {\n          this._pendingFindMatches.delete(i);\n          this.#calculateMatch(i);\n        });\n      }\n    }\n\n    // If there's no query there's no point in searching.\n    const query = this.#query;\n    if (query.length === 0) {\n      this.#updateUIState(FindState.FOUND);\n      return;\n    }\n    // If we're waiting on a page, we return since we can't do anything else.\n    if (this._resumePageIdx) {\n      return;\n    }\n\n    const offset = this._offset;\n    // Keep track of how many pages we should maximally iterate through.\n    this._pagesToSearch = numPages;\n    // If there's already a `matchIdx` that means we are iterating through a\n    // page's matches.\n    if (offset.matchIdx !== null) {\n      const numPageMatches = this._pageMatches[offset.pageIdx].length;\n      if (\n        (!previous && offset.matchIdx + 1 < numPageMatches) ||\n        (previous && offset.matchIdx > 0)\n      ) {\n        // The simple case; we just have advance the matchIdx to select\n        // the next match on the page.\n        offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;\n        this.#updateMatch(/* found = */ true);\n        return;\n      }\n      // We went beyond the current page's matches, so we advance to\n      // the next page.\n      this.#advanceOffsetPage(previous);\n    }\n    // Start searching through the page.\n    this.#nextPageMatch();\n  }\n\n  #matchesReady(matches) {\n    const offset = this._offset;\n    const numMatches = matches.length;\n    const previous = this.#state.findPrevious;\n\n    if (numMatches) {\n      // There were matches for the page, so initialize `matchIdx`.\n      offset.matchIdx = previous ? numMatches - 1 : 0;\n      this.#updateMatch(/* found = */ true);\n      return true;\n    }\n    // No matches, so attempt to search the next page.\n    this.#advanceOffsetPage(previous);\n    if (offset.wrapped) {\n      offset.matchIdx = null;\n      if (this._pagesToSearch < 0) {\n        // No point in wrapping again, there were no matches.\n        this.#updateMatch(/* found = */ false);\n        // While matches were not found, searching for a page\n        // with matches should nevertheless halt.\n        return true;\n      }\n    }\n    // Matches were not found (and searching is not done).\n    return false;\n  }\n\n  #nextPageMatch() {\n    if (this._resumePageIdx !== null) {\n      console.error(\"There can only be one pending page.\");\n    }\n\n    let matches = null;\n    do {\n      const pageIdx = this._offset.pageIdx;\n      matches = this._pageMatches[pageIdx];\n      if (!matches) {\n        // The matches don't exist yet for processing by `_matchesReady`,\n        // so set a resume point for when they do exist.\n        this._resumePageIdx = pageIdx;\n        break;\n      }\n    } while (!this.#matchesReady(matches));\n  }\n\n  #advanceOffsetPage(previous) {\n    const offset = this._offset;\n    const numPages = this._linkService.pagesCount;\n    offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;\n    offset.matchIdx = null;\n\n    this._pagesToSearch--;\n\n    if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n      offset.pageIdx = previous ? numPages - 1 : 0;\n      offset.wrapped = true;\n    }\n  }\n\n  #updateMatch(found = false) {\n    let state = FindState.NOT_FOUND;\n    const wrapped = this._offset.wrapped;\n    this._offset.wrapped = false;\n\n    if (found) {\n      const previousPage = this._selected.pageIdx;\n      this._selected.pageIdx = this._offset.pageIdx;\n      this._selected.matchIdx = this._offset.matchIdx;\n      state = wrapped ? FindState.WRAPPED : FindState.FOUND;\n\n      // Update the currently selected page to wipe out any selected matches.\n      if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {\n        this.#updatePage(previousPage);\n      }\n    }\n\n    this.#updateUIState(state, this.#state.findPrevious);\n    if (this._selected.pageIdx !== -1) {\n      // Ensure that the match will be scrolled into view.\n      this._scrollMatches = true;\n\n      this.#updatePage(this._selected.pageIdx);\n    }\n  }\n\n  #onFindBarClose(evt) {\n    const pdfDocument = this._pdfDocument;\n    // Since searching is asynchronous, ensure that the removal of highlighted\n    // matches (from the UI) is async too such that the 'updatetextlayermatches'\n    // events will always be dispatched in the expected order.\n    this._firstPageCapability.promise.then(() => {\n      // Only update the UI if the document is open, and is the current one.\n      if (\n        !this._pdfDocument ||\n        (pdfDocument && this._pdfDocument !== pdfDocument)\n      ) {\n        return;\n      }\n      // Ensure that a pending, not yet started, search operation is aborted.\n      if (this._findTimeout) {\n        clearTimeout(this._findTimeout);\n        this._findTimeout = null;\n      }\n      // Abort any long running searches, to avoid a match being scrolled into\n      // view *after* the findbar has been closed. In this case `this._offset`\n      // will most likely differ from `this._selected`, hence we also ensure\n      // that any new search operation will always start with a clean slate.\n      if (this._resumePageIdx) {\n        this._resumePageIdx = null;\n        this._dirtyMatch = true;\n      }\n      // Avoid the UI being in a pending state when the findbar is re-opened.\n      this.#updateUIState(FindState.FOUND);\n\n      this._highlightMatches = false;\n      this.#updateAllPages(); // Wipe out any previously highlighted matches.\n    });\n  }\n\n  #requestMatchesCount() {\n    const { pageIdx, matchIdx } = this._selected;\n    let current = 0,\n      total = this._matchesCountTotal;\n    if (matchIdx !== -1) {\n      for (let i = 0; i < pageIdx; i++) {\n        current += this._pageMatches[i]?.length || 0;\n      }\n      current += matchIdx + 1;\n    }\n    // When searching starts, this method may be called before the `pageMatches`\n    // have been counted (in `#calculateMatch`). Ensure that the UI won't show\n    // temporarily broken state when the active find result doesn't make sense.\n    if (current < 1 || current > total) {\n      current = total = 0;\n    }\n    return { current, total };\n  }\n\n  #updateUIResultsCount() {\n    this._eventBus.dispatch(\"updatefindmatchescount\", {\n      source: this,\n      matchesCount: this.#requestMatchesCount(),\n    });\n  }\n\n  #updateUIState(state, previous = false) {\n    if (\n      !this.#updateMatchesCountOnProgress &&\n      (this.#visitedPagesCount !== this._linkService.pagesCount ||\n        state === FindState.PENDING)\n    ) {\n      // When this.#updateMatchesCountOnProgress is false we only send an update\n      // when everything is ready.\n      return;\n    }\n\n    this._eventBus.dispatch(\"updatefindcontrolstate\", {\n      source: this,\n      state,\n      previous,\n      entireWord: this.#state?.entireWord ?? null,\n      matchesCount: this.#requestMatchesCount(),\n      rawQuery: this.#state?.query ?? null,\n    });\n  }\n}\n\nexport { FindState, PDFFindController };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n/** @typedef {import(\"./interfaces\").IPDFLinkService} IPDFLinkService */\n\nimport { parseQueryString } from \"./ui_utils.js\";\n\nconst DEFAULT_LINK_REL = \"noopener noreferrer nofollow\";\n\nconst LinkTarget = {\n  NONE: 0, // Default value.\n  SELF: 1,\n  BLANK: 2,\n  PARENT: 3,\n  TOP: 4,\n};\n\n/**\n * @typedef {Object} PDFLinkServiceOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [externalLinkTarget] - Specifies the `target` attribute\n *   for external links. Must use one of the values from {LinkTarget}.\n *   Defaults to using no target.\n * @property {string} [externalLinkRel] - Specifies the `rel` attribute for\n *   external links. Defaults to stripping the referrer.\n * @property {boolean} [ignoreDestinationZoom] - Ignores the zoom argument,\n *   thus preserving the current zoom level in the viewer, when navigating\n *   to internal destinations. The default value is `false`.\n */\n\n/**\n * Performs navigation functions inside PDF, such as opening specified page,\n * or destination.\n * @implements {IPDFLinkService}\n */\nclass PDFLinkService {\n  externalLinkEnabled = true;\n\n  /**\n   * @param {PDFLinkServiceOptions} options\n   */\n  constructor({\n    eventBus,\n    externalLinkTarget = null,\n    externalLinkRel = null,\n    ignoreDestinationZoom = false,\n  } = {}) {\n    this.eventBus = eventBus;\n    this.externalLinkTarget = externalLinkTarget;\n    this.externalLinkRel = externalLinkRel;\n    this._ignoreDestinationZoom = ignoreDestinationZoom;\n\n    this.baseUrl = null;\n    this.pdfDocument = null;\n    this.pdfViewer = null;\n    this.pdfHistory = null;\n  }\n\n  setDocument(pdfDocument, baseUrl = null) {\n    this.baseUrl = baseUrl;\n    this.pdfDocument = pdfDocument;\n  }\n\n  setViewer(pdfViewer) {\n    this.pdfViewer = pdfViewer;\n  }\n\n  setHistory(pdfHistory) {\n    this.pdfHistory = pdfHistory;\n  }\n\n  /**\n   * @type {number}\n   */\n  get pagesCount() {\n    return this.pdfDocument ? this.pdfDocument.numPages : 0;\n  }\n\n  /**\n   * @type {number}\n   */\n  get page() {\n    return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set page(value) {\n    if (this.pdfDocument) {\n      this.pdfViewer.currentPageNumber = value;\n    }\n  }\n\n  /**\n   * @type {number}\n   */\n  get rotation() {\n    return this.pdfDocument ? this.pdfViewer.pagesRotation : 0;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set rotation(value) {\n    if (this.pdfDocument) {\n      this.pdfViewer.pagesRotation = value;\n    }\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get isInPresentationMode() {\n    return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false;\n  }\n\n  /**\n   * This method will, when available, also update the browser history.\n   *\n   * @param {string|Array} dest - The named, or explicit, PDF destination.\n   */\n  async goToDestination(dest) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    let namedDest, explicitDest, pageNumber;\n    if (typeof dest === \"string\") {\n      namedDest = dest;\n      explicitDest = await this.pdfDocument.getDestination(dest);\n    } else {\n      namedDest = null;\n      explicitDest = await dest;\n    }\n    if (!Array.isArray(explicitDest)) {\n      console.error(\n        `goToDestination: \"${explicitDest}\" is not a valid destination array, for dest=\"${dest}\".`\n      );\n      return;\n    }\n    // Dest array looks like that: <page-ref> </XYZ|/FitXXX> <args..>\n    const [destRef] = explicitDest;\n\n    if (destRef && typeof destRef === \"object\") {\n      pageNumber = this.pdfDocument.cachedPageNumber(destRef);\n\n      if (!pageNumber) {\n        // Fetch the page reference if it's not yet available. This could\n        // only occur during loading, before all pages have been resolved.\n        try {\n          pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1;\n        } catch {\n          console.error(\n            `goToDestination: \"${destRef}\" is not a valid page reference, for dest=\"${dest}\".`\n          );\n          return;\n        }\n      }\n    } else if (Number.isInteger(destRef)) {\n      pageNumber = destRef + 1;\n    }\n    if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {\n      console.error(\n        `goToDestination: \"${pageNumber}\" is not a valid page number, for dest=\"${dest}\".`\n      );\n      return;\n    }\n\n    if (this.pdfHistory) {\n      // Update the browser history before scrolling the new destination into\n      // view, to be able to accurately capture the current document position.\n      this.pdfHistory.pushCurrentPosition();\n      this.pdfHistory.push({ namedDest, explicitDest, pageNumber });\n    }\n\n    this.pdfViewer.scrollPageIntoView({\n      pageNumber,\n      destArray: explicitDest,\n      ignoreDestinationZoom: this._ignoreDestinationZoom,\n    });\n  }\n\n  /**\n   * This method will, when available, also update the browser history.\n   *\n   * @param {number|string} val - The page number, or page label.\n   */\n  goToPage(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const pageNumber =\n      (typeof val === \"string\" && this.pdfViewer.pageLabelToPageNumber(val)) ||\n      val | 0;\n    if (\n      !(\n        Number.isInteger(pageNumber) &&\n        pageNumber > 0 &&\n        pageNumber <= this.pagesCount\n      )\n    ) {\n      console.error(`PDFLinkService.goToPage: \"${val}\" is not a valid page.`);\n      return;\n    }\n\n    if (this.pdfHistory) {\n      // Update the browser history before scrolling the new page into view,\n      // to be able to accurately capture the current document position.\n      this.pdfHistory.pushCurrentPosition();\n      this.pdfHistory.pushPage(pageNumber);\n    }\n\n    this.pdfViewer.scrollPageIntoView({ pageNumber });\n  }\n\n  /**\n   * Adds various attributes (href, title, target, rel) to hyperlinks.\n   * @param {HTMLAnchorElement} link\n   * @param {string} url\n   * @param {boolean} [newWindow]\n   */\n  addLinkAttributes(link, url, newWindow = false) {\n    if (!url || typeof url !== \"string\") {\n      throw new Error('A valid \"url\" parameter must provided.');\n    }\n    const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget,\n      rel = this.externalLinkRel;\n\n    if (this.externalLinkEnabled) {\n      link.href = link.title = url;\n    } else {\n      link.href = \"\";\n      link.title = `Disabled: ${url}`;\n      link.onclick = () => false;\n    }\n\n    let targetStr = \"\"; // LinkTarget.NONE\n    switch (target) {\n      case LinkTarget.NONE:\n        break;\n      case LinkTarget.SELF:\n        targetStr = \"_self\";\n        break;\n      case LinkTarget.BLANK:\n        targetStr = \"_blank\";\n        break;\n      case LinkTarget.PARENT:\n        targetStr = \"_parent\";\n        break;\n      case LinkTarget.TOP:\n        targetStr = \"_top\";\n        break;\n    }\n    link.target = targetStr;\n\n    link.rel = typeof rel === \"string\" ? rel : DEFAULT_LINK_REL;\n  }\n\n  /**\n   * @param {string|Array} dest - The PDF destination object.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getDestinationHash(dest) {\n    if (typeof dest === \"string\") {\n      if (dest.length > 0) {\n        return this.getAnchorUrl(\"#\" + escape(dest));\n      }\n    } else if (Array.isArray(dest)) {\n      const str = JSON.stringify(dest);\n      if (str.length > 0) {\n        return this.getAnchorUrl(\"#\" + escape(str));\n      }\n    }\n    return this.getAnchorUrl(\"\");\n  }\n\n  /**\n   * Prefix the full url on anchor links to make sure that links are resolved\n   * relative to the current URL instead of the one defined in <base href>.\n   * @param {string} anchor - The anchor hash, including the #.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getAnchorUrl(anchor) {\n    return this.baseUrl ? this.baseUrl + anchor : anchor;\n  }\n\n  /**\n   * @param {string} hash\n   */\n  setHash(hash) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    let pageNumber, dest;\n    if (hash.includes(\"=\")) {\n      const params = parseQueryString(hash);\n      if (params.has(\"search\")) {\n        const query = params.get(\"search\").replaceAll('\"', \"\"),\n          phrase = params.get(\"phrase\") === \"true\";\n\n        this.eventBus.dispatch(\"findfromurlhash\", {\n          source: this,\n          query: phrase ? query : query.match(/\\S+/g),\n        });\n      }\n      // borrowing syntax from \"Parameters for Opening PDF Files\"\n      if (params.has(\"page\")) {\n        pageNumber = params.get(\"page\") | 0 || 1;\n      }\n      if (params.has(\"zoom\")) {\n        // Build the destination array.\n        const zoomArgs = params.get(\"zoom\").split(\",\"); // scale,left,top\n        const zoomArg = zoomArgs[0];\n        const zoomArgNumber = parseFloat(zoomArg);\n\n        if (!zoomArg.includes(\"Fit\")) {\n          // If the zoomArg is a number, it has to get divided by 100. If it's\n          // a string, it should stay as it is.\n          dest = [\n            null,\n            { name: \"XYZ\" },\n            zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n            zoomArgs.length > 2 ? zoomArgs[2] | 0 : null,\n            zoomArgNumber ? zoomArgNumber / 100 : zoomArg,\n          ];\n        } else if (zoomArg === \"Fit\" || zoomArg === \"FitB\") {\n          dest = [null, { name: zoomArg }];\n        } else if (\n          zoomArg === \"FitH\" ||\n          zoomArg === \"FitBH\" ||\n          zoomArg === \"FitV\" ||\n          zoomArg === \"FitBV\"\n        ) {\n          dest = [\n            null,\n            { name: zoomArg },\n            zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n          ];\n        } else if (zoomArg === \"FitR\") {\n          if (zoomArgs.length !== 5) {\n            console.error(\n              'PDFLinkService.setHash: Not enough parameters for \"FitR\".'\n            );\n          } else {\n            dest = [\n              null,\n              { name: zoomArg },\n              zoomArgs[1] | 0,\n              zoomArgs[2] | 0,\n              zoomArgs[3] | 0,\n              zoomArgs[4] | 0,\n            ];\n          }\n        } else {\n          console.error(\n            `PDFLinkService.setHash: \"${zoomArg}\" is not a valid zoom value.`\n          );\n        }\n      }\n      if (dest) {\n        this.pdfViewer.scrollPageIntoView({\n          pageNumber: pageNumber || this.page,\n          destArray: dest,\n          allowNegativeOffset: true,\n        });\n      } else if (pageNumber) {\n        this.page = pageNumber; // simple page\n      }\n      if (params.has(\"pagemode\")) {\n        this.eventBus.dispatch(\"pagemode\", {\n          source: this,\n          mode: params.get(\"pagemode\"),\n        });\n      }\n      // Ensure that this parameter is *always* handled last, in order to\n      // guarantee that it won't be overridden (e.g. by the \"page\" parameter).\n      if (params.has(\"nameddest\")) {\n        this.goToDestination(params.get(\"nameddest\"));\n      }\n\n      if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n        return;\n      }\n      // Support opening of PDF attachments in the Firefox PDF Viewer,\n      // which uses a couple of non-standard hash parameters; refer to\n      // `DownloadManager.openOrDownloadData` in the firefoxcom.js file.\n      if (!params.has(\"filename\") || !params.has(\"filedest\")) {\n        return;\n      }\n      hash = params.get(\"filedest\");\n    }\n\n    // Named (or explicit) destination.\n    dest = unescape(hash);\n    try {\n      dest = JSON.parse(dest);\n\n      if (!Array.isArray(dest)) {\n        // Avoid incorrectly rejecting a valid named destination, such as\n        // e.g. \"4.3\" or \"true\", because `JSON.parse` converted its type.\n        dest = dest.toString();\n      }\n    } catch {}\n\n    if (typeof dest === \"string\" || PDFLinkService.#isValidExplicitDest(dest)) {\n      this.goToDestination(dest);\n      return;\n    }\n    console.error(\n      `PDFLinkService.setHash: \"${unescape(hash)}\" is not a valid destination.`\n    );\n  }\n\n  /**\n   * @param {string} action\n   */\n  executeNamedAction(action) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    // See PDF reference, table 8.45 - Named action\n    switch (action) {\n      case \"GoBack\":\n        this.pdfHistory?.back();\n        break;\n\n      case \"GoForward\":\n        this.pdfHistory?.forward();\n        break;\n\n      case \"NextPage\":\n        this.pdfViewer.nextPage();\n        break;\n\n      case \"PrevPage\":\n        this.pdfViewer.previousPage();\n        break;\n\n      case \"LastPage\":\n        this.page = this.pagesCount;\n        break;\n\n      case \"FirstPage\":\n        this.page = 1;\n        break;\n\n      default:\n        break; // No action according to spec\n    }\n\n    this.eventBus.dispatch(\"namedaction\", {\n      source: this,\n      action,\n    });\n  }\n\n  /**\n   * @param {Object} action\n   */\n  async executeSetOCGState(action) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const pdfDocument = this.pdfDocument,\n      optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise;\n\n    if (pdfDocument !== this.pdfDocument) {\n      return; // The document was closed while the optional content resolved.\n    }\n    optionalContentConfig.setOCGState(action);\n\n    this.pdfViewer.optionalContentConfigPromise = Promise.resolve(\n      optionalContentConfig\n    );\n  }\n\n  static #isValidExplicitDest(dest) {\n    if (!Array.isArray(dest) || dest.length < 2) {\n      return false;\n    }\n    const [page, zoom, ...args] = dest;\n    if (\n      !(\n        typeof page === \"object\" &&\n        Number.isInteger(page?.num) &&\n        Number.isInteger(page?.gen)\n      ) &&\n      !Number.isInteger(page)\n    ) {\n      return false;\n    }\n    if (!(typeof zoom === \"object\" && typeof zoom?.name === \"string\")) {\n      return false;\n    }\n    const argsLen = args.length;\n    let allowNull = true;\n    switch (zoom.name) {\n      case \"XYZ\":\n        if (argsLen < 2 || argsLen > 3) {\n          return false;\n        }\n        break;\n      case \"Fit\":\n      case \"FitB\":\n        return argsLen === 0;\n      case \"FitH\":\n      case \"FitBH\":\n      case \"FitV\":\n      case \"FitBV\":\n        if (argsLen > 1) {\n          return false;\n        }\n        break;\n      case \"FitR\":\n        if (argsLen !== 4) {\n          return false;\n        }\n        allowNull = false;\n        break;\n      default:\n        return false;\n    }\n    for (const arg of args) {\n      if (!(typeof arg === \"number\" || (allowNull && arg === null))) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n\n/**\n * @implements {IPDFLinkService}\n */\nclass SimpleLinkService extends PDFLinkService {\n  setDocument(pdfDocument, baseUrl = null) {}\n}\n\nexport { LinkTarget, PDFLinkService, SimpleLinkService };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst {\n  AbortException,\n  AnnotationEditorLayer,\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  AnnotationEditorUIManager,\n  AnnotationLayer,\n  AnnotationMode,\n  build,\n  ColorPicker,\n  createValidAbsoluteUrl,\n  DOMSVGFactory,\n  DrawLayer,\n  FeatureTest,\n  fetchData,\n  getDocument,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getXfaPageViewport,\n  GlobalWorkerOptions,\n  ImageKind,\n  InvalidPDFException,\n  isDataScheme,\n  isPdfFile,\n  MissingPDFException,\n  noContextMenu,\n  normalizeUnicode,\n  OPS,\n  OutputScale,\n  PasswordResponses,\n  PDFDataRangeTransport,\n  PDFDateString,\n  PDFWorker,\n  PermissionFlag,\n  PixelsPerInch,\n  RenderingCancelledException,\n  setLayerDimensions,\n  shadow,\n  stopEvent,\n  TextLayer,\n  TouchManager,\n  UnexpectedResponseException,\n  Util,\n  VerbosityLevel,\n  version,\n  XfaLayer,\n} = globalThis.pdfjsLib;\n\nexport {\n  AbortException,\n  AnnotationEditorLayer,\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  AnnotationEditorUIManager,\n  AnnotationLayer,\n  AnnotationMode,\n  build,\n  ColorPicker,\n  createValidAbsoluteUrl,\n  DOMSVGFactory,\n  DrawLayer,\n  FeatureTest,\n  fetchData,\n  getDocument,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getXfaPageViewport,\n  GlobalWorkerOptions,\n  ImageKind,\n  InvalidPDFException,\n  isDataScheme,\n  isPdfFile,\n  MissingPDFException,\n  noContextMenu,\n  normalizeUnicode,\n  OPS,\n  OutputScale,\n  PasswordResponses,\n  PDFDataRangeTransport,\n  PDFDateString,\n  PDFWorker,\n  PermissionFlag,\n  PixelsPerInch,\n  RenderingCancelledException,\n  setLayerDimensions,\n  shadow,\n  stopEvent,\n  TextLayer,\n  TouchManager,\n  UnexpectedResponseException,\n  Util,\n  VerbosityLevel,\n  version,\n  XfaLayer,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/display_utils\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/annotation_storage\").AnnotationStorage} AnnotationStorage */\n/** @typedef {import(\"./interfaces\").IDownloadManager} IDownloadManager */\n/** @typedef {import(\"./interfaces\").IPDFLinkService} IPDFLinkService */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./text_accessibility.js\").TextAccessibilityManager} TextAccessibilityManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/editor/tools.js\").AnnotationEditorUIManager} AnnotationEditorUIManager */\n\nimport { AnnotationLayer } from \"pdfjs-lib\";\nimport { PresentationModeState } from \"./ui_utils.js\";\n\n/**\n * @typedef {Object} AnnotationLayerBuilderOptions\n * @property {PDFPageProxy} pdfPage\n * @property {AnnotationStorage} [annotationStorage]\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   for annotation icons. Include trailing slash.\n * @property {boolean} renderForms\n * @property {IPDFLinkService} linkService\n * @property {IDownloadManager} [downloadManager]\n * @property {boolean} [enableScripting]\n * @property {Promise<boolean>} [hasJSActionsPromise]\n * @property {Promise<Object<string, Array<Object>> | null>}\n *   [fieldObjectsPromise]\n * @property {Map<string, HTMLCanvasElement>} [annotationCanvasMap]\n * @property {TextAccessibilityManager} [accessibilityManager]\n * @property {AnnotationEditorUIManager} [annotationEditorUIManager]\n * @property {function} [onAppend]\n */\n\nclass AnnotationLayerBuilder {\n  #onAppend = null;\n\n  #eventAbortController = null;\n\n  /**\n   * @param {AnnotationLayerBuilderOptions} options\n   */\n  constructor({\n    pdfPage,\n    linkService,\n    downloadManager,\n    annotationStorage = null,\n    imageResourcesPath = \"\",\n    renderForms = true,\n    enableScripting = false,\n    hasJSActionsPromise = null,\n    fieldObjectsPromise = null,\n    annotationCanvasMap = null,\n    accessibilityManager = null,\n    annotationEditorUIManager = null,\n    onAppend = null,\n  }) {\n    this.pdfPage = pdfPage;\n    this.linkService = linkService;\n    this.downloadManager = downloadManager;\n    this.imageResourcesPath = imageResourcesPath;\n    this.renderForms = renderForms;\n    this.annotationStorage = annotationStorage;\n    this.enableScripting = enableScripting;\n    this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false);\n    this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null);\n    this._annotationCanvasMap = annotationCanvasMap;\n    this._accessibilityManager = accessibilityManager;\n    this._annotationEditorUIManager = annotationEditorUIManager;\n    this.#onAppend = onAppend;\n\n    this.annotationLayer = null;\n    this.div = null;\n    this._cancelled = false;\n    this._eventBus = linkService.eventBus;\n  }\n\n  /**\n   * @param {PageViewport} viewport\n   * @param {Object} options\n   * @param {string} intent (default value is 'display')\n   * @returns {Promise<void>} A promise that is resolved when rendering of the\n   *   annotations is complete.\n   */\n  async render(viewport, options, intent = \"display\") {\n    if (this.div) {\n      if (this._cancelled || !this.annotationLayer) {\n        return;\n      }\n      // If an annotationLayer already exists, refresh its children's\n      // transformation matrices.\n      this.annotationLayer.update({\n        viewport: viewport.clone({ dontFlip: true }),\n      });\n      return;\n    }\n\n    const [annotations, hasJSActions, fieldObjects] = await Promise.all([\n      this.pdfPage.getAnnotations({ intent }),\n      this._hasJSActionsPromise,\n      this._fieldObjectsPromise,\n    ]);\n    if (this._cancelled) {\n      return;\n    }\n\n    // Create an annotation layer div and render the annotations\n    // if there is at least one annotation.\n    const div = (this.div = document.createElement(\"div\"));\n    div.className = \"annotationLayer\";\n    this.#onAppend?.(div);\n\n    if (annotations.length === 0) {\n      this.hide();\n      return;\n    }\n\n    this.annotationLayer = new AnnotationLayer({\n      div,\n      accessibilityManager: this._accessibilityManager,\n      annotationCanvasMap: this._annotationCanvasMap,\n      annotationEditorUIManager: this._annotationEditorUIManager,\n      page: this.pdfPage,\n      viewport: viewport.clone({ dontFlip: true }),\n      structTreeLayer: options?.structTreeLayer || null,\n    });\n\n    await this.annotationLayer.render({\n      annotations,\n      imageResourcesPath: this.imageResourcesPath,\n      renderForms: this.renderForms,\n      linkService: this.linkService,\n      downloadManager: this.downloadManager,\n      annotationStorage: this.annotationStorage,\n      enableScripting: this.enableScripting,\n      hasJSActions,\n      fieldObjects,\n    });\n\n    // Ensure that interactive form elements in the annotationLayer are\n    // disabled while PresentationMode is active (see issue 12232).\n    if (this.linkService.isInPresentationMode) {\n      this.#updatePresentationModeState(PresentationModeState.FULLSCREEN);\n    }\n    if (!this.#eventAbortController) {\n      this.#eventAbortController = new AbortController();\n\n      this._eventBus?._on(\n        \"presentationmodechanged\",\n        evt => {\n          this.#updatePresentationModeState(evt.state);\n        },\n        { signal: this.#eventAbortController.signal }\n      );\n    }\n  }\n\n  cancel() {\n    this._cancelled = true;\n\n    this.#eventAbortController?.abort();\n    this.#eventAbortController = null;\n  }\n\n  hide() {\n    if (!this.div) {\n      return;\n    }\n    this.div.hidden = true;\n  }\n\n  hasEditableAnnotations() {\n    return !!this.annotationLayer?.hasEditableAnnotations();\n  }\n\n  #updatePresentationModeState(state) {\n    if (!this.div) {\n      return;\n    }\n    let disableFormElements = false;\n\n    switch (state) {\n      case PresentationModeState.FULLSCREEN:\n        disableFormElements = true;\n        break;\n      case PresentationModeState.NORMAL:\n        break;\n      default:\n        return;\n    }\n    for (const section of this.div.childNodes) {\n      if (section.hasAttribute(\"data-internal-link\")) {\n        continue;\n      }\n      section.inert = disableFormElements;\n    }\n  }\n}\n\nexport { AnnotationLayerBuilder };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces\").IDownloadManager} IDownloadManager */\n\nimport { createValidAbsoluteUrl, isPdfFile } from \"pdfjs-lib\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"CHROME || GENERIC\")) {\n  throw new Error(\n    'Module \"pdfjs-web/download_manager\" shall not be used ' +\n      \"outside CHROME and GENERIC builds.\"\n  );\n}\n\nfunction download(blobUrl, filename) {\n  const a = document.createElement(\"a\");\n  if (!a.click) {\n    throw new Error('DownloadManager: \"a.click()\" is not supported.');\n  }\n  a.href = blobUrl;\n  a.target = \"_parent\";\n  // Use a.download if available. This increases the likelihood that\n  // the file is downloaded instead of opened by another PDF plugin.\n  if (\"download\" in a) {\n    a.download = filename;\n  }\n  // <a> must be in the document for recent Firefox versions,\n  // otherwise .click() is ignored.\n  (document.body || document.documentElement).append(a);\n  a.click();\n  a.remove();\n}\n\n/**\n * @implements {IDownloadManager}\n */\nclass DownloadManager {\n  #openBlobUrls = new WeakMap();\n\n  downloadData(data, filename, contentType) {\n    const blobUrl = URL.createObjectURL(\n      new Blob([data], { type: contentType })\n    );\n    download(blobUrl, filename);\n  }\n\n  /**\n   * @returns {boolean} Indicating if the data was opened.\n   */\n  openOrDownloadData(data, filename, dest = null) {\n    const isPdfData = isPdfFile(filename);\n    const contentType = isPdfData ? \"application/pdf\" : \"\";\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"COMPONENTS\")) &&\n      isPdfData\n    ) {\n      let blobUrl = this.#openBlobUrls.get(data);\n      if (!blobUrl) {\n        blobUrl = URL.createObjectURL(new Blob([data], { type: contentType }));\n        this.#openBlobUrls.set(data, blobUrl);\n      }\n      let viewerUrl;\n      if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n        // The current URL is the viewer, let's use it and append the file.\n        viewerUrl = \"?file=\" + encodeURIComponent(blobUrl + \"#\" + filename);\n      } else if (PDFJSDev.test(\"CHROME\")) {\n        // In the Chrome extension, the URL is rewritten using the history API\n        // in viewer.js, so an absolute URL must be generated.\n        viewerUrl =\n          // eslint-disable-next-line no-undef\n          chrome.runtime.getURL(\"/content/web/viewer.html\") +\n          \"?file=\" +\n          encodeURIComponent(blobUrl + \"#\" + filename);\n      }\n      if (dest) {\n        viewerUrl += `#${escape(dest)}`;\n      }\n\n      try {\n        window.open(viewerUrl);\n        return true;\n      } catch (ex) {\n        console.error(\"openOrDownloadData:\", ex);\n        // Release the `blobUrl`, since opening it failed, and fallback to\n        // downloading the PDF file.\n        URL.revokeObjectURL(blobUrl);\n        this.#openBlobUrls.delete(data);\n      }\n    }\n\n    this.downloadData(data, filename, contentType);\n    return false;\n  }\n\n  download(data, url, filename) {\n    let blobUrl;\n    if (data) {\n      blobUrl = URL.createObjectURL(\n        new Blob([data], { type: \"application/pdf\" })\n      );\n    } else {\n      if (!createValidAbsoluteUrl(url, \"http://example.com\")) {\n        console.error(`download - not a valid URL: ${url}`);\n        return;\n      }\n      blobUrl = url + \"#pdfjs.action=download\";\n    }\n    download(blobUrl, filename);\n  }\n}\n\nexport { DownloadManager };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst WaitOnType = {\n  EVENT: \"event\",\n  TIMEOUT: \"timeout\",\n};\n\n/**\n * @typedef {Object} WaitOnEventOrTimeoutParameters\n * @property {Object} target - The event target, can for example be:\n *   `window`, `document`, a DOM element, or an {EventBus} instance.\n * @property {string} name - The name of the event.\n * @property {number} delay - The delay, in milliseconds, after which the\n *   timeout occurs (if the event wasn't already dispatched).\n */\n\n/**\n * Allows waiting for an event or a timeout, whichever occurs first.\n * Can be used to ensure that an action always occurs, even when an event\n * arrives late or not at all.\n *\n * @param {WaitOnEventOrTimeoutParameters}\n * @returns {Promise} A promise that is resolved with a {WaitOnType} value.\n */\nasync function waitOnEventOrTimeout({ target, name, delay = 0 }) {\n  if (\n    typeof target !== \"object\" ||\n    !(name && typeof name === \"string\") ||\n    !(Number.isInteger(delay) && delay >= 0)\n  ) {\n    throw new Error(\"waitOnEventOrTimeout - invalid parameters.\");\n  }\n  const { promise, resolve } = Promise.withResolvers();\n  const ac = new AbortController();\n\n  function handler(type) {\n    ac.abort(); // Remove event listener.\n    clearTimeout(timeout);\n\n    resolve(type);\n  }\n\n  const evtMethod = target instanceof EventBus ? \"_on\" : \"addEventListener\";\n  target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), {\n    signal: ac.signal,\n  });\n\n  const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay);\n\n  return promise;\n}\n\n/**\n * Simple event bus for an application. Listeners are attached using the `on`\n * and `off` methods. To raise an event, the `dispatch` method shall be used.\n */\nclass EventBus {\n  #listeners = Object.create(null);\n\n  /**\n   * @param {string} eventName\n   * @param {function} listener\n   * @param {Object} [options]\n   */\n  on(eventName, listener, options = null) {\n    this._on(eventName, listener, {\n      external: true,\n      once: options?.once,\n      signal: options?.signal,\n    });\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {function} listener\n   * @param {Object} [options]\n   */\n  off(eventName, listener, options = null) {\n    this._off(eventName, listener);\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {Object} data\n   */\n  dispatch(eventName, data) {\n    const eventListeners = this.#listeners[eventName];\n    if (!eventListeners || eventListeners.length === 0) {\n      return;\n    }\n    let externalListeners;\n    // Making copy of the listeners array in case if it will be modified\n    // during dispatch.\n    for (const { listener, external, once } of eventListeners.slice(0)) {\n      if (once) {\n        this._off(eventName, listener);\n      }\n      if (external) {\n        (externalListeners ||= []).push(listener);\n        continue;\n      }\n      listener(data);\n    }\n    // Dispatch any \"external\" listeners *after* the internal ones, to give the\n    // viewer components time to handle events and update their state first.\n    if (externalListeners) {\n      for (const listener of externalListeners) {\n        listener(data);\n      }\n      externalListeners = null;\n    }\n  }\n\n  /**\n   * @ignore\n   */\n  _on(eventName, listener, options = null) {\n    let rmAbort = null;\n    if (options?.signal instanceof AbortSignal) {\n      const { signal } = options;\n      if (signal.aborted) {\n        console.error(\"Cannot use an `aborted` signal.\");\n        return;\n      }\n      const onAbort = () => this._off(eventName, listener);\n      rmAbort = () => signal.removeEventListener(\"abort\", onAbort);\n\n      signal.addEventListener(\"abort\", onAbort);\n    }\n\n    const eventListeners = (this.#listeners[eventName] ||= []);\n    eventListeners.push({\n      listener,\n      external: options?.external === true,\n      once: options?.once === true,\n      rmAbort,\n    });\n  }\n\n  /**\n   * @ignore\n   */\n  _off(eventName, listener, options = null) {\n    const eventListeners = this.#listeners[eventName];\n    if (!eventListeners) {\n      return;\n    }\n    for (let i = 0, ii = eventListeners.length; i < ii; i++) {\n      const evt = eventListeners[i];\n      if (evt.listener === listener) {\n        evt.rmAbort?.(); // Ensure that the `AbortSignal` listener is removed.\n        eventListeners.splice(i, 1);\n        return;\n      }\n    }\n  }\n}\n\n/**\n * NOTE: Only used in the Firefox build-in pdf viewer.\n */\nclass FirefoxEventBus extends EventBus {\n  #externalServices;\n\n  #globalEventNames;\n\n  #isInAutomation;\n\n  constructor(globalEventNames, externalServices, isInAutomation) {\n    super();\n    this.#globalEventNames = globalEventNames;\n    this.#externalServices = externalServices;\n    this.#isInAutomation = isInAutomation;\n  }\n\n  dispatch(eventName, data) {\n    if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: FirefoxEventBus.dispatch\");\n    }\n    super.dispatch(eventName, data);\n\n    if (this.#isInAutomation) {\n      const detail = Object.create(null);\n      if (data) {\n        for (const key in data) {\n          const value = data[key];\n          if (key === \"source\") {\n            if (value === window || value === document) {\n              return; // No need to re-dispatch (already) global events.\n            }\n            continue; // Ignore the `source` property.\n          }\n          detail[key] = value;\n        }\n      }\n      const event = new CustomEvent(eventName, {\n        bubbles: true,\n        cancelable: true,\n        detail,\n      });\n      document.dispatchEvent(event);\n    }\n\n    if (this.#globalEventNames?.has(eventName)) {\n      this.#externalServices.dispatchGlobalEvent({\n        eventName,\n        detail: data,\n      });\n    }\n  }\n}\n\nexport { EventBus, FirefoxEventBus, waitOnEventOrTimeout, WaitOnType };\n","/**\n * The `FluentType` class is the base of Fluent's type system.\n *\n * Fluent types wrap JavaScript values and store additional configuration for\n * them, which can then be used in the `toString` method together with a proper\n * `Intl` formatter.\n */\nexport class FluentType {\n    /**\n     * Create a `FluentType` instance.\n     *\n     * @param value The JavaScript value to wrap.\n     */\n    constructor(value) {\n        this.value = value;\n    }\n    /**\n     * Unwrap the raw value stored by this `FluentType`.\n     */\n    valueOf() {\n        return this.value;\n    }\n}\n/**\n * A `FluentType` representing no correct value.\n */\nexport class FluentNone extends FluentType {\n    /**\n     * Create an instance of `FluentNone` with an optional fallback value.\n     * @param value The fallback value of this `FluentNone`.\n     */\n    constructor(value = \"???\") {\n        super(value);\n    }\n    /**\n     * Format this `FluentNone` to the fallback string.\n     */\n    toString(scope) {\n        return `{${this.value}}`;\n    }\n}\n/**\n * A `FluentType` representing a number.\n *\n * A `FluentNumber` instance stores the number value of the number it\n * represents. It may also store an option bag of options which will be passed\n * to `Intl.NumerFormat` when the `FluentNumber` is formatted to a string.\n */\nexport class FluentNumber extends FluentType {\n    /**\n     * Create an instance of `FluentNumber` with options to the\n     * `Intl.NumberFormat` constructor.\n     *\n     * @param value The number value of this `FluentNumber`.\n     * @param opts Options which will be passed to `Intl.NumberFormat`.\n     */\n    constructor(value, opts = {}) {\n        super(value);\n        this.opts = opts;\n    }\n    /**\n     * Format this `FluentNumber` to a string.\n     */\n    toString(scope) {\n        try {\n            const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts);\n            return nf.format(this.value);\n        }\n        catch (err) {\n            scope.reportError(err);\n            return this.value.toString(10);\n        }\n    }\n}\n/**\n * A `FluentType` representing a date and time.\n *\n * A `FluentDateTime` instance stores the number value of the date it\n * represents, as a numerical timestamp in milliseconds. It may also store an\n * option bag of options which will be passed to `Intl.DateTimeFormat` when the\n * `FluentDateTime` is formatted to a string.\n */\nexport class FluentDateTime extends FluentType {\n    /**\n     * Create an instance of `FluentDateTime` with options to the\n     * `Intl.DateTimeFormat` constructor.\n     *\n     * @param value The number value of this `FluentDateTime`, in milliseconds.\n     * @param opts Options which will be passed to `Intl.DateTimeFormat`.\n     */\n    constructor(value, opts = {}) {\n        super(value);\n        this.opts = opts;\n    }\n    /**\n     * Format this `FluentDateTime` to a string.\n     */\n    toString(scope) {\n        try {\n            const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts);\n            return dtf.format(this.value);\n        }\n        catch (err) {\n            scope.reportError(err);\n            return new Date(this.value).toISOString();\n        }\n    }\n}\n","/* global Intl */\n/**\n * @overview\n *\n * The role of the Fluent resolver is to format a `Pattern` to an instance of\n * `FluentValue`. For performance reasons, primitive strings are considered\n * such instances, too.\n *\n * Translations can contain references to other messages or variables,\n * conditional logic in form of select expressions, traits which describe their\n * grammatical features, and can use Fluent builtins which make use of the\n * `Intl` formatters to format numbers and dates into the bundle's languages.\n * See the documentation of the Fluent syntax for more information.\n *\n * In case of errors the resolver will try to salvage as much of the\n * translation as possible. In rare situations where the resolver didn't know\n * how to recover from an error it will return an instance of `FluentNone`.\n *\n * All expressions resolve to an instance of `FluentValue`. The caller should\n * use the `toString` method to convert the instance to a native value.\n *\n * Functions in this file pass around an instance of the `Scope` class, which\n * stores the data required for successful resolution and error recovery.\n */\nimport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n/**\n * The maximum number of placeables which can be expanded in a single call to\n * `formatPattern`. The limit protects against the Billion Laughs and Quadratic\n * Blowup attacks. See https://msdn.microsoft.com/en-us/magazine/ee335713.aspx.\n */\nconst MAX_PLACEABLES = 100;\n/** Unicode bidi isolation characters. */\nconst FSI = \"\\u2068\";\nconst PDI = \"\\u2069\";\n/** Helper: match a variant key to the given selector. */\nfunction match(scope, selector, key) {\n    if (key === selector) {\n        // Both are strings.\n        return true;\n    }\n    // XXX Consider comparing options too, e.g. minimumFractionDigits.\n    if (key instanceof FluentNumber &&\n        selector instanceof FluentNumber &&\n        key.value === selector.value) {\n        return true;\n    }\n    if (selector instanceof FluentNumber && typeof key === \"string\") {\n        let category = scope\n            .memoizeIntlObject(Intl.PluralRules, selector.opts)\n            .select(selector.value);\n        if (key === category) {\n            return true;\n        }\n    }\n    return false;\n}\n/** Helper: resolve the default variant from a list of variants. */\nfunction getDefault(scope, variants, star) {\n    if (variants[star]) {\n        return resolvePattern(scope, variants[star].value);\n    }\n    scope.reportError(new RangeError(\"No default\"));\n    return new FluentNone();\n}\n/** Helper: resolve arguments to a call expression. */\nfunction getArguments(scope, args) {\n    const positional = [];\n    const named = Object.create(null);\n    for (const arg of args) {\n        if (arg.type === \"narg\") {\n            named[arg.name] = resolveExpression(scope, arg.value);\n        }\n        else {\n            positional.push(resolveExpression(scope, arg));\n        }\n    }\n    return { positional, named };\n}\n/** Resolve an expression to a Fluent type. */\nfunction resolveExpression(scope, expr) {\n    switch (expr.type) {\n        case \"str\":\n            return expr.value;\n        case \"num\":\n            return new FluentNumber(expr.value, {\n                minimumFractionDigits: expr.precision,\n            });\n        case \"var\":\n            return resolveVariableReference(scope, expr);\n        case \"mesg\":\n            return resolveMessageReference(scope, expr);\n        case \"term\":\n            return resolveTermReference(scope, expr);\n        case \"func\":\n            return resolveFunctionReference(scope, expr);\n        case \"select\":\n            return resolveSelectExpression(scope, expr);\n        default:\n            return new FluentNone();\n    }\n}\n/** Resolve a reference to a variable. */\nfunction resolveVariableReference(scope, { name }) {\n    let arg;\n    if (scope.params) {\n        // We're inside a TermReference. It's OK to reference undefined parameters.\n        if (Object.prototype.hasOwnProperty.call(scope.params, name)) {\n            arg = scope.params[name];\n        }\n        else {\n            return new FluentNone(`$${name}`);\n        }\n    }\n    else if (scope.args &&\n        Object.prototype.hasOwnProperty.call(scope.args, name)) {\n        // We're in the top-level Pattern or inside a MessageReference. Missing\n        // variables references produce ReferenceErrors.\n        arg = scope.args[name];\n    }\n    else {\n        scope.reportError(new ReferenceError(`Unknown variable: $${name}`));\n        return new FluentNone(`$${name}`);\n    }\n    // Return early if the argument already is an instance of FluentType.\n    if (arg instanceof FluentType) {\n        return arg;\n    }\n    // Convert the argument to a Fluent type.\n    switch (typeof arg) {\n        case \"string\":\n            return arg;\n        case \"number\":\n            return new FluentNumber(arg);\n        case \"object\":\n            if (arg instanceof Date) {\n                return new FluentDateTime(arg.getTime());\n            }\n        // eslint-disable-next-line no-fallthrough\n        default:\n            scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`));\n            return new FluentNone(`$${name}`);\n    }\n}\n/** Resolve a reference to another message. */\nfunction resolveMessageReference(scope, { name, attr }) {\n    const message = scope.bundle._messages.get(name);\n    if (!message) {\n        scope.reportError(new ReferenceError(`Unknown message: ${name}`));\n        return new FluentNone(name);\n    }\n    if (attr) {\n        const attribute = message.attributes[attr];\n        if (attribute) {\n            return resolvePattern(scope, attribute);\n        }\n        scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n        return new FluentNone(`${name}.${attr}`);\n    }\n    if (message.value) {\n        return resolvePattern(scope, message.value);\n    }\n    scope.reportError(new ReferenceError(`No value: ${name}`));\n    return new FluentNone(name);\n}\n/** Resolve a call to a Term with key-value arguments. */\nfunction resolveTermReference(scope, { name, attr, args }) {\n    const id = `-${name}`;\n    const term = scope.bundle._terms.get(id);\n    if (!term) {\n        scope.reportError(new ReferenceError(`Unknown term: ${id}`));\n        return new FluentNone(id);\n    }\n    if (attr) {\n        const attribute = term.attributes[attr];\n        if (attribute) {\n            // Every TermReference has its own variables.\n            scope.params = getArguments(scope, args).named;\n            const resolved = resolvePattern(scope, attribute);\n            scope.params = null;\n            return resolved;\n        }\n        scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n        return new FluentNone(`${id}.${attr}`);\n    }\n    scope.params = getArguments(scope, args).named;\n    const resolved = resolvePattern(scope, term.value);\n    scope.params = null;\n    return resolved;\n}\n/** Resolve a call to a Function with positional and key-value arguments. */\nfunction resolveFunctionReference(scope, { name, args }) {\n    // Some functions are built-in. Others may be provided by the runtime via\n    // the `FluentBundle` constructor.\n    let func = scope.bundle._functions[name];\n    if (!func) {\n        scope.reportError(new ReferenceError(`Unknown function: ${name}()`));\n        return new FluentNone(`${name}()`);\n    }\n    if (typeof func !== \"function\") {\n        scope.reportError(new TypeError(`Function ${name}() is not callable`));\n        return new FluentNone(`${name}()`);\n    }\n    try {\n        let resolved = getArguments(scope, args);\n        return func(resolved.positional, resolved.named);\n    }\n    catch (err) {\n        scope.reportError(err);\n        return new FluentNone(`${name}()`);\n    }\n}\n/** Resolve a select expression to the member object. */\nfunction resolveSelectExpression(scope, { selector, variants, star }) {\n    let sel = resolveExpression(scope, selector);\n    if (sel instanceof FluentNone) {\n        return getDefault(scope, variants, star);\n    }\n    // Match the selector against keys of each variant, in order.\n    for (const variant of variants) {\n        const key = resolveExpression(scope, variant.key);\n        if (match(scope, sel, key)) {\n            return resolvePattern(scope, variant.value);\n        }\n    }\n    return getDefault(scope, variants, star);\n}\n/** Resolve a pattern (a complex string with placeables). */\nexport function resolveComplexPattern(scope, ptn) {\n    if (scope.dirty.has(ptn)) {\n        scope.reportError(new RangeError(\"Cyclic reference\"));\n        return new FluentNone();\n    }\n    // Tag the pattern as dirty for the purpose of the current resolution.\n    scope.dirty.add(ptn);\n    const result = [];\n    // Wrap interpolations with Directional Isolate Formatting characters\n    // only when the pattern has more than one element.\n    const useIsolating = scope.bundle._useIsolating && ptn.length > 1;\n    for (const elem of ptn) {\n        if (typeof elem === \"string\") {\n            result.push(scope.bundle._transform(elem));\n            continue;\n        }\n        scope.placeables++;\n        if (scope.placeables > MAX_PLACEABLES) {\n            scope.dirty.delete(ptn);\n            // This is a fatal error which causes the resolver to instantly bail out\n            // on this pattern. The length check protects against excessive memory\n            // usage, and throwing protects against eating up the CPU when long\n            // placeables are deeply nested.\n            throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` +\n                `max allowed is ${MAX_PLACEABLES}`);\n        }\n        if (useIsolating) {\n            result.push(FSI);\n        }\n        result.push(resolveExpression(scope, elem).toString(scope));\n        if (useIsolating) {\n            result.push(PDI);\n        }\n    }\n    scope.dirty.delete(ptn);\n    return result.join(\"\");\n}\n/**\n * Resolve a simple or a complex Pattern to a FluentString\n * (which is really the string primitive).\n */\nfunction resolvePattern(scope, value) {\n    // Resolve a simple pattern.\n    if (typeof value === \"string\") {\n        return scope.bundle._transform(value);\n    }\n    return resolveComplexPattern(scope, value);\n}\n","export class Scope {\n    constructor(bundle, errors, args) {\n        /**\n         * The Set of patterns already encountered during this resolution.\n         * Used to detect and prevent cyclic resolutions.\n         * @ignore\n         */\n        this.dirty = new WeakSet();\n        /** A dict of parameters passed to a TermReference. */\n        this.params = null;\n        /**\n         * The running count of placeables resolved so far.\n         * Used to detect the Billion Laughs and Quadratic Blowup attacks.\n         * @ignore\n         */\n        this.placeables = 0;\n        this.bundle = bundle;\n        this.errors = errors;\n        this.args = args;\n    }\n    reportError(error) {\n        if (!this.errors || !(error instanceof Error)) {\n            throw error;\n        }\n        this.errors.push(error);\n    }\n    memoizeIntlObject(ctor, opts) {\n        let cache = this.bundle._intls.get(ctor);\n        if (!cache) {\n            cache = {};\n            this.bundle._intls.set(ctor, cache);\n        }\n        let id = JSON.stringify(opts);\n        if (!cache[id]) {\n            cache[id] = new ctor(this.bundle.locales, opts);\n        }\n        return cache[id];\n    }\n}\n","/**\n * @overview\n *\n * The FTL resolver ships with a number of functions built-in.\n *\n * Each function take two arguments:\n *   - args - an array of positional args\n *   - opts - an object of key-value args\n *\n * Arguments to functions are guaranteed to already be instances of\n * `FluentValue`.  Functions must return `FluentValues` as well.\n */\nimport { FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\nfunction values(opts, allowed) {\n    const unwrapped = Object.create(null);\n    for (const [name, opt] of Object.entries(opts)) {\n        if (allowed.includes(name)) {\n            unwrapped[name] = opt.valueOf();\n        }\n    }\n    return unwrapped;\n}\nconst NUMBER_ALLOWED = [\n    \"unitDisplay\",\n    \"currencyDisplay\",\n    \"useGrouping\",\n    \"minimumIntegerDigits\",\n    \"minimumFractionDigits\",\n    \"maximumFractionDigits\",\n    \"minimumSignificantDigits\",\n    \"maximumSignificantDigits\",\n];\n/**\n * The implementation of the `NUMBER()` builtin available to translations.\n *\n * Translations may call the `NUMBER()` builtin in order to specify formatting\n * options of a number. For example:\n *\n *     pi = The value of π is {NUMBER($pi, maximumFractionDigits: 2)}.\n *\n * The implementation expects an array of `FluentValues` representing the\n * positional arguments, and an object of named `FluentValues` representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n *     unitDisplay\n *     currencyDisplay\n *     useGrouping\n *     minimumIntegerDigits\n *     minimumFractionDigits\n *     maximumFractionDigits\n *     minimumSignificantDigits\n *     maximumSignificantDigits\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `NUMBER()`.\n * @param opts The named argments passed to this `NUMBER()`.\n */\nexport function NUMBER(args, opts) {\n    let arg = args[0];\n    if (arg instanceof FluentNone) {\n        return new FluentNone(`NUMBER(${arg.valueOf()})`);\n    }\n    if (arg instanceof FluentNumber) {\n        return new FluentNumber(arg.valueOf(), {\n            ...arg.opts,\n            ...values(opts, NUMBER_ALLOWED),\n        });\n    }\n    if (arg instanceof FluentDateTime) {\n        return new FluentNumber(arg.valueOf(), {\n            ...values(opts, NUMBER_ALLOWED),\n        });\n    }\n    throw new TypeError(\"Invalid argument to NUMBER\");\n}\nconst DATETIME_ALLOWED = [\n    \"dateStyle\",\n    \"timeStyle\",\n    \"fractionalSecondDigits\",\n    \"dayPeriod\",\n    \"hour12\",\n    \"weekday\",\n    \"era\",\n    \"year\",\n    \"month\",\n    \"day\",\n    \"hour\",\n    \"minute\",\n    \"second\",\n    \"timeZoneName\",\n];\n/**\n * The implementation of the `DATETIME()` builtin available to translations.\n *\n * Translations may call the `DATETIME()` builtin in order to specify\n * formatting options of a number. For example:\n *\n *     now = It's {DATETIME($today, month: \"long\")}.\n *\n * The implementation expects an array of `FluentValues` representing the\n * positional arguments, and an object of named `FluentValues` representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n *     dateStyle\n *     timeStyle\n *     fractionalSecondDigits\n *     dayPeriod\n *     hour12\n *     weekday\n *     era\n *     year\n *     month\n *     day\n *     hour\n *     minute\n *     second\n *     timeZoneName\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `DATETIME()`.\n * @param opts The named argments passed to this `DATETIME()`.\n */\nexport function DATETIME(args, opts) {\n    let arg = args[0];\n    if (arg instanceof FluentNone) {\n        return new FluentNone(`DATETIME(${arg.valueOf()})`);\n    }\n    if (arg instanceof FluentDateTime) {\n        return new FluentDateTime(arg.valueOf(), {\n            ...arg.opts,\n            ...values(opts, DATETIME_ALLOWED),\n        });\n    }\n    if (arg instanceof FluentNumber) {\n        return new FluentDateTime(arg.valueOf(), {\n            ...values(opts, DATETIME_ALLOWED),\n        });\n    }\n    throw new TypeError(\"Invalid argument to DATETIME\");\n}\n","const cache = new Map();\nexport function getMemoizerForLocale(locales) {\n    const stringLocale = Array.isArray(locales) ? locales.join(\" \") : locales;\n    let memoizer = cache.get(stringLocale);\n    if (memoizer === undefined) {\n        memoizer = new Map();\n        cache.set(stringLocale, memoizer);\n    }\n    return memoizer;\n}\n","import { resolveComplexPattern } from \"./resolver.js\";\nimport { Scope } from \"./scope.js\";\nimport { FluentNone } from \"./types.js\";\nimport { NUMBER, DATETIME } from \"./builtins.js\";\nimport { getMemoizerForLocale } from \"./memoizer.js\";\n/**\n * Message bundles are single-language stores of translation resources. They are\n * responsible for formatting message values and attributes to strings.\n */\nexport class FluentBundle {\n    /**\n     * Create an instance of `FluentBundle`.\n     *\n     * @example\n     * ```js\n     * let bundle = new FluentBundle([\"en-US\", \"en\"]);\n     *\n     * let bundle = new FluentBundle(locales, {useIsolating: false});\n     *\n     * let bundle = new FluentBundle(locales, {\n     *   useIsolating: true,\n     *   functions: {\n     *     NODE_ENV: () => process.env.NODE_ENV\n     *   }\n     * });\n     * ```\n     *\n     * @param locales - Used to instantiate `Intl` formatters used by translations.\n     * @param options - Optional configuration for the bundle.\n     */\n    constructor(locales, { functions, useIsolating = true, transform = (v) => v, } = {}) {\n        /** @ignore */\n        this._terms = new Map();\n        /** @ignore */\n        this._messages = new Map();\n        this.locales = Array.isArray(locales) ? locales : [locales];\n        this._functions = {\n            NUMBER,\n            DATETIME,\n            ...functions,\n        };\n        this._useIsolating = useIsolating;\n        this._transform = transform;\n        this._intls = getMemoizerForLocale(locales);\n    }\n    /**\n     * Check if a message is present in the bundle.\n     *\n     * @param id - The identifier of the message to check.\n     */\n    hasMessage(id) {\n        return this._messages.has(id);\n    }\n    /**\n     * Return a raw unformatted message object from the bundle.\n     *\n     * Raw messages are `{value, attributes}` shapes containing translation units\n     * called `Patterns`. `Patterns` are implementation-specific; they should be\n     * treated as black boxes and formatted with `FluentBundle.formatPattern`.\n     *\n     * @param id - The identifier of the message to check.\n     */\n    getMessage(id) {\n        return this._messages.get(id);\n    }\n    /**\n     * Add a translation resource to the bundle.\n     *\n     * @example\n     * ```js\n     * let res = new FluentResource(\"foo = Foo\");\n     * bundle.addResource(res);\n     * bundle.getMessage(\"foo\");\n     * // → {value: .., attributes: {..}}\n     * ```\n     *\n     * @param res\n     * @param options\n     */\n    addResource(res, { allowOverrides = false, } = {}) {\n        const errors = [];\n        for (let i = 0; i < res.body.length; i++) {\n            let entry = res.body[i];\n            if (entry.id.startsWith(\"-\")) {\n                // Identifiers starting with a dash (-) define terms. Terms are private\n                // and cannot be retrieved from FluentBundle.\n                if (allowOverrides === false && this._terms.has(entry.id)) {\n                    errors.push(new Error(`Attempt to override an existing term: \"${entry.id}\"`));\n                    continue;\n                }\n                this._terms.set(entry.id, entry);\n            }\n            else {\n                if (allowOverrides === false && this._messages.has(entry.id)) {\n                    errors.push(new Error(`Attempt to override an existing message: \"${entry.id}\"`));\n                    continue;\n                }\n                this._messages.set(entry.id, entry);\n            }\n        }\n        return errors;\n    }\n    /**\n     * Format a `Pattern` to a string.\n     *\n     * Format a raw `Pattern` into a string. `args` will be used to resolve\n     * references to variables passed as arguments to the translation.\n     *\n     * In case of errors `formatPattern` will try to salvage as much of the\n     * translation as possible and will still return a string. For performance\n     * reasons, the encountered errors are not returned but instead are appended\n     * to the `errors` array passed as the third argument.\n     *\n     * If `errors` is omitted, the first encountered error will be thrown.\n     *\n     * @example\n     * ```js\n     * let errors = [];\n     * bundle.addResource(\n     *     new FluentResource(\"hello = Hello, {$name}!\"));\n     *\n     * let hello = bundle.getMessage(\"hello\");\n     * if (hello.value) {\n     *     bundle.formatPattern(hello.value, {name: \"Jane\"}, errors);\n     *     // Returns \"Hello, Jane!\" and `errors` is empty.\n     *\n     *     bundle.formatPattern(hello.value, undefined, errors);\n     *     // Returns \"Hello, {$name}!\" and `errors` is now:\n     *     // [<ReferenceError: Unknown variable: name>]\n     * }\n     * ```\n     */\n    formatPattern(pattern, args = null, errors = null) {\n        // Resolve a simple pattern without creating a scope. No error handling is\n        // required; by definition simple patterns don't have placeables.\n        if (typeof pattern === \"string\") {\n            return this._transform(pattern);\n        }\n        // Resolve a complex pattern.\n        let scope = new Scope(this, errors, args);\n        try {\n            let value = resolveComplexPattern(scope, pattern);\n            return value.toString(scope);\n        }\n        catch (err) {\n            if (scope.errors && err instanceof Error) {\n                scope.errors.push(err);\n                return new FluentNone().toString(scope);\n            }\n            throw err;\n        }\n    }\n}\n","// This regex is used to iterate through the beginnings of messages and terms.\n// With the /m flag, the ^ matches at the beginning of every line.\nconst RE_MESSAGE_START = /^(-?[a-zA-Z][\\w-]*) *= */gm;\n// Both Attributes and Variants are parsed in while loops. These regexes are\n// used to break out of them.\nconst RE_ATTRIBUTE_START = /\\.([a-zA-Z][\\w-]*) *= */y;\nconst RE_VARIANT_START = /\\*?\\[/y;\nconst RE_NUMBER_LITERAL = /(-?[0-9]+(?:\\.([0-9]+))?)/y;\nconst RE_IDENTIFIER = /([a-zA-Z][\\w-]*)/y;\nconst RE_REFERENCE = /([$-])?([a-zA-Z][\\w-]*)(?:\\.([a-zA-Z][\\w-]*))?/y;\nconst RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/;\n// A \"run\" is a sequence of text or string literal characters which don't\n// require any special handling. For TextElements such special characters are: {\n// (starts a placeable), and line breaks which require additional logic to check\n// if the next line is indented. For StringLiterals they are: \\ (starts an\n// escape sequence), \" (ends the literal), and line breaks which are not allowed\n// in StringLiterals. Note that string runs may be empty; text runs may not.\nconst RE_TEXT_RUN = /([^{}\\n\\r]+)/y;\nconst RE_STRING_RUN = /([^\\\\\"\\n\\r]*)/y;\n// Escape sequences.\nconst RE_STRING_ESCAPE = /\\\\([\\\\\"])/y;\nconst RE_UNICODE_ESCAPE = /\\\\u([a-fA-F0-9]{4})|\\\\U([a-fA-F0-9]{6})/y;\n// Used for trimming TextElements and indents.\nconst RE_LEADING_NEWLINES = /^\\n+/;\nconst RE_TRAILING_SPACES = / +$/;\n// Used in makeIndent to strip spaces from blank lines and normalize CRLF to LF.\nconst RE_BLANK_LINES = / *\\r?\\n/g;\n// Used in makeIndent to measure the indentation.\nconst RE_INDENT = /( *)$/;\n// Common tokens.\nconst TOKEN_BRACE_OPEN = /{\\s*/y;\nconst TOKEN_BRACE_CLOSE = /\\s*}/y;\nconst TOKEN_BRACKET_OPEN = /\\[\\s*/y;\nconst TOKEN_BRACKET_CLOSE = /\\s*] */y;\nconst TOKEN_PAREN_OPEN = /\\s*\\(\\s*/y;\nconst TOKEN_ARROW = /\\s*->\\s*/y;\nconst TOKEN_COLON = /\\s*:\\s*/y;\n// Note the optional comma. As a deviation from the Fluent EBNF, the parser\n// doesn't enforce commas between call arguments.\nconst TOKEN_COMMA = /\\s*,?\\s*/y;\nconst TOKEN_BLANK = /\\s+/y;\n/**\n * Fluent Resource is a structure storing parsed localization entries.\n */\nexport class FluentResource {\n    constructor(source) {\n        this.body = [];\n        RE_MESSAGE_START.lastIndex = 0;\n        let cursor = 0;\n        // Iterate over the beginnings of messages and terms to efficiently skip\n        // comments and recover from errors.\n        while (true) {\n            let next = RE_MESSAGE_START.exec(source);\n            if (next === null) {\n                break;\n            }\n            cursor = RE_MESSAGE_START.lastIndex;\n            try {\n                this.body.push(parseMessage(next[1]));\n            }\n            catch (err) {\n                if (err instanceof SyntaxError) {\n                    // Don't report any Fluent syntax errors. Skip directly to the\n                    // beginning of the next message or term.\n                    continue;\n                }\n                throw err;\n            }\n        }\n        // The parser implementation is inlined below for performance reasons,\n        // as well as for convenience of accessing `source` and `cursor`.\n        // The parser focuses on minimizing the number of false negatives at the\n        // expense of increasing the risk of false positives. In other words, it\n        // aims at parsing valid Fluent messages with a success rate of 100%, but it\n        // may also parse a few invalid messages which the reference parser would\n        // reject. The parser doesn't perform any validation and may produce entries\n        // which wouldn't make sense in the real world. For best results users are\n        // advised to validate translations with the fluent-syntax parser\n        // pre-runtime.\n        // The parser makes an extensive use of sticky regexes which can be anchored\n        // to any offset of the source string without slicing it. Errors are thrown\n        // to bail out of parsing of ill-formed messages.\n        function test(re) {\n            re.lastIndex = cursor;\n            return re.test(source);\n        }\n        // Advance the cursor by the char if it matches. May be used as a predicate\n        // (was the match found?) or, if errorClass is passed, as an assertion.\n        function consumeChar(char, errorClass) {\n            if (source[cursor] === char) {\n                cursor++;\n                return true;\n            }\n            if (errorClass) {\n                throw new errorClass(`Expected ${char}`);\n            }\n            return false;\n        }\n        // Advance the cursor by the token if it matches. May be used as a predicate\n        // (was the match found?) or, if errorClass is passed, as an assertion.\n        function consumeToken(re, errorClass) {\n            if (test(re)) {\n                cursor = re.lastIndex;\n                return true;\n            }\n            if (errorClass) {\n                throw new errorClass(`Expected ${re.toString()}`);\n            }\n            return false;\n        }\n        // Execute a regex, advance the cursor, and return all capture groups.\n        function match(re) {\n            re.lastIndex = cursor;\n            let result = re.exec(source);\n            if (result === null) {\n                throw new SyntaxError(`Expected ${re.toString()}`);\n            }\n            cursor = re.lastIndex;\n            return result;\n        }\n        // Execute a regex, advance the cursor, and return the capture group.\n        function match1(re) {\n            return match(re)[1];\n        }\n        function parseMessage(id) {\n            let value = parsePattern();\n            let attributes = parseAttributes();\n            if (value === null && Object.keys(attributes).length === 0) {\n                throw new SyntaxError(\"Expected message value or attributes\");\n            }\n            return { id, value, attributes };\n        }\n        function parseAttributes() {\n            let attrs = Object.create(null);\n            while (test(RE_ATTRIBUTE_START)) {\n                let name = match1(RE_ATTRIBUTE_START);\n                let value = parsePattern();\n                if (value === null) {\n                    throw new SyntaxError(\"Expected attribute value\");\n                }\n                attrs[name] = value;\n            }\n            return attrs;\n        }\n        function parsePattern() {\n            let first;\n            // First try to parse any simple text on the same line as the id.\n            if (test(RE_TEXT_RUN)) {\n                first = match1(RE_TEXT_RUN);\n            }\n            // If there's a placeable on the first line, parse a complex pattern.\n            if (source[cursor] === \"{\" || source[cursor] === \"}\") {\n                // Re-use the text parsed above, if possible.\n                return parsePatternElements(first ? [first] : [], Infinity);\n            }\n            // RE_TEXT_VALUE stops at newlines. Only continue parsing the pattern if\n            // what comes after the newline is indented.\n            let indent = parseIndent();\n            if (indent) {\n                if (first) {\n                    // If there's text on the first line, the blank block is part of the\n                    // translation content in its entirety.\n                    return parsePatternElements([first, indent], indent.length);\n                }\n                // Otherwise, we're dealing with a block pattern, i.e. a pattern which\n                // starts on a new line. Discrad the leading newlines but keep the\n                // inline indent; it will be used by the dedentation logic.\n                indent.value = trim(indent.value, RE_LEADING_NEWLINES);\n                return parsePatternElements([indent], indent.length);\n            }\n            if (first) {\n                // It was just a simple inline text after all.\n                return trim(first, RE_TRAILING_SPACES);\n            }\n            return null;\n        }\n        // Parse a complex pattern as an array of elements.\n        function parsePatternElements(elements = [], commonIndent) {\n            while (true) {\n                if (test(RE_TEXT_RUN)) {\n                    elements.push(match1(RE_TEXT_RUN));\n                    continue;\n                }\n                if (source[cursor] === \"{\") {\n                    elements.push(parsePlaceable());\n                    continue;\n                }\n                if (source[cursor] === \"}\") {\n                    throw new SyntaxError(\"Unbalanced closing brace\");\n                }\n                let indent = parseIndent();\n                if (indent) {\n                    elements.push(indent);\n                    commonIndent = Math.min(commonIndent, indent.length);\n                    continue;\n                }\n                break;\n            }\n            let lastIndex = elements.length - 1;\n            let lastElement = elements[lastIndex];\n            // Trim the trailing spaces in the last element if it's a TextElement.\n            if (typeof lastElement === \"string\") {\n                elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES);\n            }\n            let baked = [];\n            for (let element of elements) {\n                if (element instanceof Indent) {\n                    // Dedent indented lines by the maximum common indent.\n                    element = element.value.slice(0, element.value.length - commonIndent);\n                }\n                if (element) {\n                    baked.push(element);\n                }\n            }\n            return baked;\n        }\n        function parsePlaceable() {\n            consumeToken(TOKEN_BRACE_OPEN, SyntaxError);\n            let selector = parseInlineExpression();\n            if (consumeToken(TOKEN_BRACE_CLOSE)) {\n                return selector;\n            }\n            if (consumeToken(TOKEN_ARROW)) {\n                let variants = parseVariants();\n                consumeToken(TOKEN_BRACE_CLOSE, SyntaxError);\n                return {\n                    type: \"select\",\n                    selector,\n                    ...variants,\n                };\n            }\n            throw new SyntaxError(\"Unclosed placeable\");\n        }\n        function parseInlineExpression() {\n            if (source[cursor] === \"{\") {\n                // It's a nested placeable.\n                return parsePlaceable();\n            }\n            if (test(RE_REFERENCE)) {\n                let [, sigil, name, attr = null] = match(RE_REFERENCE);\n                if (sigil === \"$\") {\n                    return { type: \"var\", name };\n                }\n                if (consumeToken(TOKEN_PAREN_OPEN)) {\n                    let args = parseArguments();\n                    if (sigil === \"-\") {\n                        // A parameterized term: -term(...).\n                        return { type: \"term\", name, attr, args };\n                    }\n                    if (RE_FUNCTION_NAME.test(name)) {\n                        return { type: \"func\", name, args };\n                    }\n                    throw new SyntaxError(\"Function names must be all upper-case\");\n                }\n                if (sigil === \"-\") {\n                    // A non-parameterized term: -term.\n                    return {\n                        type: \"term\",\n                        name,\n                        attr,\n                        args: [],\n                    };\n                }\n                return { type: \"mesg\", name, attr };\n            }\n            return parseLiteral();\n        }\n        function parseArguments() {\n            let args = [];\n            while (true) {\n                switch (source[cursor]) {\n                    case \")\": // End of the argument list.\n                        cursor++;\n                        return args;\n                    case undefined: // EOF\n                        throw new SyntaxError(\"Unclosed argument list\");\n                }\n                args.push(parseArgument());\n                // Commas between arguments are treated as whitespace.\n                consumeToken(TOKEN_COMMA);\n            }\n        }\n        function parseArgument() {\n            let expr = parseInlineExpression();\n            if (expr.type !== \"mesg\") {\n                return expr;\n            }\n            if (consumeToken(TOKEN_COLON)) {\n                // The reference is the beginning of a named argument.\n                return {\n                    type: \"narg\",\n                    name: expr.name,\n                    value: parseLiteral(),\n                };\n            }\n            // It's a regular message reference.\n            return expr;\n        }\n        function parseVariants() {\n            let variants = [];\n            let count = 0;\n            let star;\n            while (test(RE_VARIANT_START)) {\n                if (consumeChar(\"*\")) {\n                    star = count;\n                }\n                let key = parseVariantKey();\n                let value = parsePattern();\n                if (value === null) {\n                    throw new SyntaxError(\"Expected variant value\");\n                }\n                variants[count++] = { key, value };\n            }\n            if (count === 0) {\n                return null;\n            }\n            if (star === undefined) {\n                throw new SyntaxError(\"Expected default variant\");\n            }\n            return { variants, star };\n        }\n        function parseVariantKey() {\n            consumeToken(TOKEN_BRACKET_OPEN, SyntaxError);\n            let key;\n            if (test(RE_NUMBER_LITERAL)) {\n                key = parseNumberLiteral();\n            }\n            else {\n                key = {\n                    type: \"str\",\n                    value: match1(RE_IDENTIFIER),\n                };\n            }\n            consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError);\n            return key;\n        }\n        function parseLiteral() {\n            if (test(RE_NUMBER_LITERAL)) {\n                return parseNumberLiteral();\n            }\n            if (source[cursor] === '\"') {\n                return parseStringLiteral();\n            }\n            throw new SyntaxError(\"Invalid expression\");\n        }\n        function parseNumberLiteral() {\n            let [, value, fraction = \"\"] = match(RE_NUMBER_LITERAL);\n            let precision = fraction.length;\n            return {\n                type: \"num\",\n                value: parseFloat(value),\n                precision,\n            };\n        }\n        function parseStringLiteral() {\n            consumeChar('\"', SyntaxError);\n            let value = \"\";\n            while (true) {\n                value += match1(RE_STRING_RUN);\n                if (source[cursor] === \"\\\\\") {\n                    value += parseEscapeSequence();\n                    continue;\n                }\n                if (consumeChar('\"')) {\n                    return { type: \"str\", value };\n                }\n                // We've reached an EOL of EOF.\n                throw new SyntaxError(\"Unclosed string literal\");\n            }\n        }\n        // Unescape known escape sequences.\n        function parseEscapeSequence() {\n            if (test(RE_STRING_ESCAPE)) {\n                return match1(RE_STRING_ESCAPE);\n            }\n            if (test(RE_UNICODE_ESCAPE)) {\n                let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE);\n                let codepoint = parseInt(codepoint4 || codepoint6, 16);\n                return codepoint <= 0xd7ff || 0xe000 <= codepoint\n                    ? // It's a Unicode scalar value.\n                        String.fromCodePoint(codepoint)\n                    : // Lonely surrogates can cause trouble when the parsing result is\n                        // saved using UTF-8. Use U+FFFD REPLACEMENT CHARACTER instead.\n                        \"�\";\n            }\n            throw new SyntaxError(\"Unknown escape sequence\");\n        }\n        // Parse blank space. Return it if it looks like indent before a pattern\n        // line. Skip it othwerwise.\n        function parseIndent() {\n            let start = cursor;\n            consumeToken(TOKEN_BLANK);\n            // Check the first non-blank character after the indent.\n            switch (source[cursor]) {\n                case \".\":\n                case \"[\":\n                case \"*\":\n                case \"}\":\n                case undefined: // EOF\n                    // A special character. End the Pattern.\n                    return false;\n                case \"{\":\n                    // Placeables don't require indentation (in EBNF: block-placeable).\n                    // Continue the Pattern.\n                    return makeIndent(source.slice(start, cursor));\n            }\n            // If the first character on the line is not one of the special characters\n            // listed above, it's a regular text character. Check if there's at least\n            // one space of indent before it.\n            if (source[cursor - 1] === \" \") {\n                // It's an indented text character (in EBNF: indented-char). Continue\n                // the Pattern.\n                return makeIndent(source.slice(start, cursor));\n            }\n            // A not-indented text character is likely the identifier of the next\n            // message. End the Pattern.\n            return false;\n        }\n        // Trim blanks in text according to the given regex.\n        function trim(text, re) {\n            return text.replace(re, \"\");\n        }\n        // Normalize a blank block and extract the indent details.\n        function makeIndent(blank) {\n            let value = blank.replace(RE_BLANK_LINES, \"\\n\");\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            let length = RE_INDENT.exec(blank)[1].length;\n            return new Indent(value, length);\n        }\n    }\n}\nclass Indent {\n    constructor(value, length) {\n        this.value = value;\n        this.length = length;\n    }\n}\n","/**\n * @module fluent\n * @overview\n *\n * `fluent` is a JavaScript implementation of Project Fluent, a localization\n * framework designed to unleash the expressive power of the natural language.\n *\n */\nexport { FluentBundle } from \"./bundle.js\";\nexport { FluentResource } from \"./resource.js\";\nexport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n","/* eslint no-console: [\"error\", {allow: [\"warn\"]}] */\n/* global console */\n// Match the opening angle bracket (<) in HTML tags, and HTML entities like\n// &amp;, &#0038;, &#x0026;.\nconst reOverlay = /<|&#?\\w+;/;\n/**\n * Elements allowed in translations even if they are not present in the source\n * HTML. They are text-level elements as defined by the HTML5 spec:\n * https://www.w3.org/TR/html5/text-level-semantics.html with the exception of:\n *\n *   - a - because we don't allow href on it anyways,\n *   - ruby, rt, rp - because we don't allow nested elements to be inserted.\n */\nconst TEXT_LEVEL_ELEMENTS = {\n    \"http://www.w3.org/1999/xhtml\": [\n        \"em\",\n        \"strong\",\n        \"small\",\n        \"s\",\n        \"cite\",\n        \"q\",\n        \"dfn\",\n        \"abbr\",\n        \"data\",\n        \"time\",\n        \"code\",\n        \"var\",\n        \"samp\",\n        \"kbd\",\n        \"sub\",\n        \"sup\",\n        \"i\",\n        \"b\",\n        \"u\",\n        \"mark\",\n        \"bdi\",\n        \"bdo\",\n        \"span\",\n        \"br\",\n        \"wbr\",\n    ],\n};\nconst LOCALIZABLE_ATTRIBUTES = {\n    \"http://www.w3.org/1999/xhtml\": {\n        global: [\"title\", \"aria-label\", \"aria-valuetext\"],\n        a: [\"download\"],\n        area: [\"download\", \"alt\"],\n        // value is special-cased in isAttrNameLocalizable\n        input: [\"alt\", \"placeholder\"],\n        menuitem: [\"label\"],\n        menu: [\"label\"],\n        optgroup: [\"label\"],\n        option: [\"label\"],\n        track: [\"label\"],\n        img: [\"alt\"],\n        textarea: [\"placeholder\"],\n        th: [\"abbr\"],\n    },\n    \"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul\": {\n        global: [\n            \"accesskey\",\n            \"aria-label\",\n            \"aria-valuetext\",\n            \"label\",\n            \"title\",\n            \"tooltiptext\",\n        ],\n        description: [\"value\"],\n        key: [\"key\", \"keycode\"],\n        label: [\"value\"],\n        textbox: [\"placeholder\", \"value\"],\n    },\n};\n/**\n * Translate an element.\n *\n * Translate the element's text content and attributes. Some HTML markup is\n * allowed in the translation. The element's children with the data-l10n-name\n * attribute will be treated as arguments to the translation. If the\n * translation defines the same children, their attributes and text contents\n * will be used for translating the matching source child.\n *\n * @param   {Element} element\n * @param   {Object} translation\n * @private\n */\nexport default function translateElement(element, translation) {\n    const { value } = translation;\n    if (typeof value === \"string\") {\n        if (element.localName === \"title\" &&\n            element.namespaceURI === \"http://www.w3.org/1999/xhtml\") {\n            // A special case for the HTML title element whose content must be text.\n            element.textContent = value;\n        }\n        else if (!reOverlay.test(value)) {\n            // If the translation doesn't contain any markup skip the overlay logic.\n            element.textContent = value;\n        }\n        else {\n            // Else parse the translation's HTML using an inert template element,\n            // sanitize it and replace the element's content.\n            const templateElement = element.ownerDocument.createElementNS(\"http://www.w3.org/1999/xhtml\", \"template\");\n            templateElement.innerHTML = value;\n            overlayChildNodes(templateElement.content, element);\n        }\n    }\n    // Even if the translation doesn't define any localizable attributes, run\n    // overlayAttributes to remove any localizable attributes set by previous\n    // translations.\n    overlayAttributes(translation, element);\n}\n/**\n * Replace child nodes of an element with child nodes of another element.\n *\n * The contents of the target element will be cleared and fully replaced with\n * sanitized contents of the source element.\n *\n * @param {DocumentFragment} fromFragment - The source of children to overlay.\n * @param {Element} toElement - The target of the overlay.\n * @private\n */\nfunction overlayChildNodes(fromFragment, toElement) {\n    for (const childNode of fromFragment.childNodes) {\n        if (childNode.nodeType === childNode.TEXT_NODE) {\n            // Keep the translated text node.\n            continue;\n        }\n        if (childNode.hasAttribute(\"data-l10n-name\")) {\n            const sanitized = getNodeForNamedElement(toElement, childNode);\n            fromFragment.replaceChild(sanitized, childNode);\n            continue;\n        }\n        if (isElementAllowed(childNode)) {\n            const sanitized = createSanitizedElement(childNode);\n            fromFragment.replaceChild(sanitized, childNode);\n            continue;\n        }\n        console.warn(`An element of forbidden type \"${childNode.localName}\" was found in ` +\n            \"the translation. Only safe text-level elements and elements with \" +\n            \"data-l10n-name are allowed.\");\n        // If all else fails, replace the element with its text content.\n        fromFragment.replaceChild(createTextNodeFromTextContent(childNode), childNode);\n    }\n    toElement.textContent = \"\";\n    toElement.appendChild(fromFragment);\n}\nfunction hasAttribute(attributes, name) {\n    if (!attributes) {\n        return false;\n    }\n    for (let attr of attributes) {\n        if (attr.name === name) {\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Transplant localizable attributes of an element to another element.\n *\n * Any localizable attributes already set on the target element will be\n * cleared.\n *\n * @param   {Element|Object} fromElement - The source of child nodes to overlay.\n * @param   {Element} toElement - The target of the overlay.\n * @private\n */\nfunction overlayAttributes(fromElement, toElement) {\n    const explicitlyAllowed = toElement.hasAttribute(\"data-l10n-attrs\")\n        ? toElement\n            .getAttribute(\"data-l10n-attrs\")\n            .split(\",\")\n            .map(i => i.trim())\n        : null;\n    // Remove existing localizable attributes if they\n    // will not be used in the new translation.\n    for (const attr of Array.from(toElement.attributes)) {\n        if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) &&\n            !hasAttribute(fromElement.attributes, attr.name)) {\n            toElement.removeAttribute(attr.name);\n        }\n    }\n    // fromElement might be a {value, attributes} object as returned by\n    // Localization.messageFromBundle. In which case attributes may be null to\n    // save GC cycles.\n    if (!fromElement.attributes) {\n        return;\n    }\n    // Set localizable attributes.\n    for (const attr of Array.from(fromElement.attributes)) {\n        if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) &&\n            toElement.getAttribute(attr.name) !== attr.value) {\n            toElement.setAttribute(attr.name, attr.value);\n        }\n    }\n}\n/**\n * Sanitize a child element created by the translation.\n *\n * Try to find a corresponding child in sourceElement and use it as the base\n * for the sanitization. This will preserve functional attribtues defined on\n * the child element in the source HTML.\n *\n * @param   {Element} sourceElement - The source for data-l10n-name lookups.\n * @param   {Element} translatedChild - The translated child to be sanitized.\n * @returns {Element}\n * @private\n */\nfunction getNodeForNamedElement(sourceElement, translatedChild) {\n    const childName = translatedChild.getAttribute(\"data-l10n-name\");\n    const sourceChild = sourceElement.querySelector(`[data-l10n-name=\"${childName}\"]`);\n    if (!sourceChild) {\n        console.warn(`An element named \"${childName}\" wasn't found in the source.`);\n        return createTextNodeFromTextContent(translatedChild);\n    }\n    if (sourceChild.localName !== translatedChild.localName) {\n        console.warn(`An element named \"${childName}\" was found in the translation ` +\n            `but its type ${translatedChild.localName} didn't match the ` +\n            `element found in the source (${sourceChild.localName}).`);\n        return createTextNodeFromTextContent(translatedChild);\n    }\n    // Remove it from sourceElement so that the translation cannot use\n    // the same reference name again.\n    sourceElement.removeChild(sourceChild);\n    // We can't currently guarantee that a translation won't remove\n    // sourceChild from the element completely, which could break the app if\n    // it relies on an event handler attached to the sourceChild. Let's make\n    // this limitation explicit for now by breaking the identitiy of the\n    // sourceChild by cloning it. This will destroy all event handlers\n    // attached to sourceChild via addEventListener and via on<name>\n    // properties.\n    const clone = sourceChild.cloneNode(false);\n    return shallowPopulateUsing(translatedChild, clone);\n}\n/**\n * Sanitize an allowed element.\n *\n * Text-level elements allowed in translations may only use safe attributes\n * and will have any nested markup stripped to text content.\n *\n * @param   {Element} element - The element to be sanitized.\n * @returns {Element}\n * @private\n */\nfunction createSanitizedElement(element) {\n    // Start with an empty element of the same type to remove nested children\n    // and non-localizable attributes defined by the translation.\n    const clone = element.ownerDocument.createElement(element.localName);\n    return shallowPopulateUsing(element, clone);\n}\n/**\n * Convert an element to a text node.\n *\n * @param   {Element} element - The element to be sanitized.\n * @returns {Node}\n * @private\n */\nfunction createTextNodeFromTextContent(element) {\n    return element.ownerDocument.createTextNode(element.textContent);\n}\n/**\n * Check if element is allowed in the translation.\n *\n * This method is used by the sanitizer when the translation markup contains\n * an element which is not present in the source code.\n *\n * @param   {Element} element\n * @returns {boolean}\n * @private\n */\nfunction isElementAllowed(element) {\n    const allowed = TEXT_LEVEL_ELEMENTS[element.namespaceURI];\n    return allowed && allowed.includes(element.localName);\n}\n/**\n * Check if attribute is allowed for the given element.\n *\n * This method is used by the sanitizer when the translation markup contains\n * DOM attributes, or when the translation has traits which map to DOM\n * attributes.\n *\n * `explicitlyAllowed` can be passed as a list of attributes explicitly\n * allowed on this element.\n *\n * @param   {string}         name\n * @param   {Element}        element\n * @param   {Array}          explicitlyAllowed\n * @returns {boolean}\n * @private\n */\nfunction isAttrNameLocalizable(name, element, explicitlyAllowed = null) {\n    if (explicitlyAllowed && explicitlyAllowed.includes(name)) {\n        return true;\n    }\n    const allowed = LOCALIZABLE_ATTRIBUTES[element.namespaceURI];\n    if (!allowed) {\n        return false;\n    }\n    const attrName = name.toLowerCase();\n    const elemName = element.localName;\n    // Is it a globally safe attribute?\n    if (allowed.global.includes(attrName)) {\n        return true;\n    }\n    // Are there no allowed attributes for this element?\n    if (!allowed[elemName]) {\n        return false;\n    }\n    // Is it allowed on this element?\n    if (allowed[elemName].includes(attrName)) {\n        return true;\n    }\n    // Special case for value on HTML inputs with type button, reset, submit\n    if (element.namespaceURI === \"http://www.w3.org/1999/xhtml\" &&\n        elemName === \"input\" &&\n        attrName === \"value\") {\n        const type = element.type.toLowerCase();\n        if (type === \"submit\" || type === \"button\" || type === \"reset\") {\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Helper to set textContent and localizable attributes on an element.\n *\n * @param   {Element} fromElement\n * @param   {Element} toElement\n * @returns {Element}\n * @private\n */\nfunction shallowPopulateUsing(fromElement, toElement) {\n    toElement.textContent = fromElement.textContent;\n    overlayAttributes(fromElement, toElement);\n    return toElement;\n}\n","/*\n * Base CachedIterable class.\n */\nexport default class CachedIterable extends Array {\n    /**\n     * Create a `CachedIterable` instance from an iterable or, if another\n     * instance of `CachedIterable` is passed, return it without any\n     * modifications.\n     *\n     * @param {Iterable} iterable\n     * @returns {CachedIterable}\n     */\n    static from(iterable) {\n        if (iterable instanceof this) {\n            return iterable;\n        }\n\n        return new this(iterable);\n    }\n}\n","import CachedIterable from \"./cached_iterable.mjs\";\n\n/*\n * CachedSyncIterable caches the elements yielded by an iterable.\n *\n * It can be used to iterate over an iterable many times without depleting the\n * iterable.\n */\nexport default class CachedSyncIterable extends CachedIterable {\n    /**\n     * Create an `CachedSyncIterable` instance.\n     *\n     * @param {Iterable} iterable\n     * @returns {CachedSyncIterable}\n     */\n    constructor(iterable) {\n        super();\n\n        if (Symbol.iterator in Object(iterable)) {\n            this.iterator = iterable[Symbol.iterator]();\n        } else {\n            throw new TypeError(\"Argument must implement the iteration protocol.\");\n        }\n    }\n\n    [Symbol.iterator]() {\n        const cached = this;\n        let cur = 0;\n\n        return {\n            next() {\n                if (cached.length <= cur) {\n                    cached.push(cached.iterator.next());\n                }\n                return cached[cur++];\n            }\n        };\n    }\n\n    /**\n     * This method allows user to consume the next element from the iterator\n     * into the cache.\n     *\n     * @param {number} count - number of elements to consume\n     */\n    touchNext(count = 1) {\n        let idx = 0;\n        while (idx++ < count) {\n            const last = this[this.length - 1];\n            if (last && last.done) {\n                break;\n            }\n            this.push(this.iterator.next());\n        }\n        // Return the last cached {value, done} object to allow the calling\n        // code to decide if it needs to call touchNext again.\n        return this[this.length - 1];\n    }\n}\n","import CachedIterable from \"./cached_iterable.mjs\";\n\n/*\n * CachedAsyncIterable caches the elements yielded by an async iterable.\n *\n * It can be used to iterate over an iterable many times without depleting the\n * iterable.\n */\nexport default class CachedAsyncIterable extends CachedIterable {\n    /**\n     * Create an `CachedAsyncIterable` instance.\n     *\n     * @param {Iterable} iterable\n     * @returns {CachedAsyncIterable}\n     */\n    constructor(iterable) {\n        super();\n\n        if (Symbol.asyncIterator in Object(iterable)) {\n            this.iterator = iterable[Symbol.asyncIterator]();\n        } else if (Symbol.iterator in Object(iterable)) {\n            this.iterator = iterable[Symbol.iterator]();\n        } else {\n            throw new TypeError(\"Argument must implement the iteration protocol.\");\n        }\n    }\n\n    /**\n     * Asynchronous iterator caching the yielded elements.\n     *\n     * Elements yielded by the original iterable will be cached and available\n     * synchronously. Returns an async generator object implementing the\n     * iterator protocol over the elements of the original (async or sync)\n     * iterable.\n     */\n    [Symbol.asyncIterator]() {\n        const cached = this;\n        let cur = 0;\n\n        return {\n            async next() {\n                if (cached.length <= cur) {\n                    cached.push(cached.iterator.next());\n                }\n                return cached[cur++];\n            }\n        };\n    }\n\n    /**\n     * This method allows user to consume the next element from the iterator\n     * into the cache.\n     *\n     * @param {number} count - number of elements to consume\n     */\n    async touchNext(count = 1) {\n        let idx = 0;\n        while (idx++ < count) {\n            const last = this[this.length - 1];\n            if (last && (await last).done) {\n                break;\n            }\n            this.push(this.iterator.next());\n        }\n        // Return the last cached {value, done} object to allow the calling\n        // code to decide if it needs to call touchNext again.\n        return this[this.length - 1];\n    }\n}\n","export {default as CachedSyncIterable} from \"./cached_sync_iterable.mjs\";\nexport {default as CachedAsyncIterable} from \"./cached_async_iterable.mjs\";\n","/* eslint no-console: [\"error\", { allow: [\"warn\", \"error\"] }] */\n/* global console */\nimport { CachedAsyncIterable } from \"cached-iterable\";\n/**\n * The `Localization` class is a central high-level API for vanilla\n * JavaScript use of Fluent.\n * It combines language negotiation, FluentBundle and I/O to\n * provide a scriptable API to format translations.\n */\nexport default class Localization {\n    /**\n     * @param {Array<String>} resourceIds     - List of resource IDs\n     * @param {Function}      generateBundles - Function that returns a\n     *                                          generator over FluentBundles\n     *\n     * @returns {Localization}\n     */\n    constructor(resourceIds = [], generateBundles) {\n        this.resourceIds = resourceIds;\n        this.generateBundles = generateBundles;\n        this.onChange(true);\n    }\n    addResourceIds(resourceIds, eager = false) {\n        this.resourceIds.push(...resourceIds);\n        this.onChange(eager);\n        return this.resourceIds.length;\n    }\n    removeResourceIds(resourceIds) {\n        this.resourceIds = this.resourceIds.filter(r => !resourceIds.includes(r));\n        this.onChange();\n        return this.resourceIds.length;\n    }\n    /**\n     * Format translations and handle fallback if needed.\n     *\n     * Format translations for `keys` from `FluentBundle` instances on this\n     * DOMLocalization. In case of errors, fetch the next context in the\n     * fallback chain.\n     *\n     * @param   {Array<Object>}         keys    - Translation keys to format.\n     * @param   {Function}              method  - Formatting function.\n     * @returns {Promise<Array<string|Object>>}\n     * @private\n     */\n    async formatWithFallback(keys, method) {\n        const translations = [];\n        let hasAtLeastOneBundle = false;\n        for await (const bundle of this.bundles) {\n            hasAtLeastOneBundle = true;\n            const missingIds = keysFromBundle(method, bundle, keys, translations);\n            if (missingIds.size === 0) {\n                break;\n            }\n            if (typeof console !== \"undefined\") {\n                const locale = bundle.locales[0];\n                const ids = Array.from(missingIds).join(\", \");\n                console.warn(`[fluent] Missing translations in ${locale}: ${ids}`);\n            }\n        }\n        if (!hasAtLeastOneBundle && typeof console !== \"undefined\") {\n            // eslint-disable-next-line max-len\n            console.warn(`[fluent] Request for keys failed because no resource bundles got generated.\n  keys: ${JSON.stringify(keys)}.\n  resourceIds: ${JSON.stringify(this.resourceIds)}.`);\n        }\n        return translations;\n    }\n    /**\n     * Format translations into `{value, attributes}` objects.\n     *\n     * The fallback logic is the same as in `formatValues`\n     * but it returns `{value, attributes}` objects\n     * which are suitable for the translation of DOM elements.\n     *\n     * Returns a Promise resolving to an array of the translation strings.\n     *\n     * @example\n     * ```js\n     * docL10n.formatMessages([\n     *   {id: 'hello', args: { who: 'Mary' }},\n     *   {id: 'welcome'}\n     * ]).then(console.log);\n     *\n     * // [\n     * //   { value: 'Hello, Mary!', attributes: null },\n     * //   {\n     * //     value: 'Welcome!',\n     * //     attributes: [ { name: \"title\", value: 'Hello' } ]\n     * //   }\n     * // ]\n     * ```\n     *\n     * @param   {Array<Object>} keys\n     * @returns {Promise<Array<{value: string, attributes: Object}>>}\n     * @private\n     */\n    formatMessages(keys) {\n        return this.formatWithFallback(keys, messageFromBundle);\n    }\n    /**\n     * Retrieve translations corresponding to the passed keys.\n     *\n     * A generalized version of `DOMLocalization.formatValue`. Keys must\n     * be `{id, args}` objects.\n     *\n     * Returns a Promise resolving to an array of the translation strings.\n     *\n     * @example\n     * ```js\n     * docL10n.formatValues([\n     *   {id: 'hello', args: { who: 'Mary' }},\n     *   {id: 'hello', args: { who: 'John' }},\n     *   {id: 'welcome'}\n     * ]).then(console.log);\n     *\n     * // ['Hello, Mary!', 'Hello, John!', 'Welcome!']\n     * ```\n     *\n     * @param   {Array<Object>} keys\n     * @returns {Promise<Array<string>>}\n     */\n    formatValues(keys) {\n        return this.formatWithFallback(keys, valueFromBundle);\n    }\n    /**\n     * Retrieve the translation corresponding to the `id` identifier.\n     *\n     * If passed, `args` is a simple hash object with a list of variables that\n     * will be interpolated in the value of the translation.\n     *\n     * Returns a Promise resolving to the translation string.\n     *\n     * Use this sparingly for one-off messages which don't need to be\n     * retranslated when the user changes their language preferences, e.g. in\n     * notifications.\n     *\n     * @example\n     * ```js\n     * docL10n.formatValue(\n     *   'hello', { who: 'world' }\n     * ).then(console.log);\n     *\n     * // 'Hello, world!'\n     * ```\n     *\n     * @param   {string}  id     - Identifier of the translation to format\n     * @param   {Object}  [args] - Optional external arguments\n     * @returns {Promise<string>}\n     */\n    async formatValue(id, args) {\n        const [val] = await this.formatValues([{ id, args }]);\n        return val;\n    }\n    handleEvent() {\n        this.onChange();\n    }\n    /**\n     * This method should be called when there's a reason to believe\n     * that language negotiation or available resources changed.\n     */\n    onChange(eager = false) {\n        this.bundles = CachedAsyncIterable.from(this.generateBundles(this.resourceIds));\n        if (eager) {\n            this.bundles.touchNext(2);\n        }\n    }\n}\n/**\n * Format the value of a message into a string or `null`.\n *\n * This function is passed as a method to `keysFromBundle` and resolve\n * a value of a single L10n Entity using provided `FluentBundle`.\n *\n * If the message doesn't have a value, return `null`.\n *\n * @param   {FluentBundle} bundle\n * @param   {Array<Error>} errors\n * @param   {Object} message\n * @param   {Object} args\n * @returns {string|null}\n * @private\n */\nfunction valueFromBundle(bundle, errors, message, args) {\n    if (message.value) {\n        return bundle.formatPattern(message.value, args, errors);\n    }\n    return null;\n}\n/**\n * Format all public values of a message into a {value, attributes} object.\n *\n * This function is passed as a method to `keysFromBundle` and resolve\n * a single L10n Entity using provided `FluentBundle`.\n *\n * The function will return an object with a value and attributes of the\n * entity.\n *\n * @param   {FluentBundle} bundle\n * @param   {Array<Error>} errors\n * @param   {Object} message\n * @param   {Object} args\n * @returns {Object}\n * @private\n */\nfunction messageFromBundle(bundle, errors, message, args) {\n    const formatted = {\n        value: null,\n        attributes: null,\n    };\n    if (message.value) {\n        formatted.value = bundle.formatPattern(message.value, args, errors);\n    }\n    let attrNames = Object.keys(message.attributes);\n    if (attrNames.length > 0) {\n        formatted.attributes = new Array(attrNames.length);\n        for (let [i, name] of attrNames.entries()) {\n            let value = bundle.formatPattern(message.attributes[name], args, errors);\n            formatted.attributes[i] = { name, value };\n        }\n    }\n    return formatted;\n}\n/**\n * This function is an inner function for `Localization.formatWithFallback`.\n *\n * It takes a `FluentBundle`, list of l10n-ids and a method to be used for\n * key resolution (either `valueFromBundle` or `messageFromBundle`) and\n * optionally a value returned from `keysFromBundle` executed against\n * another `FluentBundle`.\n *\n * The idea here is that if the previous `FluentBundle` did not resolve\n * all keys, we're calling this function with the next context to resolve\n * the remaining ones.\n *\n * In the function, we loop over `keys` and check if we have the `prev`\n * passed and if it has an error entry for the position we're in.\n *\n * If it doesn't, it means that we have a good translation for this key and\n * we return it. If it does, we'll try to resolve the key using the passed\n * `FluentBundle`.\n *\n * In the end, we fill the translations array, and return the Set with\n * missing ids.\n *\n * See `Localization.formatWithFallback` for more info on how this is used.\n *\n * @param {Function}       method\n * @param {FluentBundle} bundle\n * @param {Array<string>}  keys\n * @param {{Array<{value: string, attributes: Object}>}} translations\n *\n * @returns {Set<string>}\n * @private\n */\nfunction keysFromBundle(method, bundle, keys, translations) {\n    const messageErrors = [];\n    const missingIds = new Set();\n    keys.forEach(({ id, args }, i) => {\n        if (translations[i] !== undefined) {\n            return;\n        }\n        let message = bundle.getMessage(id);\n        if (message) {\n            messageErrors.length = 0;\n            translations[i] = method(bundle, messageErrors, message, args);\n            if (messageErrors.length > 0 && typeof console !== \"undefined\") {\n                const locale = bundle.locales[0];\n                const errors = messageErrors.join(\", \");\n                // eslint-disable-next-line max-len\n                console.warn(`[fluent][resolver] errors in ${locale}/${id}: ${errors}.`);\n            }\n        }\n        else {\n            missingIds.add(id);\n        }\n    });\n    return missingIds;\n}\n","import translateElement from \"./overlay.js\";\nimport Localization from \"./localization.js\";\nconst L10NID_ATTR_NAME = \"data-l10n-id\";\nconst L10NARGS_ATTR_NAME = \"data-l10n-args\";\nconst L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`;\n/**\n * The `DOMLocalization` class is responsible for fetching resources and\n * formatting translations.\n *\n * It implements the fallback strategy in case of errors encountered during the\n * formatting of translations and methods for observing DOM\n * trees with a `MutationObserver`.\n */\nexport default class DOMLocalization extends Localization {\n    /**\n     * @param {Array<String>}    resourceIds     - List of resource IDs\n     * @param {Function}         generateBundles - Function that returns a\n     *                                             generator over FluentBundles\n     * @returns {DOMLocalization}\n     */\n    constructor(resourceIds, generateBundles) {\n        super(resourceIds, generateBundles);\n        // A Set of DOM trees observed by the `MutationObserver`.\n        this.roots = new Set();\n        // requestAnimationFrame handler.\n        this.pendingrAF = null;\n        // list of elements pending for translation.\n        this.pendingElements = new Set();\n        this.windowElement = null;\n        this.mutationObserver = null;\n        this.observerConfig = {\n            attributes: true,\n            characterData: false,\n            childList: true,\n            subtree: true,\n            attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME],\n        };\n    }\n    onChange(eager = false) {\n        super.onChange(eager);\n        if (this.roots) {\n            this.translateRoots();\n        }\n    }\n    /**\n     * Set the `data-l10n-id` and `data-l10n-args` attributes on DOM elements.\n     * FluentDOM makes use of mutation observers to detect changes\n     * to `data-l10n-*` attributes and translate elements asynchronously.\n     * `setAttributes` is a convenience method which allows to translate\n     * DOM elements declaratively.\n     *\n     * You should always prefer to use `data-l10n-id` on elements (statically in\n     * HTML or dynamically via `setAttributes`) over manually retrieving\n     * translations with `format`.  The use of attributes ensures that the\n     * elements can be retranslated when the user changes their language\n     * preferences.\n     *\n     * ```javascript\n     * localization.setAttributes(\n     *   document.querySelector('#welcome'), 'hello', { who: 'world' }\n     * );\n     * ```\n     *\n     * This will set the following attributes on the `#welcome` element.\n     * The MutationObserver will pick up this change and will localize the element\n     * asynchronously.\n     *\n     * ```html\n     * <p id='welcome'\n     *   data-l10n-id='hello'\n     *   data-l10n-args='{\"who\": \"world\"}'>\n     * </p>\n     * ```\n     *\n     * @param {Element}                element - Element to set attributes on\n     * @param {string}                 id      - l10n-id string\n     * @param {Object<string, string>} args    - KVP list of l10n arguments\n     * @returns {Element}\n     */\n    setAttributes(element, id, args) {\n        element.setAttribute(L10NID_ATTR_NAME, id);\n        if (args) {\n            element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args));\n        }\n        else {\n            element.removeAttribute(L10NARGS_ATTR_NAME);\n        }\n        return element;\n    }\n    /**\n     * Get the `data-l10n-*` attributes from DOM elements.\n     *\n     * ```javascript\n     * localization.getAttributes(\n     *   document.querySelector('#welcome')\n     * );\n     * // -> { id: 'hello', args: { who: 'world' } }\n     * ```\n     *\n     * @param   {Element}  element - HTML element\n     * @returns {{id: string, args: Object}}\n     */\n    getAttributes(element) {\n        return {\n            id: element.getAttribute(L10NID_ATTR_NAME),\n            args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),\n        };\n    }\n    /**\n     * Add `newRoot` to the list of roots managed by this `DOMLocalization`.\n     *\n     * Additionally, if this `DOMLocalization` has an observer, start observing\n     * `newRoot` in order to translate mutations in it.\n     *\n     * @param {Element}      newRoot - Root to observe.\n     */\n    connectRoot(newRoot) {\n        for (const root of this.roots) {\n            if (root === newRoot ||\n                root.contains(newRoot) ||\n                newRoot.contains(root)) {\n                throw new Error(\"Cannot add a root that overlaps with existing root.\");\n            }\n        }\n        if (this.windowElement) {\n            if (this.windowElement !== newRoot.ownerDocument.defaultView) {\n                throw new Error(`Cannot connect a root:\n          DOMLocalization already has a root from a different window.`);\n            }\n        }\n        else {\n            this.windowElement = newRoot.ownerDocument.defaultView;\n            this.mutationObserver = new this.windowElement.MutationObserver(mutations => this.translateMutations(mutations));\n        }\n        this.roots.add(newRoot);\n        this.mutationObserver.observe(newRoot, this.observerConfig);\n    }\n    /**\n     * Remove `root` from the list of roots managed by this `DOMLocalization`.\n     *\n     * Additionally, if this `DOMLocalization` has an observer, stop observing\n     * `root`.\n     *\n     * Returns `true` if the root was the last one managed by this\n     * `DOMLocalization`.\n     *\n     * @param   {Element} root - Root to disconnect.\n     * @returns {boolean}\n     */\n    disconnectRoot(root) {\n        this.roots.delete(root);\n        // Pause the mutation observer to stop observing `root`.\n        this.pauseObserving();\n        if (this.roots.size === 0) {\n            this.mutationObserver = null;\n            if (this.windowElement && this.pendingrAF) {\n                this.windowElement.cancelAnimationFrame(this.pendingrAF);\n            }\n            this.windowElement = null;\n            this.pendingrAF = null;\n            this.pendingElements.clear();\n            return true;\n        }\n        // Resume observing all other roots.\n        this.resumeObserving();\n        return false;\n    }\n    /**\n     * Translate all roots associated with this `DOMLocalization`.\n     *\n     * @returns {Promise}\n     */\n    translateRoots() {\n        const roots = Array.from(this.roots);\n        return Promise.all(roots.map(root => this.translateFragment(root)));\n    }\n    /**\n     * Pauses the `MutationObserver`.\n     */\n    pauseObserving() {\n        if (!this.mutationObserver) {\n            return;\n        }\n        this.translateMutations(this.mutationObserver.takeRecords());\n        this.mutationObserver.disconnect();\n    }\n    /**\n     * Resumes the `MutationObserver`.\n     */\n    resumeObserving() {\n        if (!this.mutationObserver) {\n            return;\n        }\n        for (const root of this.roots) {\n            this.mutationObserver.observe(root, this.observerConfig);\n        }\n    }\n    /**\n     * Translate mutations detected by the `MutationObserver`.\n     *\n     * @private\n     */\n    translateMutations(mutations) {\n        for (const mutation of mutations) {\n            switch (mutation.type) {\n                case \"attributes\":\n                    if (mutation.target.hasAttribute(\"data-l10n-id\")) {\n                        this.pendingElements.add(mutation.target);\n                    }\n                    break;\n                case \"childList\":\n                    for (const addedNode of mutation.addedNodes) {\n                        if (addedNode.nodeType === addedNode.ELEMENT_NODE) {\n                            if (addedNode.childElementCount) {\n                                for (const element of this.getTranslatables(addedNode)) {\n                                    this.pendingElements.add(element);\n                                }\n                            }\n                            else if (addedNode.hasAttribute(L10NID_ATTR_NAME)) {\n                                this.pendingElements.add(addedNode);\n                            }\n                        }\n                    }\n                    break;\n            }\n        }\n        // This fragment allows us to coalesce all pending translations\n        // into a single requestAnimationFrame.\n        if (this.pendingElements.size > 0) {\n            if (this.pendingrAF === null) {\n                this.pendingrAF = this.windowElement.requestAnimationFrame(() => {\n                    this.translateElements(Array.from(this.pendingElements));\n                    this.pendingElements.clear();\n                    this.pendingrAF = null;\n                });\n            }\n        }\n    }\n    /**\n     * Translate a DOM element or fragment asynchronously using this\n     * `DOMLocalization` object.\n     *\n     * Manually trigger the translation (or re-translation) of a DOM fragment.\n     * Use the `data-l10n-id` and `data-l10n-args` attributes to mark up the DOM\n     * with information about which translations to use.\n     *\n     * Returns a `Promise` that gets resolved once the translation is complete.\n     *\n     * @param   {DOMFragment} frag - Element or DocumentFragment to be translated\n     * @returns {Promise}\n     */\n    translateFragment(frag) {\n        return this.translateElements(this.getTranslatables(frag));\n    }\n    /**\n     * Translate a list of DOM elements asynchronously using this\n     * `DOMLocalization` object.\n     *\n     * Manually trigger the translation (or re-translation) of a list of elements.\n     * Use the `data-l10n-id` and `data-l10n-args` attributes to mark up the DOM\n     * with information about which translations to use.\n     *\n     * Returns a `Promise` that gets resolved once the translation is complete.\n     *\n     * @param   {Array<Element>} elements - List of elements to be translated\n     * @returns {Promise}\n     */\n    async translateElements(elements) {\n        if (!elements.length) {\n            return undefined;\n        }\n        const keys = elements.map(this.getKeysForElement);\n        const translations = await this.formatMessages(keys);\n        return this.applyTranslations(elements, translations);\n    }\n    /**\n     * Applies translations onto elements.\n     *\n     * @param {Array<Element>} elements\n     * @param {Array<Object>}  translations\n     * @private\n     */\n    applyTranslations(elements, translations) {\n        this.pauseObserving();\n        for (let i = 0; i < elements.length; i++) {\n            if (translations[i] !== undefined) {\n                translateElement(elements[i], translations[i]);\n            }\n        }\n        this.resumeObserving();\n    }\n    /**\n     * Collects all translatable child elements of the element.\n     *\n     * @param {Element} element\n     * @returns {Array<Element>}\n     * @private\n     */\n    getTranslatables(element) {\n        const nodes = Array.from(element.querySelectorAll(L10N_ELEMENT_QUERY));\n        if (typeof element.hasAttribute === \"function\" &&\n            element.hasAttribute(L10NID_ATTR_NAME)) {\n            nodes.push(element);\n        }\n        return nodes;\n    }\n    /**\n     * Get the `data-l10n-*` attributes from DOM elements as a two-element\n     * array.\n     *\n     * @param {Element} element\n     * @returns {Object}\n     * @private\n     */\n    getKeysForElement(element) {\n        return {\n            id: element.getAttribute(L10NID_ATTR_NAME),\n            args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),\n        };\n    }\n}\n","export { default as DOMLocalization } from \"./dom_localization.js\";\nexport { default as Localization } from \"./localization.js\";\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n\n/**\n * NOTE: The L10n-implementations should use lowercase language-codes\n *       internally.\n * @implements {IL10n}\n */\nclass L10n {\n  #dir;\n\n  #elements;\n\n  #lang;\n\n  #l10n;\n\n  constructor({ lang, isRTL }, l10n = null) {\n    this.#lang = L10n.#fixupLangCode(lang);\n    this.#l10n = l10n;\n    this.#dir = (isRTL ?? L10n.#isRTL(this.#lang)) ? \"rtl\" : \"ltr\";\n  }\n\n  _setL10n(l10n) {\n    this.#l10n = l10n;\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      document.l10n = l10n;\n    }\n  }\n\n  /** @inheritdoc */\n  getLanguage() {\n    return this.#lang;\n  }\n\n  /** @inheritdoc */\n  getDirection() {\n    return this.#dir;\n  }\n\n  /** @inheritdoc */\n  async get(ids, args = null, fallback) {\n    if (Array.isArray(ids)) {\n      ids = ids.map(id => ({ id }));\n      const messages = await this.#l10n.formatMessages(ids);\n      return messages.map(message => message.value);\n    }\n\n    const messages = await this.#l10n.formatMessages([\n      {\n        id: ids,\n        args,\n      },\n    ]);\n    return messages[0]?.value || fallback;\n  }\n\n  /** @inheritdoc */\n  async translate(element) {\n    (this.#elements ||= new Set()).add(element);\n    try {\n      this.#l10n.connectRoot(element);\n      await this.#l10n.translateRoots();\n    } catch {\n      // Element is under an existing root, so there is no need to add it again.\n    }\n  }\n\n  /** @inheritdoc */\n  async translateOnce(element) {\n    try {\n      await this.#l10n.translateElements([element]);\n    } catch (ex) {\n      console.error(\"translateOnce:\", ex);\n    }\n  }\n\n  /** @inheritdoc */\n  async destroy() {\n    if (this.#elements) {\n      for (const element of this.#elements) {\n        this.#l10n.disconnectRoot(element);\n      }\n      this.#elements.clear();\n      this.#elements = null;\n    }\n    this.#l10n.pauseObserving();\n  }\n\n  /** @inheritdoc */\n  pause() {\n    this.#l10n.pauseObserving();\n  }\n\n  /** @inheritdoc */\n  resume() {\n    this.#l10n.resumeObserving();\n  }\n\n  static #fixupLangCode(langCode) {\n    // Use only lowercase language-codes internally, and fallback to English.\n    langCode = langCode?.toLowerCase() || \"en-us\";\n\n    // Try to support \"incompletely\" specified language codes (see issue 13689).\n    const PARTIAL_LANG_CODES = {\n      en: \"en-us\",\n      es: \"es-es\",\n      fy: \"fy-nl\",\n      ga: \"ga-ie\",\n      gu: \"gu-in\",\n      hi: \"hi-in\",\n      hy: \"hy-am\",\n      nb: \"nb-no\",\n      ne: \"ne-np\",\n      nn: \"nn-no\",\n      pa: \"pa-in\",\n      pt: \"pt-pt\",\n      sv: \"sv-se\",\n      zh: \"zh-cn\",\n    };\n    return PARTIAL_LANG_CODES[langCode] || langCode;\n  }\n\n  static #isRTL(lang) {\n    const shortCode = lang.split(\"-\", 1)[0];\n    return [\"ar\", \"he\", \"fa\", \"ps\", \"ur\"].includes(shortCode);\n  }\n}\n\nconst GenericL10n = null;\n\nexport { GenericL10n, L10n };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n\nimport { FluentBundle, FluentResource } from \"fluent-bundle\";\nimport { DOMLocalization } from \"fluent-dom\";\nimport { fetchData } from \"pdfjs-lib\";\nimport { L10n } from \"./l10n.js\";\n\nfunction createBundle(lang, text) {\n  const resource = new FluentResource(text);\n  const bundle = new FluentBundle(lang);\n  const errors = bundle.addResource(resource);\n  if (errors.length) {\n    console.error(\"L10n errors\", errors);\n  }\n  return bundle;\n}\n\n/**\n * @implements {IL10n}\n */\nclass GenericL10n extends L10n {\n  constructor(lang) {\n    super({ lang });\n\n    const generateBundles = !lang\n      ? GenericL10n.#generateBundlesFallback.bind(\n          GenericL10n,\n          this.getLanguage()\n        )\n      : GenericL10n.#generateBundles.bind(\n          GenericL10n,\n          \"en-us\",\n          this.getLanguage()\n        );\n    this._setL10n(new DOMLocalization([], generateBundles));\n  }\n\n  /**\n   * Generate the bundles for Fluent.\n   * @param {String} defaultLang - The fallback language to use for\n   *   translations.\n   * @param {String} baseLang - The base language to use for translations.\n   */\n  static async *#generateBundles(defaultLang, baseLang) {\n    const { baseURL, paths } = await this.#getPaths();\n\n    const langs = [baseLang];\n    if (defaultLang !== baseLang) {\n      // Also fallback to the short-format of the base language\n      // (see issue 17269).\n      const shortLang = baseLang.split(\"-\", 1)[0];\n\n      if (shortLang !== baseLang) {\n        langs.push(shortLang);\n      }\n      langs.push(defaultLang);\n    }\n    for (const lang of langs) {\n      const bundle = await this.#createBundle(lang, baseURL, paths);\n      if (bundle) {\n        yield bundle;\n      } else if (lang === \"en-us\") {\n        yield this.#createBundleFallback(lang);\n      }\n    }\n  }\n\n  static async #createBundle(lang, baseURL, paths) {\n    const path = paths[lang];\n    if (!path) {\n      return null;\n    }\n    const url = new URL(path, baseURL);\n    const text = await fetchData(url, /* type = */ \"text\");\n\n    return createBundle(lang, text);\n  }\n\n  static async #getPaths() {\n    try {\n      const { href } = document.querySelector(`link[type=\"application/l10n\"]`);\n      const paths = await fetchData(href, /* type = */ \"json\");\n\n      return { baseURL: href.replace(/[^/]*$/, \"\") || \"./\", paths };\n    } catch {}\n    return { baseURL: \"./\", paths: Object.create(null) };\n  }\n\n  static async *#generateBundlesFallback(lang) {\n    yield this.#createBundleFallback(lang);\n  }\n\n  static async #createBundleFallback(lang) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      throw new Error(\"Not implemented: #createBundleFallback\");\n    }\n    const text =\n      typeof PDFJSDev === \"undefined\"\n        ? await fetchData(\n            new URL(\"../l10n/en-US/viewer.ftl\", window.location.href),\n            /* type = */ \"text\"\n          )\n        : PDFJSDev.eval(\"DEFAULT_FTL\");\n\n    return createBundle(lang, text);\n  }\n}\n\nexport { GenericL10n };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n/** @typedef {import(\"./interfaces\").IPDFLinkService} IPDFLinkService */\n\nimport { isValidRotation, parseQueryString } from \"./ui_utils.js\";\nimport { waitOnEventOrTimeout } from \"./event_utils.js\";\n\n// Heuristic value used when force-resetting `this._blockHashChange`.\nconst HASH_CHANGE_TIMEOUT = 1000; // milliseconds\n// Heuristic value used when adding the current position to the browser history.\nconst POSITION_UPDATED_THRESHOLD = 50;\n// Heuristic value used when adding a temporary position to the browser history.\nconst UPDATE_VIEWAREA_TIMEOUT = 1000; // milliseconds\n\n/**\n * @typedef {Object} PDFHistoryOptions\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * @typedef {Object} InitializeParameters\n * @property {string} fingerprint - The PDF document's unique fingerprint.\n * @property {boolean} [resetHistory] - Reset the browsing history.\n * @property {boolean} [updateUrl] - Attempt to update the document URL, with\n *   the current hash, when pushing/replacing browser history entries.\n */\n\n/**\n * @typedef {Object} PushParameters\n * @property {string} [namedDest] - The named destination. If absent, a\n *   stringified version of `explicitDest` is used.\n * @property {Array} explicitDest - The explicit destination array.\n * @property {number} pageNumber - The page to which the destination points.\n */\n\nfunction getCurrentHash() {\n  return document.location.hash;\n}\n\nclass PDFHistory {\n  #eventAbortController = null;\n\n  /**\n   * @param {PDFHistoryOptions} options\n   */\n  constructor({ linkService, eventBus }) {\n    this.linkService = linkService;\n    this.eventBus = eventBus;\n\n    this._initialized = false;\n    this._fingerprint = \"\";\n    this.reset();\n\n    // Ensure that we don't miss a \"pagesinit\" event,\n    // by registering the listener immediately.\n    this.eventBus._on(\"pagesinit\", () => {\n      this._isPagesLoaded = false;\n\n      this.eventBus._on(\n        \"pagesloaded\",\n        evt => {\n          this._isPagesLoaded = !!evt.pagesCount;\n        },\n        { once: true }\n      );\n    });\n  }\n\n  /**\n   * Initialize the history for the PDF document, using either the current\n   * browser history entry or the document hash, whichever is present.\n   * @param {InitializeParameters} params\n   */\n  initialize({ fingerprint, resetHistory = false, updateUrl = false }) {\n    if (!fingerprint || typeof fingerprint !== \"string\") {\n      console.error(\n        'PDFHistory.initialize: The \"fingerprint\" must be a non-empty string.'\n      );\n      return;\n    }\n    // Ensure that any old state is always reset upon initialization.\n    if (this._initialized) {\n      this.reset();\n    }\n    const reInitialized =\n      this._fingerprint !== \"\" && this._fingerprint !== fingerprint;\n    this._fingerprint = fingerprint;\n    this._updateUrl = updateUrl === true;\n\n    this._initialized = true;\n    this.#bindEvents();\n    const state = window.history.state;\n\n    this._popStateInProgress = false;\n    this._blockHashChange = 0;\n    this._currentHash = getCurrentHash();\n    this._numPositionUpdates = 0;\n\n    this._uid = this._maxUid = 0;\n    this._destination = null;\n    this._position = null;\n\n    if (!this.#isValidState(state, /* checkReload = */ true) || resetHistory) {\n      const { hash, page, rotation } = this.#parseCurrentHash(\n        /* checkNameddest = */ true\n      );\n\n      if (!hash || reInitialized || resetHistory) {\n        // Ensure that the browser history is reset on PDF document load.\n        this.#pushOrReplaceState(null, /* forceReplace = */ true);\n        return;\n      }\n      // Ensure that the browser history is initialized correctly when\n      // the document hash is present on PDF document load.\n      this.#pushOrReplaceState(\n        { hash, page, rotation },\n        /* forceReplace = */ true\n      );\n      return;\n    }\n\n    // The browser history contains a valid entry, ensure that the history is\n    // initialized correctly on PDF document load.\n    const destination = state.destination;\n    this.#updateInternalState(\n      destination,\n      state.uid,\n      /* removeTemporary = */ true\n    );\n\n    if (destination.rotation !== undefined) {\n      this._initialRotation = destination.rotation;\n    }\n    if (destination.dest) {\n      this._initialBookmark = JSON.stringify(destination.dest);\n\n      // If the history is updated, e.g. through the user changing the hash,\n      // before the initial destination has become visible, then we do *not*\n      // want to potentially add `this._position` to the browser history.\n      this._destination.page = null;\n    } else if (destination.hash) {\n      this._initialBookmark = destination.hash;\n    } else if (destination.page) {\n      // Fallback case; shouldn't be necessary, but better safe than sorry.\n      this._initialBookmark = `page=${destination.page}`;\n    }\n  }\n\n  /**\n   * Reset the current `PDFHistory` instance, and consequently prevent any\n   * further updates and/or navigation of the browser history.\n   */\n  reset() {\n    if (this._initialized) {\n      this.#pageHide(); // Simulate a 'pagehide' event when resetting.\n\n      this._initialized = false;\n      this.#unbindEvents();\n    }\n    if (this._updateViewareaTimeout) {\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n    this._initialBookmark = null;\n    this._initialRotation = null;\n  }\n\n  /**\n   * Push an internal destination to the browser history.\n   * @param {PushParameters}\n   */\n  push({ namedDest = null, explicitDest, pageNumber }) {\n    if (!this._initialized) {\n      return;\n    }\n    if (namedDest && typeof namedDest !== \"string\") {\n      console.error(\n        \"PDFHistory.push: \" +\n          `\"${namedDest}\" is not a valid namedDest parameter.`\n      );\n      return;\n    } else if (!Array.isArray(explicitDest)) {\n      console.error(\n        \"PDFHistory.push: \" +\n          `\"${explicitDest}\" is not a valid explicitDest parameter.`\n      );\n      return;\n    } else if (!this.#isValidPage(pageNumber)) {\n      // Allow an unset `pageNumber` if and only if the history is still empty;\n      // please refer to the `this._destination.page = null;` comment above.\n      if (pageNumber !== null || this._destination) {\n        console.error(\n          \"PDFHistory.push: \" +\n            `\"${pageNumber}\" is not a valid pageNumber parameter.`\n        );\n        return;\n      }\n    }\n\n    const hash = namedDest || JSON.stringify(explicitDest);\n    if (!hash) {\n      // The hash *should* never be undefined, but if that were to occur,\n      // avoid any possible issues by not updating the browser history.\n      return;\n    }\n\n    let forceReplace = false;\n    if (\n      this._destination &&\n      (isDestHashesEqual(this._destination.hash, hash) ||\n        isDestArraysEqual(this._destination.dest, explicitDest))\n    ) {\n      // When the new destination is identical to `this._destination`, and\n      // its `page` is undefined, replace the current browser history entry.\n      // NOTE: This can only occur if `this._destination` was set either:\n      //  - through the document hash being specified on load.\n      //  - through the user changing the hash of the document.\n      if (this._destination.page) {\n        return;\n      }\n      forceReplace = true;\n    }\n    if (this._popStateInProgress && !forceReplace) {\n      return;\n    }\n\n    this.#pushOrReplaceState(\n      {\n        dest: explicitDest,\n        hash,\n        page: pageNumber,\n        rotation: this.linkService.rotation,\n      },\n      forceReplace\n    );\n\n    if (!this._popStateInProgress) {\n      // Prevent the browser history from updating while the new destination is\n      // being scrolled into view, to avoid potentially inconsistent state.\n      this._popStateInProgress = true;\n      // We defer the resetting of `this._popStateInProgress`, to account for\n      // e.g. zooming occurring when the new destination is being navigated to.\n      Promise.resolve().then(() => {\n        this._popStateInProgress = false;\n      });\n    }\n  }\n\n  /**\n   * Push a page to the browser history; generally the `push` method should be\n   * used instead.\n   * @param {number} pageNumber\n   */\n  pushPage(pageNumber) {\n    if (!this._initialized) {\n      return;\n    }\n    if (!this.#isValidPage(pageNumber)) {\n      console.error(\n        `PDFHistory.pushPage: \"${pageNumber}\" is not a valid page number.`\n      );\n      return;\n    }\n\n    if (this._destination?.page === pageNumber) {\n      // When the new page is identical to the one in `this._destination`, we\n      // don't want to add a potential duplicate entry in the browser history.\n      return;\n    }\n    if (this._popStateInProgress) {\n      return;\n    }\n\n    this.#pushOrReplaceState({\n      // Simulate an internal destination, for `this.#tryPushCurrentPosition`:\n      dest: null,\n      hash: `page=${pageNumber}`,\n      page: pageNumber,\n      rotation: this.linkService.rotation,\n    });\n\n    if (!this._popStateInProgress) {\n      // Prevent the browser history from updating while the new page is\n      // being scrolled into view, to avoid potentially inconsistent state.\n      this._popStateInProgress = true;\n      // We defer the resetting of `this._popStateInProgress`, to account for\n      // e.g. zooming occurring when the new page is being navigated to.\n      Promise.resolve().then(() => {\n        this._popStateInProgress = false;\n      });\n    }\n  }\n\n  /**\n   * Push the current position to the browser history.\n   */\n  pushCurrentPosition() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n    this.#tryPushCurrentPosition();\n  }\n\n  /**\n   * Go back one step in the browser history.\n   * NOTE: Avoids navigating away from the document, useful for \"named actions\".\n   */\n  back() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n    const state = window.history.state;\n    if (this.#isValidState(state) && state.uid > 0) {\n      window.history.back();\n    }\n  }\n\n  /**\n   * Go forward one step in the browser history.\n   * NOTE: Avoids navigating away from the document, useful for \"named actions\".\n   */\n  forward() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n    const state = window.history.state;\n    if (this.#isValidState(state) && state.uid < this._maxUid) {\n      window.history.forward();\n    }\n  }\n\n  /**\n   * @type {boolean} Indicating if the user is currently moving through the\n   *   browser history, useful e.g. for skipping the next 'hashchange' event.\n   */\n  get popStateInProgress() {\n    return (\n      this._initialized &&\n      (this._popStateInProgress || this._blockHashChange > 0)\n    );\n  }\n\n  get initialBookmark() {\n    return this._initialized ? this._initialBookmark : null;\n  }\n\n  get initialRotation() {\n    return this._initialized ? this._initialRotation : null;\n  }\n\n  #pushOrReplaceState(destination, forceReplace = false) {\n    const shouldReplace = forceReplace || !this._destination;\n    const newState = {\n      fingerprint: this._fingerprint,\n      uid: shouldReplace ? this._uid : this._uid + 1,\n      destination,\n    };\n\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"CHROME\") &&\n      window.history.state?.chromecomState\n    ) {\n      // history.state.chromecomState is managed by chromecom.js.\n      newState.chromecomState = window.history.state.chromecomState;\n    }\n    this.#updateInternalState(destination, newState.uid);\n\n    let newUrl;\n    if (this._updateUrl && destination?.hash) {\n      const baseUrl = document.location.href.split(\"#\", 1)[0];\n      // Prevent errors in Firefox.\n      if (!baseUrl.startsWith(\"file://\")) {\n        newUrl = `${baseUrl}#${destination.hash}`;\n      }\n    }\n    if (shouldReplace) {\n      window.history.replaceState(newState, \"\", newUrl);\n    } else {\n      window.history.pushState(newState, \"\", newUrl);\n    }\n  }\n\n  #tryPushCurrentPosition(temporary = false) {\n    if (!this._position) {\n      return;\n    }\n    let position = this._position;\n    if (temporary) {\n      position = Object.assign(Object.create(null), this._position);\n      position.temporary = true;\n    }\n\n    if (!this._destination) {\n      this.#pushOrReplaceState(position);\n      return;\n    }\n    if (this._destination.temporary) {\n      // Always replace a previous *temporary* position.\n      this.#pushOrReplaceState(position, /* forceReplace = */ true);\n      return;\n    }\n    if (this._destination.hash === position.hash) {\n      return; // The current document position has not changed.\n    }\n    if (\n      !this._destination.page &&\n      (POSITION_UPDATED_THRESHOLD <= 0 ||\n        this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)\n    ) {\n      // `this._destination` was set through the user changing the hash of\n      // the document. Do not add `this._position` to the browser history,\n      // to avoid \"flooding\" it with lots of (nearly) identical entries,\n      // since we cannot ensure that the document position has changed.\n      return;\n    }\n\n    let forceReplace = false;\n    if (\n      this._destination.page >= position.first &&\n      this._destination.page <= position.page\n    ) {\n      // When the `page` of `this._destination` is still visible, do not\n      // update the browsing history when `this._destination` either:\n      //  - contains an internal destination, since in this case we\n      //    cannot ensure that the document position has actually changed.\n      //  - was set through the user changing the hash of the document.\n      if (this._destination.dest !== undefined || !this._destination.first) {\n        return;\n      }\n      // To avoid \"flooding\" the browser history, replace the current entry.\n      forceReplace = true;\n    }\n    this.#pushOrReplaceState(position, forceReplace);\n  }\n\n  #isValidPage(val) {\n    return (\n      Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount\n    );\n  }\n\n  #isValidState(state, checkReload = false) {\n    if (!state) {\n      return false;\n    }\n    if (state.fingerprint !== this._fingerprint) {\n      if (checkReload) {\n        // Potentially accept the history entry, even if the fingerprints don't\n        // match, when the viewer was reloaded (see issue 6847).\n        if (\n          typeof state.fingerprint !== \"string\" ||\n          state.fingerprint.length !== this._fingerprint.length\n        ) {\n          return false;\n        }\n        const [perfEntry] = performance.getEntriesByType(\"navigation\");\n        if (perfEntry?.type !== \"reload\") {\n          return false;\n        }\n      } else {\n        // This should only occur in viewers with support for opening more than\n        // one PDF document, e.g. the GENERIC viewer.\n        return false;\n      }\n    }\n    if (!Number.isInteger(state.uid) || state.uid < 0) {\n      return false;\n    }\n    if (state.destination === null || typeof state.destination !== \"object\") {\n      return false;\n    }\n    return true;\n  }\n\n  #updateInternalState(destination, uid, removeTemporary = false) {\n    if (this._updateViewareaTimeout) {\n      // When updating `this._destination`, make sure that we always wait for\n      // the next 'updateviewarea' event before (potentially) attempting to\n      // push the current position to the browser history.\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n    if (removeTemporary && destination?.temporary) {\n      // When the `destination` comes from the browser history,\n      // we no longer treat it as a *temporary* position.\n      delete destination.temporary;\n    }\n    this._destination = destination;\n    this._uid = uid;\n    this._maxUid = Math.max(this._maxUid, uid);\n    // This should always be reset when `this._destination` is updated.\n    this._numPositionUpdates = 0;\n  }\n\n  #parseCurrentHash(checkNameddest = false) {\n    const hash = unescape(getCurrentHash()).substring(1);\n    const params = parseQueryString(hash);\n\n    const nameddest = params.get(\"nameddest\") || \"\";\n    let page = params.get(\"page\") | 0;\n\n    if (!this.#isValidPage(page) || (checkNameddest && nameddest.length > 0)) {\n      page = null;\n    }\n    return { hash, page, rotation: this.linkService.rotation };\n  }\n\n  #updateViewarea({ location }) {\n    if (this._updateViewareaTimeout) {\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n\n    this._position = {\n      hash: location.pdfOpenParams.substring(1),\n      page: this.linkService.page,\n      first: location.pageNumber,\n      rotation: location.rotation,\n    };\n\n    if (this._popStateInProgress) {\n      return;\n    }\n\n    if (\n      POSITION_UPDATED_THRESHOLD > 0 &&\n      this._isPagesLoaded &&\n      this._destination &&\n      !this._destination.page\n    ) {\n      // If the current destination was set through the user changing the hash\n      // of the document, we will usually not try to push the current position\n      // to the browser history; see `this.#tryPushCurrentPosition()`.\n      //\n      // To prevent `this.#tryPushCurrentPosition()` from effectively being\n      // reduced to a no-op in this case, we will assume that the position\n      // *did* in fact change if the 'updateviewarea' event was dispatched\n      // more than `POSITION_UPDATED_THRESHOLD` times.\n      this._numPositionUpdates++;\n    }\n\n    if (UPDATE_VIEWAREA_TIMEOUT > 0) {\n      // When closing the browser, a 'pagehide' event will be dispatched which\n      // *should* allow us to push the current position to the browser history.\n      // In practice, it seems that the event is arriving too late in order for\n      // the session history to be successfully updated.\n      // (For additional details, please refer to the discussion in\n      //  https://bugzilla.mozilla.org/show_bug.cgi?id=1153393.)\n      //\n      // To workaround this we attempt to *temporarily* add the current position\n      // to the browser history only when the viewer is *idle*,\n      // i.e. when scrolling and/or zooming does not occur.\n      //\n      // PLEASE NOTE: It's absolutely imperative that the browser history is\n      // *not* updated too often, since that would render the viewer more or\n      // less unusable. Hence the use of a timeout to delay the update until\n      // the viewer has been idle for `UPDATE_VIEWAREA_TIMEOUT` milliseconds.\n      this._updateViewareaTimeout = setTimeout(() => {\n        if (!this._popStateInProgress) {\n          this.#tryPushCurrentPosition(/* temporary = */ true);\n        }\n        this._updateViewareaTimeout = null;\n      }, UPDATE_VIEWAREA_TIMEOUT);\n    }\n  }\n\n  #popState({ state }) {\n    const newHash = getCurrentHash(),\n      hashChanged = this._currentHash !== newHash;\n    this._currentHash = newHash;\n\n    if (\n      (typeof PDFJSDev !== \"undefined\" &&\n        PDFJSDev.test(\"CHROME\") &&\n        state?.chromecomState &&\n        !this.#isValidState(state)) ||\n      !state\n    ) {\n      // This case corresponds to the user changing the hash of the document.\n      this._uid++;\n\n      const { hash, page, rotation } = this.#parseCurrentHash();\n      this.#pushOrReplaceState(\n        { hash, page, rotation },\n        /* forceReplace = */ true\n      );\n      return;\n    }\n    if (!this.#isValidState(state)) {\n      // This should only occur in viewers with support for opening more than\n      // one PDF document, e.g. the GENERIC viewer.\n      return;\n    }\n\n    // Prevent the browser history from updating until the new destination,\n    // as stored in the browser history, has been scrolled into view.\n    this._popStateInProgress = true;\n\n    if (hashChanged) {\n      // When the hash changed, implying that the 'popstate' event will be\n      // followed by a 'hashchange' event, then we do *not* want to update the\n      // browser history when handling the 'hashchange' event (in web/app.js)\n      // since that would *overwrite* the new destination navigated to below.\n      //\n      // To avoid accidentally disabling all future user-initiated hash changes,\n      // if there's e.g. another 'hashchange' listener that stops the event\n      // propagation, we make sure to always force-reset `this._blockHashChange`\n      // after `HASH_CHANGE_TIMEOUT` milliseconds have passed.\n      this._blockHashChange++;\n      waitOnEventOrTimeout({\n        target: window,\n        name: \"hashchange\",\n        delay: HASH_CHANGE_TIMEOUT,\n      }).then(() => {\n        this._blockHashChange--;\n      });\n    }\n\n    // Navigate to the new destination.\n    const destination = state.destination;\n    this.#updateInternalState(\n      destination,\n      state.uid,\n      /* removeTemporary = */ true\n    );\n\n    if (isValidRotation(destination.rotation)) {\n      this.linkService.rotation = destination.rotation;\n    }\n    if (destination.dest) {\n      this.linkService.goToDestination(destination.dest);\n    } else if (destination.hash) {\n      this.linkService.setHash(destination.hash);\n    } else if (destination.page) {\n      // Fallback case; shouldn't be necessary, but better safe than sorry.\n      this.linkService.page = destination.page;\n    }\n\n    // Since `PDFLinkService.goToDestination` is asynchronous, we thus defer the\n    // resetting of `this._popStateInProgress` slightly.\n    Promise.resolve().then(() => {\n      this._popStateInProgress = false;\n    });\n  }\n\n  #pageHide() {\n    // Attempt to push the `this._position` into the browser history when\n    // navigating away from the document. This is *only* done if the history\n    // is empty/temporary, since otherwise an existing browser history entry\n    // will end up being overwritten (given that new entries cannot be pushed\n    // into the browser history when the 'unload' event has already fired).\n    if (!this._destination || this._destination.temporary) {\n      this.#tryPushCurrentPosition();\n    }\n  }\n\n  #bindEvents() {\n    if (this.#eventAbortController) {\n      return; // The event listeners were already added.\n    }\n    this.#eventAbortController = new AbortController();\n    const { signal } = this.#eventAbortController;\n\n    this.eventBus._on(\"updateviewarea\", this.#updateViewarea.bind(this), {\n      signal,\n    });\n    window.addEventListener(\"popstate\", this.#popState.bind(this), { signal });\n    window.addEventListener(\"pagehide\", this.#pageHide.bind(this), { signal });\n  }\n\n  #unbindEvents() {\n    this.#eventAbortController?.abort();\n    this.#eventAbortController = null;\n  }\n}\n\nfunction isDestHashesEqual(destHash, pushHash) {\n  if (typeof destHash !== \"string\" || typeof pushHash !== \"string\") {\n    return false;\n  }\n  if (destHash === pushHash) {\n    return true;\n  }\n  const nameddest = parseQueryString(destHash).get(\"nameddest\");\n  if (nameddest === pushHash) {\n    return true;\n  }\n  return false;\n}\n\nfunction isDestArraysEqual(firstDest, secondDest) {\n  function isEntryEqual(first, second) {\n    if (typeof first !== typeof second) {\n      return false;\n    }\n    if (Array.isArray(first) || Array.isArray(second)) {\n      return false;\n    }\n    if (first !== null && typeof first === \"object\" && second !== null) {\n      if (Object.keys(first).length !== Object.keys(second).length) {\n        return false;\n      }\n      for (const key in first) {\n        if (!isEntryEqual(first[key], second[key])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    return first === second || (Number.isNaN(first) && Number.isNaN(second));\n  }\n\n  if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {\n    return false;\n  }\n  if (firstDest.length !== secondDest.length) {\n    return false;\n  }\n  for (let i = 0, ii = firstDest.length; i < ii; i++) {\n    if (!isEntryEqual(firstDest[i], secondDest[i])) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport { isDestArraysEqual, isDestHashesEqual, PDFHistory };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/display_utils\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/editor/tools.js\").AnnotationEditorUIManager} AnnotationEditorUIManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./text_accessibility.js\").TextAccessibilityManager} TextAccessibilityManager */\n/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/annotation_layer.js\").AnnotationLayer} AnnotationLayer */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/struct_tree_layer_builder.js\").StructTreeLayerBuilder} StructTreeLayerBuilder */\n\nimport { AnnotationEditorLayer } from \"pdfjs-lib\";\nimport { GenericL10n } from \"web-null_l10n\";\n\n/**\n * @typedef {Object} AnnotationEditorLayerBuilderOptions\n * @property {AnnotationEditorUIManager} [uiManager]\n * @property {PDFPageProxy} pdfPage\n * @property {IL10n} [l10n]\n * @property {StructTreeLayerBuilder} [structTreeLayer]\n * @property {TextAccessibilityManager} [accessibilityManager]\n * @property {AnnotationLayer} [annotationLayer]\n * @property {TextLayer} [textLayer]\n * @property {DrawLayer} [drawLayer]\n * @property {function} [onAppend]\n */\n\nclass AnnotationEditorLayerBuilder {\n  #annotationLayer = null;\n\n  #drawLayer = null;\n\n  #onAppend = null;\n\n  #structTreeLayer = null;\n\n  #textLayer = null;\n\n  #uiManager;\n\n  /**\n   * @param {AnnotationEditorLayerBuilderOptions} options\n   */\n  constructor(options) {\n    this.pdfPage = options.pdfPage;\n    this.accessibilityManager = options.accessibilityManager;\n    this.l10n = options.l10n;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this.l10n ||= new GenericL10n();\n    }\n    this.annotationEditorLayer = null;\n    this.div = null;\n    this._cancelled = false;\n    this.#uiManager = options.uiManager;\n    this.#annotationLayer = options.annotationLayer || null;\n    this.#textLayer = options.textLayer || null;\n    this.#drawLayer = options.drawLayer || null;\n    this.#onAppend = options.onAppend || null;\n    this.#structTreeLayer = options.structTreeLayer || null;\n  }\n\n  /**\n   * @param {PageViewport} viewport\n   * @param {string} intent (default value is 'display')\n   */\n  async render(viewport, intent = \"display\") {\n    if (intent !== \"display\") {\n      return;\n    }\n\n    if (this._cancelled) {\n      return;\n    }\n\n    const clonedViewport = viewport.clone({ dontFlip: true });\n    if (this.div) {\n      this.annotationEditorLayer.update({ viewport: clonedViewport });\n      this.show();\n      return;\n    }\n\n    // Create an AnnotationEditor layer div\n    const div = (this.div = document.createElement(\"div\"));\n    div.className = \"annotationEditorLayer\";\n    div.hidden = true;\n    div.dir = this.#uiManager.direction;\n    this.#onAppend?.(div);\n\n    this.annotationEditorLayer = new AnnotationEditorLayer({\n      uiManager: this.#uiManager,\n      div,\n      structTreeLayer: this.#structTreeLayer,\n      accessibilityManager: this.accessibilityManager,\n      pageIndex: this.pdfPage.pageNumber - 1,\n      l10n: this.l10n,\n      viewport: clonedViewport,\n      annotationLayer: this.#annotationLayer,\n      textLayer: this.#textLayer,\n      drawLayer: this.#drawLayer,\n    });\n\n    const parameters = {\n      viewport: clonedViewport,\n      div,\n      annotations: null,\n      intent,\n    };\n\n    this.annotationEditorLayer.render(parameters);\n    this.show();\n  }\n\n  cancel() {\n    this._cancelled = true;\n\n    if (!this.div) {\n      return;\n    }\n    this.annotationEditorLayer.destroy();\n  }\n\n  hide() {\n    if (!this.div) {\n      return;\n    }\n    this.annotationEditorLayer.pause(/* on */ true);\n    this.div.hidden = true;\n  }\n\n  show() {\n    if (!this.div || this.annotationEditorLayer.isInvisible) {\n      return;\n    }\n    this.div.hidden = false;\n    this.annotationEditorLayer.pause(/* on */ false);\n  }\n}\n\nexport { AnnotationEditorLayerBuilder };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n  // eslint-disable-next-line no-var\n  var compatParams = new Map();\n  if (\n    typeof PDFJSDev !== \"undefined\" &&\n    PDFJSDev.test(\"LIB\") &&\n    typeof navigator === \"undefined\"\n  ) {\n    globalThis.navigator = Object.create(null);\n  }\n  const userAgent = navigator.userAgent || \"\";\n  const platform = navigator.platform || \"\";\n  const maxTouchPoints = navigator.maxTouchPoints || 1;\n\n  const isAndroid = /Android/.test(userAgent);\n  const isIOS =\n    /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) ||\n    (platform === \"MacIntel\" && maxTouchPoints > 1);\n\n  // Limit canvas size to 5 mega-pixels on mobile.\n  // Support: Android, iOS\n  (function () {\n    if (isIOS || isAndroid) {\n      compatParams.set(\"maxCanvasPixels\", 5242880);\n    }\n  })();\n\n  // Don't use system fonts on Android (issue 18210).\n  // Support: Android\n  (function () {\n    if (isAndroid) {\n      compatParams.set(\"useSystemFonts\", false);\n    }\n  })();\n}\n\nconst OptionKind = {\n  BROWSER: 0x01,\n  VIEWER: 0x02,\n  API: 0x04,\n  WORKER: 0x08,\n  EVENT_DISPATCH: 0x10,\n  PREFERENCE: 0x80,\n};\n\n// Should only be used with options that allow multiple types.\nconst Type = {\n  BOOLEAN: 0x01,\n  NUMBER: 0x02,\n  OBJECT: 0x04,\n  STRING: 0x08,\n  UNDEFINED: 0x10,\n};\n\n/**\n * NOTE: These options are used to generate the `default_preferences.json` file,\n *       see `OptionKind.PREFERENCE`, hence the values below must use only\n *       primitive types and cannot rely on any imported types.\n */\nconst defaultOptions = {\n  allowedGlobalEvents: {\n    /** @type {Object} */\n    value: null,\n    kind: OptionKind.BROWSER,\n  },\n  canvasMaxAreaInBytes: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.BROWSER + OptionKind.API,\n  },\n  isInAutomation: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.BROWSER,\n  },\n  localeProperties: {\n    /** @type {Object} */\n    value:\n      typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")\n        ? { lang: navigator.language || \"en-US\" }\n        : null,\n    kind: OptionKind.BROWSER,\n  },\n  nimbusDataStr: {\n    /** @type {string} */\n    value: \"\",\n    kind: OptionKind.BROWSER,\n  },\n  supportsCaretBrowsingMode: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.BROWSER,\n  },\n  supportsDocumentFonts: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.BROWSER,\n  },\n  supportsIntegratedFind: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.BROWSER,\n  },\n  supportsMouseWheelZoomCtrlKey: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.BROWSER,\n  },\n  supportsMouseWheelZoomMetaKey: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.BROWSER,\n  },\n  supportsPinchToZoom: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.BROWSER,\n  },\n  toolbarDensity: {\n    /** @type {number} */\n    value: 0, // 0 = \"normal\", 1 = \"compact\", 2 = \"touch\"\n    kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH,\n  },\n\n  altTextLearnMoreUrl: {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n        ? \"https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/pdf-alt-text\"\n        : \"\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  annotationEditorMode: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  annotationMode: {\n    /** @type {number} */\n    value: 2,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  cursorToolOnLoad: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  debuggerSrc: {\n    /** @type {string} */\n    value: \"./debugger.mjs\",\n    kind: OptionKind.VIEWER,\n  },\n  defaultZoomDelay: {\n    /** @type {number} */\n    value: 400,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  defaultZoomValue: {\n    /** @type {string} */\n    value: \"\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  disableHistory: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n  disablePageLabels: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableAltText: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableAltTextModelDownload: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH,\n  },\n  enableGuessAltText: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH,\n  },\n  enableHighlightFloatingButton: {\n    // We'll probably want to make some experiments before enabling this\n    // in Firefox release, but it has to be temporary.\n    // TODO: remove it when unnecessary.\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableNewAltTextWhenAddingImage: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enablePermissions: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enablePrintAutoRotate: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableScripting: {\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\"),\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableUpdatedAddImage: {\n    // We'll probably want to make some experiments before enabling this\n    // in Firefox release, but it has to be temporary.\n    // TODO: remove it when unnecessary.\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  externalLinkRel: {\n    /** @type {string} */\n    value: \"noopener noreferrer nofollow\",\n    kind: OptionKind.VIEWER,\n  },\n  externalLinkTarget: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  highlightEditorColors: {\n    /** @type {string} */\n    value: \"yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  historyUpdateUrl: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  ignoreDestinationZoom: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  imageResourcesPath: {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n        ? \"resource://pdf.js/web/images/\"\n        : \"./images/\",\n    kind: OptionKind.VIEWER,\n  },\n  maxCanvasPixels: {\n    /** @type {number} */\n    value: 2 ** 25,\n    kind: OptionKind.VIEWER,\n  },\n  forcePageColors: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  pageColorsBackground: {\n    /** @type {string} */\n    value: \"Canvas\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  pageColorsForeground: {\n    /** @type {string} */\n    value: \"CanvasText\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  pdfBugEnabled: {\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  printResolution: {\n    /** @type {number} */\n    value: 150,\n    kind: OptionKind.VIEWER,\n  },\n  sidebarViewOnLoad: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  scrollModeOnLoad: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  spreadModeOnLoad: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  textLayerMode: {\n    /** @type {number} */\n    value: 1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  viewOnLoad: {\n    /** @type {boolean} */\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n\n  cMapPacked: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API,\n  },\n  cMapUrl: {\n    /** @type {string} */\n    value:\n      // eslint-disable-next-line no-nested-ternary\n      typeof PDFJSDev === \"undefined\"\n        ? \"../external/bcmaps/\"\n        : PDFJSDev.test(\"MOZCENTRAL\")\n          ? \"resource://pdf.js/web/cmaps/\"\n          : \"../web/cmaps/\",\n    kind: OptionKind.API,\n  },\n  disableAutoFetch: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  disableFontFace: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  disableRange: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  disableStream: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  docBaseUrl: {\n    /** @type {string} */\n    value: typeof PDFJSDev === \"undefined\" ? document.URL.split(\"#\", 1)[0] : \"\",\n    kind: OptionKind.API,\n  },\n  enableHWA: {\n    /** @type {boolean} */\n    value: typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"MOZCENTRAL\"),\n    kind: OptionKind.API + OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableXfa: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  fontExtraProperties: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API,\n  },\n  isEvalSupported: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API,\n  },\n  isOffscreenCanvasSupported: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API,\n  },\n  maxImageSize: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.API,\n  },\n  pdfBug: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API,\n  },\n  standardFontDataUrl: {\n    /** @type {string} */\n    value:\n      // eslint-disable-next-line no-nested-ternary\n      typeof PDFJSDev === \"undefined\"\n        ? \"../external/standard_fonts/\"\n        : PDFJSDev.test(\"MOZCENTRAL\")\n          ? \"resource://pdf.js/web/standard_fonts/\"\n          : \"../web/standard_fonts/\",\n    kind: OptionKind.API,\n  },\n  useSystemFonts: {\n    // On Android, there is almost no chance to have the font we want so we\n    // don't use the system fonts in this case (bug 1882613).\n    /** @type {boolean|undefined} */\n    value: (\n      typeof PDFJSDev === \"undefined\"\n        ? window.isGECKOVIEW\n        : PDFJSDev.test(\"GECKOVIEW\")\n    )\n      ? false\n      : undefined,\n    kind: OptionKind.API,\n    type: Type.BOOLEAN + Type.UNDEFINED,\n  },\n  verbosity: {\n    /** @type {number} */\n    value: 1,\n    kind: OptionKind.API,\n  },\n\n  workerPort: {\n    /** @type {Object} */\n    value: null,\n    kind: OptionKind.WORKER,\n  },\n  workerSrc: {\n    /** @type {string} */\n    value:\n      // eslint-disable-next-line no-nested-ternary\n      typeof PDFJSDev === \"undefined\"\n        ? \"../src/pdf.worker.js\"\n        : PDFJSDev.test(\"MOZCENTRAL\")\n          ? \"resource://pdf.js/build/pdf.worker.mjs\"\n          : \"../build/pdf.worker.mjs\",\n    kind: OptionKind.WORKER,\n  },\n};\nif (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n  defaultOptions.defaultUrl = {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")\n        ? \"\"\n        : \"compressed.tracemonkey-pldi-09.pdf\",\n    kind: OptionKind.VIEWER,\n  };\n  defaultOptions.sandboxBundleSrc = {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev === \"undefined\"\n        ? \"../build/dev-sandbox/pdf.sandbox.mjs\"\n        : \"../build/pdf.sandbox.mjs\",\n    kind: OptionKind.VIEWER,\n  };\n  defaultOptions.viewerCssTheme = {\n    /** @type {number} */\n    value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\") ? 2 : 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  };\n  defaultOptions.enableFakeMLManager = {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER,\n  };\n}\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n  defaultOptions.disablePreferences = {\n    /** @type {boolean} */\n    value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\"),\n    kind: OptionKind.VIEWER,\n  };\n} else if (PDFJSDev.test(\"CHROME\")) {\n  defaultOptions.disableTelemetry = {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  };\n}\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING || LIB\")) {\n  // Ensure that the `defaultOptions` are correctly specified.\n  for (const name in defaultOptions) {\n    const { value, kind, type } = defaultOptions[name];\n\n    if (kind & OptionKind.PREFERENCE) {\n      if (kind === OptionKind.PREFERENCE) {\n        throw new Error(`Cannot use only \"PREFERENCE\" kind: ${name}`);\n      }\n      if (kind & OptionKind.BROWSER) {\n        throw new Error(`Cannot mix \"PREFERENCE\" and \"BROWSER\" kind: ${name}`);\n      }\n      if (type !== undefined) {\n        throw new Error(\n          `Cannot have \\`type\\`-field for \"PREFERENCE\" kind: ${name}`\n        );\n      }\n      if (typeof compatParams === \"object\" && compatParams.has(name)) {\n        throw new Error(\n          `Should not have compatibility-value for \"PREFERENCE\" kind: ${name}`\n        );\n      }\n      // Only \"simple\" preference-values are allowed.\n      if (\n        typeof value !== \"boolean\" &&\n        typeof value !== \"string\" &&\n        !Number.isInteger(value)\n      ) {\n        throw new Error(`Invalid value for \"PREFERENCE\" kind: ${name}`);\n      }\n    } else if (kind & OptionKind.BROWSER) {\n      if (type !== undefined) {\n        throw new Error(\n          `Cannot have \\`type\\`-field for \"BROWSER\" kind: ${name}`\n        );\n      }\n      if (typeof compatParams === \"object\" && compatParams.has(name)) {\n        throw new Error(\n          `Should not have compatibility-value for \"BROWSER\" kind: ${name}`\n        );\n      }\n      if (value === undefined) {\n        throw new Error(`Invalid value for \"BROWSER\" kind: ${name}`);\n      }\n    }\n  }\n}\n\nclass AppOptions {\n  static eventBus;\n\n  static #opts = new Map();\n\n  static {\n    // Initialize all the user-options.\n    for (const name in defaultOptions) {\n      this.#opts.set(name, defaultOptions[name].value);\n    }\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      // Apply any compatibility-values to the user-options.\n      for (const [name, value] of compatParams) {\n        this.#opts.set(name, value);\n      }\n      this._hasInvokedSet = false;\n\n      this._checkDisablePreferences = () => {\n        if (this.get(\"disablePreferences\")) {\n          // Give custom implementations of the default viewer a simpler way to\n          // opt-out of having the `Preferences` override existing `AppOptions`.\n          return true;\n        }\n        if (this._hasInvokedSet) {\n          console.warn(\n            \"The Preferences may override manually set AppOptions; \" +\n              'please use the \"disablePreferences\"-option to prevent that.'\n          );\n        }\n        return false;\n      };\n    }\n  }\n\n  constructor() {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      throw new Error(\"Cannot initialize AppOptions.\");\n    }\n  }\n\n  static get(name) {\n    return this.#opts.get(name);\n  }\n\n  static getAll(kind = null, defaultOnly = false) {\n    const options = Object.create(null);\n    for (const name in defaultOptions) {\n      const defaultOpt = defaultOptions[name];\n\n      if (kind && !(kind & defaultOpt.kind)) {\n        continue;\n      }\n      options[name] = !defaultOnly ? this.#opts.get(name) : defaultOpt.value;\n    }\n    return options;\n  }\n\n  static set(name, value) {\n    this.setAll({ [name]: value });\n  }\n\n  static setAll(options, prefs = false) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this._hasInvokedSet ||= true;\n    }\n    let events;\n\n    for (const name in options) {\n      const defaultOpt = defaultOptions[name],\n        userOpt = options[name];\n\n      if (\n        !defaultOpt ||\n        !(\n          typeof userOpt === typeof defaultOpt.value ||\n          Type[(typeof userOpt).toUpperCase()] & defaultOpt.type\n        )\n      ) {\n        continue;\n      }\n      const { kind } = defaultOpt;\n\n      if (\n        prefs &&\n        !(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)\n      ) {\n        continue;\n      }\n      if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) {\n        (events ||= new Map()).set(name, userOpt);\n      }\n      this.#opts.set(name, userOpt);\n    }\n\n    if (events) {\n      for (const [name, value] of events) {\n        this.eventBus.dispatch(name.toLowerCase(), { source: this, value });\n      }\n    }\n  }\n}\n\nexport { AppOptions, OptionKind };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DrawLayer } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} DrawLayerBuilderOptions\n * @property {number} pageIndex\n */\n\nclass DrawLayerBuilder {\n  #drawLayer = null;\n\n  /**\n   * @param {DrawLayerBuilderOptions} options\n   */\n  constructor(options) {\n    this.pageIndex = options.pageIndex;\n  }\n\n  /**\n   * @param {string} intent (default value is 'display')\n   */\n  async render(intent = \"display\") {\n    if (intent !== \"display\" || this.#drawLayer || this._cancelled) {\n      return;\n    }\n    this.#drawLayer = new DrawLayer({\n      pageIndex: this.pageIndex,\n    });\n  }\n\n  cancel() {\n    this._cancelled = true;\n\n    if (!this.#drawLayer) {\n      return;\n    }\n    this.#drawLayer.destroy();\n    this.#drawLayer = null;\n  }\n\n  setParent(parent) {\n    this.#drawLayer?.setParent(parent);\n  }\n\n  getDrawLayer() {\n    return this.#drawLayer;\n  }\n}\n\nexport { DrawLayerBuilder };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { removeNullCharacters } from \"./ui_utils.js\";\n\nconst PDF_ROLE_TO_HTML_ROLE = {\n  // Document level structure types\n  Document: null, // There's a \"document\" role, but it doesn't make sense here.\n  DocumentFragment: null,\n  // Grouping level structure types\n  Part: \"group\",\n  Sect: \"group\", // XXX: There's a \"section\" role, but it's abstract.\n  Div: \"group\",\n  Aside: \"note\",\n  NonStruct: \"none\",\n  // Block level structure types\n  P: null,\n  // H<n>,\n  H: \"heading\",\n  Title: null,\n  FENote: \"note\",\n  // Sub-block level structure type\n  Sub: \"group\",\n  // General inline level structure types\n  Lbl: null,\n  Span: null,\n  Em: null,\n  Strong: null,\n  Link: \"link\",\n  Annot: \"note\",\n  Form: \"form\",\n  // Ruby and Warichu structure types\n  Ruby: null,\n  RB: null,\n  RT: null,\n  RP: null,\n  Warichu: null,\n  WT: null,\n  WP: null,\n  // List standard structure types\n  L: \"list\",\n  LI: \"listitem\",\n  LBody: null,\n  // Table standard structure types\n  Table: \"table\",\n  TR: \"row\",\n  TH: \"columnheader\",\n  TD: \"cell\",\n  THead: \"columnheader\",\n  TBody: null,\n  TFoot: null,\n  // Standard structure type Caption\n  Caption: null,\n  // Standard structure type Figure\n  Figure: \"figure\",\n  // Standard structure type Formula\n  Formula: null,\n  // standard structure type Artifact\n  Artifact: null,\n};\n\nconst HEADING_PATTERN = /^H(\\d+)$/;\n\nclass StructTreeLayerBuilder {\n  #promise;\n\n  #treeDom = null;\n\n  #treePromise;\n\n  #elementAttributes = new Map();\n\n  #rawDims;\n\n  #elementsToAddToTextLayer = null;\n\n  constructor(pdfPage, rawDims) {\n    this.#promise = pdfPage.getStructTree();\n    this.#rawDims = rawDims;\n  }\n\n  async render() {\n    if (this.#treePromise) {\n      return this.#treePromise;\n    }\n    const { promise, resolve, reject } = Promise.withResolvers();\n    this.#treePromise = promise;\n\n    try {\n      this.#treeDom = this.#walk(await this.#promise);\n    } catch (ex) {\n      reject(ex);\n    }\n    this.#promise = null;\n\n    this.#treeDom?.classList.add(\"structTree\");\n    resolve(this.#treeDom);\n\n    return promise;\n  }\n\n  async getAriaAttributes(annotationId) {\n    try {\n      await this.render();\n      return this.#elementAttributes.get(annotationId);\n    } catch {\n      // If the structTree cannot be fetched, parsed, and/or rendered,\n      // ensure that e.g. the AnnotationLayer won't break completely.\n    }\n    return null;\n  }\n\n  hide() {\n    if (this.#treeDom && !this.#treeDom.hidden) {\n      this.#treeDom.hidden = true;\n    }\n  }\n\n  show() {\n    if (this.#treeDom?.hidden) {\n      this.#treeDom.hidden = false;\n    }\n  }\n\n  #setAttributes(structElement, htmlElement) {\n    const { alt, id, lang } = structElement;\n    if (alt !== undefined) {\n      // Don't add the label in the struct tree layer but on the annotation\n      // in the annotation layer.\n      let added = false;\n      const label = removeNullCharacters(alt);\n      for (const child of structElement.children) {\n        if (child.type === \"annotation\") {\n          let attrs = this.#elementAttributes.get(child.id);\n          if (!attrs) {\n            attrs = new Map();\n            this.#elementAttributes.set(child.id, attrs);\n          }\n          attrs.set(\"aria-label\", label);\n          added = true;\n        }\n      }\n      if (!added) {\n        htmlElement.setAttribute(\"aria-label\", label);\n      }\n    }\n    if (id !== undefined) {\n      htmlElement.setAttribute(\"aria-owns\", id);\n    }\n    if (lang !== undefined) {\n      htmlElement.setAttribute(\n        \"lang\",\n        removeNullCharacters(lang, /* replaceInvisible = */ true)\n      );\n    }\n  }\n\n  #addImageInTextLayer(node, element) {\n    const { alt, bbox, children } = node;\n    const child = children?.[0];\n    if (!this.#rawDims || !alt || !bbox || child?.type !== \"content\") {\n      return false;\n    }\n\n    const { id } = child;\n    if (!id) {\n      return false;\n    }\n\n    // We cannot add the created element to the text layer immediately, as the\n    // text layer might not be ready yet. Instead, we store the element and add\n    // it later in `addElementsToTextLayer`.\n\n    element.setAttribute(\"aria-owns\", id);\n    const img = document.createElement(\"span\");\n    (this.#elementsToAddToTextLayer ||= new Map()).set(id, img);\n    img.setAttribute(\"role\", \"img\");\n    img.setAttribute(\"aria-label\", removeNullCharacters(alt));\n\n    const { pageHeight, pageX, pageY } = this.#rawDims;\n    const calc = \"calc(var(--scale-factor)*\";\n    const { style } = img;\n    style.width = `${calc}${bbox[2] - bbox[0]}px)`;\n    style.height = `${calc}${bbox[3] - bbox[1]}px)`;\n    style.left = `${calc}${bbox[0] - pageX}px)`;\n    style.top = `${calc}${pageHeight - bbox[3] + pageY}px)`;\n\n    return true;\n  }\n\n  addElementsToTextLayer() {\n    if (!this.#elementsToAddToTextLayer) {\n      return;\n    }\n    for (const [id, img] of this.#elementsToAddToTextLayer) {\n      document.getElementById(id)?.append(img);\n    }\n    this.#elementsToAddToTextLayer.clear();\n    this.#elementsToAddToTextLayer = null;\n  }\n\n  #walk(node) {\n    if (!node) {\n      return null;\n    }\n\n    const element = document.createElement(\"span\");\n    if (\"role\" in node) {\n      const { role } = node;\n      const match = role.match(HEADING_PATTERN);\n      if (match) {\n        element.setAttribute(\"role\", \"heading\");\n        element.setAttribute(\"aria-level\", match[1]);\n      } else if (PDF_ROLE_TO_HTML_ROLE[role]) {\n        element.setAttribute(\"role\", PDF_ROLE_TO_HTML_ROLE[role]);\n      }\n      if (role === \"Figure\" && this.#addImageInTextLayer(node, element)) {\n        return element;\n      }\n    }\n\n    this.#setAttributes(node, element);\n\n    if (node.children) {\n      if (node.children.length === 1 && \"id\" in node.children[0]) {\n        // Often there is only one content node so just set the values on the\n        // parent node to avoid creating an extra span.\n        this.#setAttributes(node.children[0], element);\n      } else {\n        for (const kid of node.children) {\n          element.append(this.#walk(kid));\n        }\n      }\n    }\n    return element;\n  }\n}\n\nexport { StructTreeLayerBuilder };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { binarySearchFirstItem } from \"./ui_utils.js\";\n\n/**\n * This class aims to provide some methods:\n *  - to reorder elements in the DOM with respect to the visual order;\n *  - to create a link, using aria-owns, between spans in the textLayer and\n *    annotations in the annotationLayer. The goal is to help to know\n *    where the annotations are in the text flow.\n */\nclass TextAccessibilityManager {\n  #enabled = false;\n\n  #textChildren = null;\n\n  #textNodes = new Map();\n\n  #waitingElements = new Map();\n\n  setTextMapping(textDivs) {\n    this.#textChildren = textDivs;\n  }\n\n  /**\n   * Compare the positions of two elements, it must correspond to\n   * the visual ordering.\n   *\n   * @param {HTMLElement} e1\n   * @param {HTMLElement} e2\n   * @returns {number}\n   */\n  static #compareElementPositions(e1, e2) {\n    const rect1 = e1.getBoundingClientRect();\n    const rect2 = e2.getBoundingClientRect();\n\n    if (rect1.width === 0 && rect1.height === 0) {\n      return +1;\n    }\n\n    if (rect2.width === 0 && rect2.height === 0) {\n      return -1;\n    }\n\n    const top1 = rect1.y;\n    const bot1 = rect1.y + rect1.height;\n    const mid1 = rect1.y + rect1.height / 2;\n\n    const top2 = rect2.y;\n    const bot2 = rect2.y + rect2.height;\n    const mid2 = rect2.y + rect2.height / 2;\n\n    if (mid1 <= top2 && mid2 >= bot1) {\n      return -1;\n    }\n\n    if (mid2 <= top1 && mid1 >= bot2) {\n      return +1;\n    }\n\n    const centerX1 = rect1.x + rect1.width / 2;\n    const centerX2 = rect2.x + rect2.width / 2;\n\n    return centerX1 - centerX2;\n  }\n\n  /**\n   * Function called when the text layer has finished rendering.\n   */\n  enable() {\n    if (this.#enabled) {\n      throw new Error(\"TextAccessibilityManager is already enabled.\");\n    }\n    if (!this.#textChildren) {\n      throw new Error(\"Text divs and strings have not been set.\");\n    }\n\n    this.#enabled = true;\n    this.#textChildren = this.#textChildren.slice();\n    this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions);\n\n    if (this.#textNodes.size > 0) {\n      // Some links have been made before this manager has been disabled, hence\n      // we restore them.\n      const textChildren = this.#textChildren;\n      for (const [id, nodeIndex] of this.#textNodes) {\n        const element = document.getElementById(id);\n        if (!element) {\n          // If the page was *fully* reset the element no longer exists, and it\n          // will be re-inserted later (i.e. when the annotationLayer renders).\n          this.#textNodes.delete(id);\n          continue;\n        }\n        this.#addIdToAriaOwns(id, textChildren[nodeIndex]);\n      }\n    }\n\n    for (const [element, isRemovable] of this.#waitingElements) {\n      this.addPointerInTextLayer(element, isRemovable);\n    }\n    this.#waitingElements.clear();\n  }\n\n  disable() {\n    if (!this.#enabled) {\n      return;\n    }\n\n    // Don't clear this.#textNodes which is used to rebuild the aria-owns\n    // in case it's re-enabled at some point.\n\n    this.#waitingElements.clear();\n    this.#textChildren = null;\n    this.#enabled = false;\n  }\n\n  /**\n   * Remove an aria-owns id from a node in the text layer.\n   * @param {HTMLElement} element\n   */\n  removePointerInTextLayer(element) {\n    if (!this.#enabled) {\n      this.#waitingElements.delete(element);\n      return;\n    }\n\n    const children = this.#textChildren;\n    if (!children || children.length === 0) {\n      return;\n    }\n\n    const { id } = element;\n    const nodeIndex = this.#textNodes.get(id);\n    if (nodeIndex === undefined) {\n      return;\n    }\n\n    const node = children[nodeIndex];\n\n    this.#textNodes.delete(id);\n    let owns = node.getAttribute(\"aria-owns\");\n    if (owns?.includes(id)) {\n      owns = owns\n        .split(\" \")\n        .filter(x => x !== id)\n        .join(\" \");\n      if (owns) {\n        node.setAttribute(\"aria-owns\", owns);\n      } else {\n        node.removeAttribute(\"aria-owns\");\n        node.setAttribute(\"role\", \"presentation\");\n      }\n    }\n  }\n\n  #addIdToAriaOwns(id, node) {\n    const owns = node.getAttribute(\"aria-owns\");\n    if (!owns?.includes(id)) {\n      node.setAttribute(\"aria-owns\", owns ? `${owns} ${id}` : id);\n    }\n    node.removeAttribute(\"role\");\n  }\n\n  /**\n   * Find the text node which is the nearest and add an aria-owns attribute\n   * in order to correctly position this editor in the text flow.\n   * @param {HTMLElement} element\n   * @param {boolean} isRemovable\n   * @returns {string|null} The id in the struct tree if any.\n   */\n  addPointerInTextLayer(element, isRemovable) {\n    const { id } = element;\n    if (!id) {\n      return null;\n    }\n\n    if (!this.#enabled) {\n      // The text layer needs to be there, so we postpone the association.\n      this.#waitingElements.set(element, isRemovable);\n      return null;\n    }\n\n    if (isRemovable) {\n      this.removePointerInTextLayer(element);\n    }\n\n    const children = this.#textChildren;\n    if (!children || children.length === 0) {\n      return null;\n    }\n\n    const index = binarySearchFirstItem(\n      children,\n      node =>\n        TextAccessibilityManager.#compareElementPositions(element, node) < 0\n    );\n\n    const nodeIndex = Math.max(0, index - 1);\n    const child = children[nodeIndex];\n    this.#addIdToAriaOwns(id, child);\n    this.#textNodes.set(id, nodeIndex);\n\n    const parent = child.parentNode;\n    return parent?.classList.contains(\"markedContent\") ? parent.id : null;\n  }\n\n  /**\n   * Move a div in the DOM in order to respect the visual order.\n   * @param {HTMLDivElement} element\n   * @returns {string|null} The id in the struct tree if any.\n   */\n  moveElementInDOM(container, element, contentElement, isRemovable) {\n    const id = this.addPointerInTextLayer(contentElement, isRemovable);\n\n    if (!container.hasChildNodes()) {\n      container.append(element);\n      return id;\n    }\n\n    const children = Array.from(container.childNodes).filter(\n      node => node !== element\n    );\n\n    if (children.length === 0) {\n      return id;\n    }\n\n    const elementToCompare = contentElement || element;\n    const index = binarySearchFirstItem(\n      children,\n      node =>\n        TextAccessibilityManager.#compareElementPositions(\n          elementToCompare,\n          node\n        ) < 0\n    );\n\n    if (index === 0) {\n      children[0].before(element);\n    } else {\n      children[index - 1].after(element);\n    }\n\n    return id;\n  }\n}\n\nexport { TextAccessibilityManager };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_find_controller\").PDFFindController} PDFFindController */\n\n/**\n * @typedef {Object} TextHighlighterOptions\n * @property {PDFFindController} findController\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} pageIndex - The page index.\n */\n\n/**\n * TextHighlighter handles highlighting matches from the FindController in\n * either the text layer or XFA layer depending on the type of document.\n */\nclass TextHighlighter {\n  #eventAbortController = null;\n\n  /**\n   * @param {TextHighlighterOptions} options\n   */\n  constructor({ findController, eventBus, pageIndex }) {\n    this.findController = findController;\n    this.matches = [];\n    this.eventBus = eventBus;\n    this.pageIdx = pageIndex;\n    this.textDivs = null;\n    this.textContentItemsStr = null;\n    this.enabled = false;\n  }\n\n  /**\n   * Store two arrays that will map DOM nodes to text they should contain.\n   * The arrays should be of equal length and the array element at each index\n   * should correspond to the other. e.g.\n   * `items[0] = \"<span>Item 0</span>\" and texts[0] = \"Item 0\";\n   *\n   * @param {Array<Node>} divs\n   * @param {Array<string>} texts\n   */\n  setTextMapping(divs, texts) {\n    this.textDivs = divs;\n    this.textContentItemsStr = texts;\n  }\n\n  /**\n   * Start listening for events to update the highlighter and check if there are\n   * any current matches that need be highlighted.\n   */\n  enable() {\n    if (!this.textDivs || !this.textContentItemsStr) {\n      throw new Error(\"Text divs and strings have not been set.\");\n    }\n    if (this.enabled) {\n      throw new Error(\"TextHighlighter is already enabled.\");\n    }\n    this.enabled = true;\n\n    if (!this.#eventAbortController) {\n      this.#eventAbortController = new AbortController();\n\n      this.eventBus._on(\n        \"updatetextlayermatches\",\n        evt => {\n          if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) {\n            this._updateMatches();\n          }\n        },\n        { signal: this.#eventAbortController.signal }\n      );\n    }\n    this._updateMatches();\n  }\n\n  disable() {\n    if (!this.enabled) {\n      return;\n    }\n    this.enabled = false;\n\n    this.#eventAbortController?.abort();\n    this.#eventAbortController = null;\n\n    this._updateMatches(/* reset = */ true);\n  }\n\n  _convertMatches(matches, matchesLength) {\n    // Early exit if there is nothing to convert.\n    if (!matches) {\n      return [];\n    }\n    const { textContentItemsStr } = this;\n\n    let i = 0,\n      iIndex = 0;\n    const end = textContentItemsStr.length - 1;\n    const result = [];\n\n    for (let m = 0, mm = matches.length; m < mm; m++) {\n      // Calculate the start position.\n      let matchIdx = matches[m];\n\n      // Loop over the divIdxs.\n      while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {\n        iIndex += textContentItemsStr[i].length;\n        i++;\n      }\n\n      if (i === textContentItemsStr.length) {\n        console.error(\"Could not find a matching mapping\");\n      }\n\n      const match = {\n        begin: {\n          divIdx: i,\n          offset: matchIdx - iIndex,\n        },\n      };\n\n      // Calculate the end position.\n      matchIdx += matchesLength[m];\n\n      // Somewhat the same array as above, but use > instead of >= to get\n      // the end position right.\n      while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {\n        iIndex += textContentItemsStr[i].length;\n        i++;\n      }\n\n      match.end = {\n        divIdx: i,\n        offset: matchIdx - iIndex,\n      };\n      result.push(match);\n    }\n    return result;\n  }\n\n  _renderMatches(matches) {\n    // Early exit if there is nothing to render.\n    if (matches.length === 0) {\n      return;\n    }\n    const { findController, pageIdx } = this;\n    const { textContentItemsStr, textDivs } = this;\n\n    const isSelectedPage = pageIdx === findController.selected.pageIdx;\n    const selectedMatchIdx = findController.selected.matchIdx;\n    const highlightAll = findController.state.highlightAll;\n    let prevEnd = null;\n    const infinity = {\n      divIdx: -1,\n      offset: undefined,\n    };\n\n    function beginText(begin, className) {\n      const divIdx = begin.divIdx;\n      textDivs[divIdx].textContent = \"\";\n      return appendTextToDiv(divIdx, 0, begin.offset, className);\n    }\n\n    function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n      let div = textDivs[divIdx];\n      if (div.nodeType === Node.TEXT_NODE) {\n        const span = document.createElement(\"span\");\n        div.before(span);\n        span.append(div);\n        textDivs[divIdx] = span;\n        div = span;\n      }\n      const content = textContentItemsStr[divIdx].substring(\n        fromOffset,\n        toOffset\n      );\n      const node = document.createTextNode(content);\n      if (className) {\n        const span = document.createElement(\"span\");\n        span.className = `${className} appended`;\n        span.append(node);\n        div.append(span);\n\n        if (className.includes(\"selected\")) {\n          const { left } = span.getClientRects()[0];\n          const parentLeft = div.getBoundingClientRect().left;\n          return left - parentLeft;\n        }\n        return 0;\n      }\n\n      div.append(node);\n      return 0;\n    }\n\n    let i0 = selectedMatchIdx,\n      i1 = i0 + 1;\n    if (highlightAll) {\n      i0 = 0;\n      i1 = matches.length;\n    } else if (!isSelectedPage) {\n      // Not highlighting all and this isn't the selected page, so do nothing.\n      return;\n    }\n\n    let lastDivIdx = -1;\n    let lastOffset = -1;\n    for (let i = i0; i < i1; i++) {\n      const match = matches[i];\n      const begin = match.begin;\n      if (begin.divIdx === lastDivIdx && begin.offset === lastOffset) {\n        // It's possible to be in this situation if we searched for a 'f' and we\n        // have a ligature 'ff' in the text. The 'ff' has to be highlighted two\n        // times.\n        continue;\n      }\n      lastDivIdx = begin.divIdx;\n      lastOffset = begin.offset;\n\n      const end = match.end;\n      const isSelected = isSelectedPage && i === selectedMatchIdx;\n      const highlightSuffix = isSelected ? \" selected\" : \"\";\n      let selectedLeft = 0;\n\n      // Match inside new div.\n      if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n        // If there was a previous div, then add the text at the end.\n        if (prevEnd !== null) {\n          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n        }\n        // Clear the divs and set the content until the starting point.\n        beginText(begin);\n      } else {\n        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n      }\n\n      if (begin.divIdx === end.divIdx) {\n        selectedLeft = appendTextToDiv(\n          begin.divIdx,\n          begin.offset,\n          end.offset,\n          \"highlight\" + highlightSuffix\n        );\n      } else {\n        selectedLeft = appendTextToDiv(\n          begin.divIdx,\n          begin.offset,\n          infinity.offset,\n          \"highlight begin\" + highlightSuffix\n        );\n        for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n          textDivs[n0].className = \"highlight middle\" + highlightSuffix;\n        }\n        beginText(end, \"highlight end\" + highlightSuffix);\n      }\n      prevEnd = end;\n\n      if (isSelected) {\n        // Attempt to scroll the selected match into view.\n        findController.scrollMatchIntoView({\n          element: textDivs[begin.divIdx],\n          selectedLeft,\n          pageIndex: pageIdx,\n          matchIndex: selectedMatchIdx,\n        });\n      }\n    }\n\n    if (prevEnd) {\n      appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n    }\n  }\n\n  _updateMatches(reset = false) {\n    if (!this.enabled && !reset) {\n      return;\n    }\n    const { findController, matches, pageIdx } = this;\n    const { textContentItemsStr, textDivs } = this;\n    let clearedUntilDivIdx = -1;\n\n    // Clear all current matches.\n    for (const match of matches) {\n      const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n      for (let n = begin, end = match.end.divIdx; n <= end; n++) {\n        const div = textDivs[n];\n        div.textContent = textContentItemsStr[n];\n        div.className = \"\";\n      }\n      clearedUntilDivIdx = match.end.divIdx + 1;\n    }\n\n    if (!findController?.highlightMatches || reset) {\n      return;\n    }\n    // Convert the matches on the `findController` into the match format\n    // used for the textLayer.\n    const pageMatches = findController.pageMatches[pageIdx] || null;\n    const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null;\n\n    this.matches = this._convertMatches(pageMatches, pageMatchesLength);\n    this._renderMatches(this.matches);\n  }\n}\n\nexport { TextHighlighter };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/display_utils\").PageViewport} PageViewport */\n/** @typedef {import(\"./text_highlighter\").TextHighlighter} TextHighlighter */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./text_accessibility.js\").TextAccessibilityManager} TextAccessibilityManager */\n\nimport { normalizeUnicode, stopEvent, TextLayer } from \"pdfjs-lib\";\nimport { removeNullCharacters } from \"./ui_utils.js\";\n\n/**\n * @typedef {Object} TextLayerBuilderOptions\n * @property {PDFPageProxy} pdfPage\n * @property {TextHighlighter} [highlighter] - Optional object that will handle\n *   highlighting text from the find controller.\n * @property {TextAccessibilityManager} [accessibilityManager]\n * @property {function} [onAppend]\n */\n\n/**\n * The text layer builder provides text selection functionality for the PDF.\n * It does this by creating overlay divs over the PDF's text. These divs\n * contain text that matches the PDF text they are overlaying.\n */\nclass TextLayerBuilder {\n  #enablePermissions = false;\n\n  #onAppend = null;\n\n  #renderingDone = false;\n\n  #textLayer = null;\n\n  static #textLayers = new Map();\n\n  static #selectionChangeAbortController = null;\n\n  constructor({\n    pdfPage,\n    highlighter = null,\n    accessibilityManager = null,\n    enablePermissions = false,\n    onAppend = null,\n  }) {\n    this.pdfPage = pdfPage;\n    this.highlighter = highlighter;\n    this.accessibilityManager = accessibilityManager;\n    this.#enablePermissions = enablePermissions === true;\n    this.#onAppend = onAppend;\n\n    this.div = document.createElement(\"div\");\n    this.div.tabIndex = 0;\n    this.div.className = \"textLayer\";\n  }\n\n  /**\n   * Renders the text layer.\n   * @param {PageViewport} viewport\n   * @param {Object} [textContentParams]\n   */\n  async render(viewport, textContentParams = null) {\n    if (this.#renderingDone && this.#textLayer) {\n      this.#textLayer.update({\n        viewport,\n        onBefore: this.hide.bind(this),\n      });\n      this.show();\n      return;\n    }\n\n    this.cancel();\n    this.#textLayer = new TextLayer({\n      textContentSource: this.pdfPage.streamTextContent(\n        textContentParams || {\n          includeMarkedContent: true,\n          disableNormalization: true,\n        }\n      ),\n      container: this.div,\n      viewport,\n    });\n\n    const { textDivs, textContentItemsStr } = this.#textLayer;\n    this.highlighter?.setTextMapping(textDivs, textContentItemsStr);\n    this.accessibilityManager?.setTextMapping(textDivs);\n\n    await this.#textLayer.render();\n    this.#renderingDone = true;\n\n    const endOfContent = document.createElement(\"div\");\n    endOfContent.className = \"endOfContent\";\n    this.div.append(endOfContent);\n\n    this.#bindMouse(endOfContent);\n    // Ensure that the textLayer is appended to the DOM *before* handling\n    // e.g. a pending search operation.\n    this.#onAppend?.(this.div);\n    this.highlighter?.enable();\n    this.accessibilityManager?.enable();\n  }\n\n  hide() {\n    if (!this.div.hidden && this.#renderingDone) {\n      // We turn off the highlighter in order to avoid to scroll into view an\n      // element of the text layer which could be hidden.\n      this.highlighter?.disable();\n      this.div.hidden = true;\n    }\n  }\n\n  show() {\n    if (this.div.hidden && this.#renderingDone) {\n      this.div.hidden = false;\n      this.highlighter?.enable();\n    }\n  }\n\n  /**\n   * Cancel rendering of the text layer.\n   */\n  cancel() {\n    this.#textLayer?.cancel();\n    this.#textLayer = null;\n\n    this.highlighter?.disable();\n    this.accessibilityManager?.disable();\n    TextLayerBuilder.#removeGlobalSelectionListener(this.div);\n  }\n\n  /**\n   * Improves text selection by adding an additional div where the mouse was\n   * clicked. This reduces flickering of the content if the mouse is slowly\n   * dragged up or down.\n   */\n  #bindMouse(end) {\n    const { div } = this;\n\n    div.addEventListener(\"mousedown\", () => {\n      div.classList.add(\"selecting\");\n    });\n\n    div.addEventListener(\"copy\", event => {\n      if (!this.#enablePermissions) {\n        const selection = document.getSelection();\n        event.clipboardData.setData(\n          \"text/plain\",\n          removeNullCharacters(normalizeUnicode(selection.toString()))\n        );\n      }\n      stopEvent(event);\n    });\n\n    TextLayerBuilder.#textLayers.set(div, end);\n    TextLayerBuilder.#enableGlobalSelectionListener();\n  }\n\n  static #removeGlobalSelectionListener(textLayerDiv) {\n    this.#textLayers.delete(textLayerDiv);\n\n    if (this.#textLayers.size === 0) {\n      this.#selectionChangeAbortController?.abort();\n      this.#selectionChangeAbortController = null;\n    }\n  }\n\n  static #enableGlobalSelectionListener() {\n    if (this.#selectionChangeAbortController) {\n      // document-level event listeners already installed\n      return;\n    }\n    this.#selectionChangeAbortController = new AbortController();\n    const { signal } = this.#selectionChangeAbortController;\n\n    const reset = (end, textLayer) => {\n      if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n        textLayer.append(end);\n        end.style.width = \"\";\n        end.style.height = \"\";\n      }\n      textLayer.classList.remove(\"selecting\");\n    };\n\n    let isPointerDown = false;\n    document.addEventListener(\n      \"pointerdown\",\n      () => {\n        isPointerDown = true;\n      },\n      { signal }\n    );\n    document.addEventListener(\n      \"pointerup\",\n      () => {\n        isPointerDown = false;\n        this.#textLayers.forEach(reset);\n      },\n      { signal }\n    );\n    window.addEventListener(\n      \"blur\",\n      () => {\n        isPointerDown = false;\n        this.#textLayers.forEach(reset);\n      },\n      { signal }\n    );\n    document.addEventListener(\n      \"keyup\",\n      () => {\n        if (!isPointerDown) {\n          this.#textLayers.forEach(reset);\n        }\n      },\n      { signal }\n    );\n\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n      // eslint-disable-next-line no-var\n      var isFirefox, prevRange;\n    }\n\n    document.addEventListener(\n      \"selectionchange\",\n      () => {\n        const selection = document.getSelection();\n        if (selection.rangeCount === 0) {\n          this.#textLayers.forEach(reset);\n          return;\n        }\n\n        // Even though the spec says that .rangeCount should be 0 or 1, Firefox\n        // creates multiple ranges when selecting across multiple pages.\n        // Make sure to collect all the .textLayer elements where the selection\n        // is happening.\n        const activeTextLayers = new Set();\n        for (let i = 0; i < selection.rangeCount; i++) {\n          const range = selection.getRangeAt(i);\n          for (const textLayerDiv of this.#textLayers.keys()) {\n            if (\n              !activeTextLayers.has(textLayerDiv) &&\n              range.intersectsNode(textLayerDiv)\n            ) {\n              activeTextLayers.add(textLayerDiv);\n            }\n          }\n        }\n\n        for (const [textLayerDiv, endDiv] of this.#textLayers) {\n          if (activeTextLayers.has(textLayerDiv)) {\n            textLayerDiv.classList.add(\"selecting\");\n          } else {\n            reset(endDiv, textLayerDiv);\n          }\n        }\n\n        if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n          return;\n        }\n        if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\")) {\n          isFirefox ??=\n            getComputedStyle(\n              this.#textLayers.values().next().value\n            ).getPropertyValue(\"-moz-user-select\") === \"none\";\n\n          if (isFirefox) {\n            return;\n          }\n        }\n        // In non-Firefox browsers, when hovering over an empty space (thus,\n        // on .endOfContent), the selection will expand to cover all the\n        // text between the current selection and .endOfContent. By moving\n        // .endOfContent to right after (or before, depending on which side\n        // of the selection the user is moving), we limit the selection jump\n        // to at most cover the enteirety of the <span> where the selection\n        // is being modified.\n        const range = selection.getRangeAt(0);\n        const modifyStart =\n          prevRange &&\n          (range.compareBoundaryPoints(Range.END_TO_END, prevRange) === 0 ||\n            range.compareBoundaryPoints(Range.START_TO_END, prevRange) === 0);\n        let anchor = modifyStart ? range.startContainer : range.endContainer;\n        if (anchor.nodeType === Node.TEXT_NODE) {\n          anchor = anchor.parentNode;\n        }\n\n        const parentTextLayer = anchor.parentElement?.closest(\".textLayer\");\n        const endDiv = this.#textLayers.get(parentTextLayer);\n        if (endDiv) {\n          endDiv.style.width = parentTextLayer.style.width;\n          endDiv.style.height = parentTextLayer.style.height;\n          anchor.parentElement.insertBefore(\n            endDiv,\n            modifyStart ? anchor : anchor.nextSibling\n          );\n        }\n\n        prevRange = range.cloneRange();\n      },\n      { signal }\n    );\n  }\n}\n\nexport { TextLayerBuilder };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/annotation_storage\").AnnotationStorage} AnnotationStorage */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/display_utils\").PageViewport} PageViewport */\n/** @typedef {import(\"./interfaces\").IPDFLinkService} IPDFLinkService */\n\nimport { XfaLayer } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} XfaLayerBuilderOptions\n * @property {PDFPageProxy} pdfPage\n * @property {AnnotationStorage} [annotationStorage]\n * @property {IPDFLinkService} linkService\n * @property {Object} [xfaHtml]\n */\n\nclass XfaLayerBuilder {\n  /**\n   * @param {XfaLayerBuilderOptions} options\n   */\n  constructor({\n    pdfPage,\n    annotationStorage = null,\n    linkService,\n    xfaHtml = null,\n  }) {\n    this.pdfPage = pdfPage;\n    this.annotationStorage = annotationStorage;\n    this.linkService = linkService;\n    this.xfaHtml = xfaHtml;\n\n    this.div = null;\n    this._cancelled = false;\n  }\n\n  /**\n   * @param {PageViewport} viewport\n   * @param {string} intent (default value is 'display')\n   * @returns {Promise<Object | void>} A promise that is resolved when rendering\n   *   of the XFA layer is complete. The first rendering will return an object\n   *   with a `textDivs` property that can be used with the TextHighlighter.\n   */\n  async render(viewport, intent = \"display\") {\n    if (intent === \"print\") {\n      const parameters = {\n        viewport: viewport.clone({ dontFlip: true }),\n        div: this.div,\n        xfaHtml: this.xfaHtml,\n        annotationStorage: this.annotationStorage,\n        linkService: this.linkService,\n        intent,\n      };\n\n      // Create an xfa layer div and render the form\n      this.div = document.createElement(\"div\");\n      parameters.div = this.div;\n\n      return XfaLayer.render(parameters);\n    }\n\n    // intent === \"display\"\n    const xfaHtml = await this.pdfPage.getXfa();\n    if (this._cancelled || !xfaHtml) {\n      return { textDivs: [] };\n    }\n\n    const parameters = {\n      viewport: viewport.clone({ dontFlip: true }),\n      div: this.div,\n      xfaHtml,\n      annotationStorage: this.annotationStorage,\n      linkService: this.linkService,\n      intent,\n    };\n\n    if (this.div) {\n      return XfaLayer.update(parameters);\n    }\n    // Create an xfa layer div and render the form\n    this.div = document.createElement(\"div\");\n    parameters.div = this.div;\n\n    return XfaLayer.render(parameters);\n  }\n\n  cancel() {\n    this._cancelled = true;\n  }\n\n  hide() {\n    if (!this.div) {\n      return;\n    }\n    this.div.hidden = true;\n  }\n}\n\nexport { XfaLayerBuilder };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/display_utils\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/optional_content_config\").OptionalContentConfig} OptionalContentConfig */\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n/** @typedef {import(\"./interfaces\").IRenderableView} IRenderableView */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_rendering_queue\").PDFRenderingQueue} PDFRenderingQueue */\n\nimport {\n  AbortException,\n  AnnotationMode,\n  OutputScale,\n  PixelsPerInch,\n  RenderingCancelledException,\n  setLayerDimensions,\n  shadow,\n} from \"pdfjs-lib\";\nimport {\n  approximateFraction,\n  calcRound,\n  DEFAULT_SCALE,\n  floorToDivide,\n  RenderingStates,\n  TextLayerMode,\n} from \"./ui_utils.js\";\nimport { AnnotationEditorLayerBuilder } from \"./annotation_editor_layer_builder.js\";\nimport { AnnotationLayerBuilder } from \"./annotation_layer_builder.js\";\nimport { AppOptions } from \"./app_options.js\";\nimport { DrawLayerBuilder } from \"./draw_layer_builder.js\";\nimport { GenericL10n } from \"web-null_l10n\";\nimport { SimpleLinkService } from \"./pdf_link_service.js\";\nimport { StructTreeLayerBuilder } from \"./struct_tree_layer_builder.js\";\nimport { TextAccessibilityManager } from \"./text_accessibility.js\";\nimport { TextHighlighter } from \"./text_highlighter.js\";\nimport { TextLayerBuilder } from \"./text_layer_builder.js\";\nimport { XfaLayerBuilder } from \"./xfa_layer_builder.js\";\n\n/**\n * @typedef {Object} PDFPageViewOptions\n * @property {HTMLDivElement} [container] - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} id - The page unique ID (normally its number).\n * @property {number} [scale] - The page scale display.\n * @property {PageViewport} defaultViewport - The page viewport.\n * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] -\n *   A promise that is resolved with an {@link OptionalContentConfig} instance.\n *   The default value is `null`.\n * @property {PDFRenderingQueue} [renderingQueue] - The rendering queue object.\n * @property {number} [textLayerMode] - Controls if the text layer used for\n *   selection and searching is created. The constants from {TextLayerMode}\n *   should be used. The default value is `TextLayerMode.ENABLE`.\n * @property {number} [annotationMode] - Controls if the annotation layer is\n *   created, and if interactive form elements or `AnnotationStorage`-data are\n *   being rendered. The constants from {@link AnnotationMode} should be used;\n *   see also {@link RenderParameters} and {@link GetOperatorListParameters}.\n *   The default value is `AnnotationMode.ENABLE_FORMS`.\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   for annotation icons. Include trailing slash.\n * @property {number} [maxCanvasPixels] - The maximum supported canvas size in\n *   total pixels, i.e. width * height. Use `-1` for no limit, or `0` for\n *   CSS-only zooming. The default value is 4096 * 8192 (32 mega-pixels).\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n *   with user defined ones in order to improve readability in high contrast\n *   mode.\n * @property {IL10n} [l10n] - Localization service.\n * @property {Object} [layerProperties] - The object that is used to lookup\n *   the necessary layer-properties.\n * @property {boolean} [enableHWA] - Enables hardware acceleration for\n *   rendering. The default value is `false`.\n */\n\nconst DEFAULT_LAYER_PROPERTIES =\n  typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"COMPONENTS\")\n    ? null\n    : {\n        annotationEditorUIManager: null,\n        annotationStorage: null,\n        downloadManager: null,\n        enableScripting: false,\n        fieldObjectsPromise: null,\n        findController: null,\n        hasJSActionsPromise: null,\n        get linkService() {\n          return new SimpleLinkService();\n        },\n      };\n\nconst LAYERS_ORDER = new Map([\n  [\"canvasWrapper\", 0],\n  [\"textLayer\", 1],\n  [\"annotationLayer\", 2],\n  [\"annotationEditorLayer\", 3],\n  [\"xfaLayer\", 3],\n]);\n\n/**\n * @implements {IRenderableView}\n */\nclass PDFPageView {\n  #annotationMode = AnnotationMode.ENABLE_FORMS;\n\n  #canvasWrapper = null;\n\n  #enableHWA = false;\n\n  #hasRestrictedScaling = false;\n\n  #isEditing = false;\n\n  #layerProperties = null;\n\n  #loadingId = null;\n\n  #originalViewport = null;\n\n  #previousRotation = null;\n\n  #scaleRoundX = 1;\n\n  #scaleRoundY = 1;\n\n  #renderError = null;\n\n  #renderingState = RenderingStates.INITIAL;\n\n  #textLayerMode = TextLayerMode.ENABLE;\n\n  #useThumbnailCanvas = {\n    directDrawing: true,\n    initialOptionalContent: true,\n    regularAnnotations: true,\n  };\n\n  #layers = [null, null, null, null];\n\n  /**\n   * @param {PDFPageViewOptions} options\n   */\n  constructor(options) {\n    const container = options.container;\n    const defaultViewport = options.defaultViewport;\n\n    this.id = options.id;\n    this.renderingId = \"page\" + this.id;\n    this.#layerProperties = options.layerProperties || DEFAULT_LAYER_PROPERTIES;\n\n    this.pdfPage = null;\n    this.pageLabel = null;\n    this.rotation = 0;\n    this.scale = options.scale || DEFAULT_SCALE;\n    this.viewport = defaultViewport;\n    this.pdfPageRotate = defaultViewport.rotation;\n    this._optionalContentConfigPromise =\n      options.optionalContentConfigPromise || null;\n    this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE;\n    this.#annotationMode =\n      options.annotationMode ?? AnnotationMode.ENABLE_FORMS;\n    this.imageResourcesPath = options.imageResourcesPath || \"\";\n    this.maxCanvasPixels =\n      options.maxCanvasPixels ?? AppOptions.get(\"maxCanvasPixels\");\n    this.pageColors = options.pageColors || null;\n    this.#enableHWA = options.enableHWA || false;\n\n    this.eventBus = options.eventBus;\n    this.renderingQueue = options.renderingQueue;\n    this.l10n = options.l10n;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this.l10n ||= new GenericL10n();\n    }\n\n    this.renderTask = null;\n    this.resume = null;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this._isStandalone = !this.renderingQueue?.hasViewer();\n      this._container = container;\n    }\n\n    this._annotationCanvasMap = null;\n\n    this.annotationLayer = null;\n    this.annotationEditorLayer = null;\n    this.textLayer = null;\n    this.xfaLayer = null;\n    this.structTreeLayer = null;\n    this.drawLayer = null;\n\n    const div = document.createElement(\"div\");\n    div.className = \"page\";\n    div.setAttribute(\"data-page-number\", this.id);\n    div.setAttribute(\"role\", \"region\");\n    div.setAttribute(\"data-l10n-id\", \"pdfjs-page-landmark\");\n    div.setAttribute(\"data-l10n-args\", JSON.stringify({ page: this.id }));\n    this.div = div;\n\n    this.#setDimensions();\n    container?.append(div);\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this._isStandalone\n    ) {\n      // Ensure that the various layers always get the correct initial size,\n      // see issue 15795.\n      container?.style.setProperty(\n        \"--scale-factor\",\n        this.scale * PixelsPerInch.PDF_TO_CSS_UNITS\n      );\n\n      if (this.pageColors?.background) {\n        container?.style.setProperty(\n          \"--page-bg-color\",\n          this.pageColors.background\n        );\n      }\n\n      const { optionalContentConfigPromise } = options;\n      if (optionalContentConfigPromise) {\n        // Ensure that the thumbnails always display the *initial* document\n        // state, for documents with optional content.\n        optionalContentConfigPromise.then(optionalContentConfig => {\n          if (\n            optionalContentConfigPromise !== this._optionalContentConfigPromise\n          ) {\n            return;\n          }\n          this.#useThumbnailCanvas.initialOptionalContent =\n            optionalContentConfig.hasInitialVisibility;\n        });\n      }\n\n      // Ensure that Fluent is connected in e.g. the COMPONENTS build.\n      if (!options.l10n) {\n        this.l10n.translate(this.div);\n      }\n    }\n  }\n\n  #addLayer(div, name) {\n    const pos = LAYERS_ORDER.get(name);\n    const oldDiv = this.#layers[pos];\n    this.#layers[pos] = div;\n    if (oldDiv) {\n      oldDiv.replaceWith(div);\n      return;\n    }\n    for (let i = pos - 1; i >= 0; i--) {\n      const layer = this.#layers[i];\n      if (layer) {\n        layer.after(div);\n        return;\n      }\n    }\n    this.div.prepend(div);\n  }\n\n  get renderingState() {\n    return this.#renderingState;\n  }\n\n  set renderingState(state) {\n    if (state === this.#renderingState) {\n      return;\n    }\n    this.#renderingState = state;\n\n    if (this.#loadingId) {\n      clearTimeout(this.#loadingId);\n      this.#loadingId = null;\n    }\n\n    switch (state) {\n      case RenderingStates.PAUSED:\n        this.div.classList.remove(\"loading\");\n        break;\n      case RenderingStates.RUNNING:\n        this.div.classList.add(\"loadingIcon\");\n        this.#loadingId = setTimeout(() => {\n          // Adding the loading class is slightly postponed in order to not have\n          // it with loadingIcon.\n          // If we don't do that the visibility of the background is changed but\n          // the transition isn't triggered.\n          this.div.classList.add(\"loading\");\n          this.#loadingId = null;\n        }, 0);\n        break;\n      case RenderingStates.INITIAL:\n      case RenderingStates.FINISHED:\n        this.div.classList.remove(\"loadingIcon\", \"loading\");\n        break;\n    }\n  }\n\n  #setDimensions() {\n    const { viewport } = this;\n    if (this.pdfPage) {\n      if (this.#previousRotation === viewport.rotation) {\n        return;\n      }\n      this.#previousRotation = viewport.rotation;\n    }\n\n    setLayerDimensions(\n      this.div,\n      viewport,\n      /* mustFlip = */ true,\n      /* mustRotate = */ false\n    );\n  }\n\n  setPdfPage(pdfPage) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this._isStandalone &&\n      (this.pageColors?.foreground === \"CanvasText\" ||\n        this.pageColors?.background === \"Canvas\")\n    ) {\n      this._container?.style.setProperty(\n        \"--hcm-highlight-filter\",\n        pdfPage.filterFactory.addHighlightHCMFilter(\n          \"highlight\",\n          \"CanvasText\",\n          \"Canvas\",\n          \"HighlightText\",\n          \"Highlight\"\n        )\n      );\n      this._container?.style.setProperty(\n        \"--hcm-highlight-selected-filter\",\n        pdfPage.filterFactory.addHighlightHCMFilter(\n          \"highlight_selected\",\n          \"CanvasText\",\n          \"Canvas\",\n          \"HighlightText\",\n          \"Highlight\"\n        )\n      );\n    }\n    this.pdfPage = pdfPage;\n    this.pdfPageRotate = pdfPage.rotate;\n\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = pdfPage.getViewport({\n      scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS,\n      rotation: totalRotation,\n    });\n    this.#setDimensions();\n    this.reset();\n  }\n\n  destroy() {\n    this.reset();\n    this.pdfPage?.cleanup();\n  }\n\n  hasEditableAnnotations() {\n    return !!this.annotationLayer?.hasEditableAnnotations();\n  }\n\n  get _textHighlighter() {\n    return shadow(\n      this,\n      \"_textHighlighter\",\n      new TextHighlighter({\n        pageIndex: this.id - 1,\n        eventBus: this.eventBus,\n        findController: this.#layerProperties.findController,\n      })\n    );\n  }\n\n  #dispatchLayerRendered(name, error) {\n    this.eventBus.dispatch(name, {\n      source: this,\n      pageNumber: this.id,\n      error,\n    });\n  }\n\n  async #renderAnnotationLayer() {\n    let error = null;\n    try {\n      await this.annotationLayer.render(\n        this.viewport,\n        { structTreeLayer: this.structTreeLayer },\n        \"display\"\n      );\n    } catch (ex) {\n      console.error(\"#renderAnnotationLayer:\", ex);\n      error = ex;\n    } finally {\n      this.#dispatchLayerRendered(\"annotationlayerrendered\", error);\n    }\n  }\n\n  async #renderAnnotationEditorLayer() {\n    let error = null;\n    try {\n      await this.annotationEditorLayer.render(this.viewport, \"display\");\n    } catch (ex) {\n      console.error(\"#renderAnnotationEditorLayer:\", ex);\n      error = ex;\n    } finally {\n      this.#dispatchLayerRendered(\"annotationeditorlayerrendered\", error);\n    }\n  }\n\n  async #renderDrawLayer() {\n    try {\n      await this.drawLayer.render(\"display\");\n    } catch (ex) {\n      console.error(\"#renderDrawLayer:\", ex);\n    }\n  }\n\n  async #renderXfaLayer() {\n    let error = null;\n    try {\n      const result = await this.xfaLayer.render(this.viewport, \"display\");\n      if (result?.textDivs && this._textHighlighter) {\n        // Given that the following method fetches the text asynchronously we\n        // can invoke it *before* appending the xfaLayer to the DOM (below),\n        // since a pending search-highlight/scroll operation thus won't run\n        // until after the xfaLayer is available in the viewer.\n        this.#buildXfaTextContentItems(result.textDivs);\n      }\n    } catch (ex) {\n      console.error(\"#renderXfaLayer:\", ex);\n      error = ex;\n    } finally {\n      if (this.xfaLayer?.div) {\n        // Pause translation when inserting the xfaLayer in the DOM.\n        this.l10n.pause();\n        this.#addLayer(this.xfaLayer.div, \"xfaLayer\");\n        this.l10n.resume();\n      }\n      this.#dispatchLayerRendered(\"xfalayerrendered\", error);\n    }\n  }\n\n  async #renderTextLayer() {\n    if (!this.textLayer) {\n      return;\n    }\n\n    let error = null;\n    try {\n      await this.textLayer.render(this.viewport);\n    } catch (ex) {\n      if (ex instanceof AbortException) {\n        return;\n      }\n      console.error(\"#renderTextLayer:\", ex);\n      error = ex;\n    }\n    this.#dispatchLayerRendered(\"textlayerrendered\", error);\n\n    this.#renderStructTreeLayer();\n  }\n\n  /**\n   * The structure tree is currently only supported when the text layer is\n   * enabled and a canvas is used for rendering.\n   *\n   * The structure tree must be generated after the text layer for the\n   * aria-owns to work.\n   */\n  async #renderStructTreeLayer() {\n    if (!this.textLayer) {\n      return;\n    }\n\n    const treeDom = await this.structTreeLayer?.render();\n    if (treeDom) {\n      this.l10n.pause();\n      this.structTreeLayer?.addElementsToTextLayer();\n      if (this.canvas && treeDom.parentNode !== this.canvas) {\n        // Pause translation when inserting the structTree in the DOM.\n        this.canvas.append(treeDom);\n      }\n      this.l10n.resume();\n    }\n    this.structTreeLayer?.show();\n  }\n\n  async #buildXfaTextContentItems(textDivs) {\n    const text = await this.pdfPage.getTextContent();\n    const items = [];\n    for (const item of text.items) {\n      items.push(item.str);\n    }\n    this._textHighlighter.setTextMapping(textDivs, items);\n    this._textHighlighter.enable();\n  }\n\n  #resetCanvas() {\n    const { canvas } = this;\n    if (!canvas) {\n      return;\n    }\n    canvas.remove();\n    canvas.width = canvas.height = 0;\n    this.canvas = null;\n    this.#originalViewport = null;\n  }\n\n  reset({\n    keepAnnotationLayer = false,\n    keepAnnotationEditorLayer = false,\n    keepXfaLayer = false,\n    keepTextLayer = false,\n    keepCanvasWrapper = false,\n  } = {}) {\n    this.cancelRendering({\n      keepAnnotationLayer,\n      keepAnnotationEditorLayer,\n      keepXfaLayer,\n      keepTextLayer,\n    });\n    this.renderingState = RenderingStates.INITIAL;\n\n    const div = this.div;\n\n    const childNodes = div.childNodes,\n      annotationLayerNode =\n        (keepAnnotationLayer && this.annotationLayer?.div) || null,\n      annotationEditorLayerNode =\n        (keepAnnotationEditorLayer && this.annotationEditorLayer?.div) || null,\n      xfaLayerNode = (keepXfaLayer && this.xfaLayer?.div) || null,\n      textLayerNode = (keepTextLayer && this.textLayer?.div) || null,\n      canvasWrapperNode = (keepCanvasWrapper && this.#canvasWrapper) || null;\n    for (let i = childNodes.length - 1; i >= 0; i--) {\n      const node = childNodes[i];\n      switch (node) {\n        case annotationLayerNode:\n        case annotationEditorLayerNode:\n        case xfaLayerNode:\n        case textLayerNode:\n        case canvasWrapperNode:\n          continue;\n      }\n      node.remove();\n      const layerIndex = this.#layers.indexOf(node);\n      if (layerIndex >= 0) {\n        this.#layers[layerIndex] = null;\n      }\n    }\n    div.removeAttribute(\"data-loaded\");\n\n    if (annotationLayerNode) {\n      // Hide the annotation layer until all elements are resized\n      // so they are not displayed on the already resized page.\n      this.annotationLayer.hide();\n    }\n    if (annotationEditorLayerNode) {\n      this.annotationEditorLayer.hide();\n    }\n    if (xfaLayerNode) {\n      // Hide the XFA layer until all elements are resized\n      // so they are not displayed on the already resized page.\n      this.xfaLayer.hide();\n    }\n    if (textLayerNode) {\n      this.textLayer.hide();\n    }\n    this.structTreeLayer?.hide();\n\n    if (!keepCanvasWrapper && this.#canvasWrapper) {\n      this.#canvasWrapper = null;\n      this.#resetCanvas();\n    }\n  }\n\n  toggleEditingMode(isEditing) {\n    if (!this.hasEditableAnnotations()) {\n      return;\n    }\n    this.#isEditing = isEditing;\n    this.reset({\n      keepAnnotationLayer: true,\n      keepAnnotationEditorLayer: true,\n      keepXfaLayer: true,\n      keepTextLayer: true,\n      keepCanvasWrapper: true,\n    });\n  }\n\n  /**\n   * @typedef {Object} PDFPageViewUpdateParameters\n   * @property {number} [scale] The new scale, if specified.\n   * @property {number} [rotation] The new rotation, if specified.\n   * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise]\n   *   A promise that is resolved with an {@link OptionalContentConfig}\n   *   instance. The default value is `null`.\n   * @property {number} [drawingDelay]\n   */\n\n  /**\n   * Update e.g. the scale and/or rotation of the page.\n   * @param {PDFPageViewUpdateParameters} params\n   */\n  update({\n    scale = 0,\n    rotation = null,\n    optionalContentConfigPromise = null,\n    drawingDelay = -1,\n  }) {\n    this.scale = scale || this.scale;\n    if (typeof rotation === \"number\") {\n      this.rotation = rotation; // The rotation may be zero.\n    }\n    if (optionalContentConfigPromise instanceof Promise) {\n      this._optionalContentConfigPromise = optionalContentConfigPromise;\n\n      // Ensure that the thumbnails always display the *initial* document state,\n      // for documents with optional content.\n      optionalContentConfigPromise.then(optionalContentConfig => {\n        if (\n          optionalContentConfigPromise !== this._optionalContentConfigPromise\n        ) {\n          return;\n        }\n        this.#useThumbnailCanvas.initialOptionalContent =\n          optionalContentConfig.hasInitialVisibility;\n      });\n    }\n    this.#useThumbnailCanvas.directDrawing = true;\n\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = this.viewport.clone({\n      scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS,\n      rotation: totalRotation,\n    });\n    this.#setDimensions();\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this._isStandalone\n    ) {\n      this._container?.style.setProperty(\"--scale-factor\", this.viewport.scale);\n    }\n\n    if (this.canvas) {\n      let onlyCssZoom = false;\n      if (this.#hasRestrictedScaling) {\n        if (\n          (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n          this.maxCanvasPixels === 0\n        ) {\n          onlyCssZoom = true;\n        } else if (this.maxCanvasPixels > 0) {\n          const { width, height } = this.viewport;\n          const { sx, sy } = this.outputScale;\n          onlyCssZoom =\n            ((Math.floor(width) * sx) | 0) * ((Math.floor(height) * sy) | 0) >\n            this.maxCanvasPixels;\n        }\n      }\n      const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000;\n\n      if (postponeDrawing || onlyCssZoom) {\n        if (\n          postponeDrawing &&\n          !onlyCssZoom &&\n          this.renderingState !== RenderingStates.FINISHED\n        ) {\n          this.cancelRendering({\n            keepAnnotationLayer: true,\n            keepAnnotationEditorLayer: true,\n            keepXfaLayer: true,\n            keepTextLayer: true,\n            cancelExtraDelay: drawingDelay,\n          });\n          // It isn't really finished, but once we have finished\n          // to postpone, we'll call this.reset(...) which will set\n          // the rendering state to INITIAL, hence the next call to\n          // PDFViewer.update() will trigger a redraw (if it's mandatory).\n          this.renderingState = RenderingStates.FINISHED;\n          // Ensure that the thumbnails won't become partially (or fully) blank,\n          // if the sidebar is opened before the actual rendering is done.\n          this.#useThumbnailCanvas.directDrawing = false;\n        }\n\n        this.cssTransform({\n          redrawAnnotationLayer: true,\n          redrawAnnotationEditorLayer: true,\n          redrawXfaLayer: true,\n          redrawTextLayer: !postponeDrawing,\n          hideTextLayer: postponeDrawing,\n        });\n\n        if (postponeDrawing) {\n          // The \"pagerendered\"-event will be dispatched once the actual\n          // rendering is done, hence don't dispatch it here as well.\n          return;\n        }\n        this.eventBus.dispatch(\"pagerendered\", {\n          source: this,\n          pageNumber: this.id,\n          cssTransform: true,\n          timestamp: performance.now(),\n          error: this.#renderError,\n        });\n        return;\n      }\n    }\n    this.cssTransform({});\n    this.reset({\n      keepAnnotationLayer: true,\n      keepAnnotationEditorLayer: true,\n      keepXfaLayer: true,\n      keepTextLayer: true,\n      keepCanvasWrapper: true,\n    });\n  }\n\n  /**\n   * PLEASE NOTE: Most likely you want to use the `this.reset()` method,\n   *              rather than calling this one directly.\n   */\n  cancelRendering({\n    keepAnnotationLayer = false,\n    keepAnnotationEditorLayer = false,\n    keepXfaLayer = false,\n    keepTextLayer = false,\n    cancelExtraDelay = 0,\n  } = {}) {\n    if (this.renderTask) {\n      this.renderTask.cancel(cancelExtraDelay);\n      this.renderTask = null;\n    }\n    this.resume = null;\n\n    if (this.textLayer && (!keepTextLayer || !this.textLayer.div)) {\n      this.textLayer.cancel();\n      this.textLayer = null;\n    }\n    if (\n      this.annotationLayer &&\n      (!keepAnnotationLayer || !this.annotationLayer.div)\n    ) {\n      this.annotationLayer.cancel();\n      this.annotationLayer = null;\n      this._annotationCanvasMap = null;\n    }\n    if (this.structTreeLayer && !this.textLayer) {\n      this.structTreeLayer = null;\n    }\n    if (\n      this.annotationEditorLayer &&\n      (!keepAnnotationEditorLayer || !this.annotationEditorLayer.div)\n    ) {\n      if (this.drawLayer) {\n        this.drawLayer.cancel();\n        this.drawLayer = null;\n      }\n      this.annotationEditorLayer.cancel();\n      this.annotationEditorLayer = null;\n    }\n    if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) {\n      this.xfaLayer.cancel();\n      this.xfaLayer = null;\n      this._textHighlighter?.disable();\n    }\n  }\n\n  cssTransform({\n    redrawAnnotationLayer = false,\n    redrawAnnotationEditorLayer = false,\n    redrawXfaLayer = false,\n    redrawTextLayer = false,\n    hideTextLayer = false,\n  }) {\n    const { canvas } = this;\n    if (!canvas) {\n      return;\n    }\n\n    const originalViewport = this.#originalViewport;\n    if (this.viewport !== originalViewport) {\n      // The canvas may have been originally rotated; rotate relative to that.\n      const relativeRotation =\n        (360 + this.viewport.rotation - originalViewport.rotation) % 360;\n      if (relativeRotation === 90 || relativeRotation === 270) {\n        const { width, height } = this.viewport;\n        // Scale x and y because of the rotation.\n        const scaleX = height / width;\n        const scaleY = width / height;\n        canvas.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX},${scaleY})`;\n      } else {\n        canvas.style.transform =\n          relativeRotation === 0 ? \"\" : `rotate(${relativeRotation}deg)`;\n      }\n    }\n\n    if (redrawAnnotationLayer && this.annotationLayer) {\n      this.#renderAnnotationLayer();\n    }\n    if (redrawAnnotationEditorLayer && this.annotationEditorLayer) {\n      if (this.drawLayer) {\n        this.#renderDrawLayer();\n      }\n      this.#renderAnnotationEditorLayer();\n    }\n    if (redrawXfaLayer && this.xfaLayer) {\n      this.#renderXfaLayer();\n    }\n\n    if (this.textLayer) {\n      if (hideTextLayer) {\n        this.textLayer.hide();\n        this.structTreeLayer?.hide();\n      } else if (redrawTextLayer) {\n        this.#renderTextLayer();\n      }\n    }\n  }\n\n  get width() {\n    return this.viewport.width;\n  }\n\n  get height() {\n    return this.viewport.height;\n  }\n\n  getPagePoint(x, y) {\n    return this.viewport.convertToPdfPoint(x, y);\n  }\n\n  async #finishRenderTask(renderTask, error = null) {\n    // The renderTask may have been replaced by a new one, so only remove\n    // the reference to the renderTask if it matches the one that is\n    // triggering this callback.\n    if (renderTask === this.renderTask) {\n      this.renderTask = null;\n    }\n\n    if (error instanceof RenderingCancelledException) {\n      this.#renderError = null;\n      return;\n    }\n    this.#renderError = error;\n\n    this.renderingState = RenderingStates.FINISHED;\n\n    // Ensure that the thumbnails won't become partially (or fully) blank,\n    // for documents that contain interactive form elements.\n    this.#useThumbnailCanvas.regularAnnotations = !renderTask.separateAnnots;\n\n    this.eventBus.dispatch(\"pagerendered\", {\n      source: this,\n      pageNumber: this.id,\n      cssTransform: false,\n      timestamp: performance.now(),\n      error: this.#renderError,\n    });\n\n    if (error) {\n      throw error;\n    }\n  }\n\n  async draw() {\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      console.error(\"Must be in new state before drawing\");\n      this.reset(); // Ensure that we reset all state to prevent issues.\n    }\n    const { div, l10n, pageColors, pdfPage, viewport } = this;\n\n    if (!pdfPage) {\n      this.renderingState = RenderingStates.FINISHED;\n      throw new Error(\"pdfPage is not loaded\");\n    }\n\n    this.renderingState = RenderingStates.RUNNING;\n\n    // Wrap the canvas so that if it has a CSS transform for high DPI the\n    // overflow will be hidden in Firefox.\n    let canvasWrapper = this.#canvasWrapper;\n    if (!canvasWrapper) {\n      canvasWrapper = this.#canvasWrapper = document.createElement(\"div\");\n      canvasWrapper.classList.add(\"canvasWrapper\");\n      this.#addLayer(canvasWrapper, \"canvasWrapper\");\n    }\n\n    if (\n      !this.textLayer &&\n      this.#textLayerMode !== TextLayerMode.DISABLE &&\n      !pdfPage.isPureXfa\n    ) {\n      this._accessibilityManager ||= new TextAccessibilityManager();\n\n      this.textLayer = new TextLayerBuilder({\n        pdfPage,\n        highlighter: this._textHighlighter,\n        accessibilityManager: this._accessibilityManager,\n        enablePermissions:\n          this.#textLayerMode === TextLayerMode.ENABLE_PERMISSIONS,\n        onAppend: textLayerDiv => {\n          // Pause translation when inserting the textLayer in the DOM.\n          this.l10n.pause();\n          this.#addLayer(textLayerDiv, \"textLayer\");\n          this.l10n.resume();\n        },\n      });\n    }\n\n    if (\n      !this.annotationLayer &&\n      this.#annotationMode !== AnnotationMode.DISABLE\n    ) {\n      const {\n        annotationStorage,\n        annotationEditorUIManager,\n        downloadManager,\n        enableScripting,\n        fieldObjectsPromise,\n        hasJSActionsPromise,\n        linkService,\n      } = this.#layerProperties;\n\n      this._annotationCanvasMap ||= new Map();\n      this.annotationLayer = new AnnotationLayerBuilder({\n        pdfPage,\n        annotationStorage,\n        imageResourcesPath: this.imageResourcesPath,\n        renderForms: this.#annotationMode === AnnotationMode.ENABLE_FORMS,\n        linkService,\n        downloadManager,\n        enableScripting,\n        hasJSActionsPromise,\n        fieldObjectsPromise,\n        annotationCanvasMap: this._annotationCanvasMap,\n        accessibilityManager: this._accessibilityManager,\n        annotationEditorUIManager,\n        onAppend: annotationLayerDiv => {\n          this.#addLayer(annotationLayerDiv, \"annotationLayer\");\n        },\n      });\n    }\n\n    const renderContinueCallback = cont => {\n      showCanvas?.(false);\n      if (this.renderingQueue && !this.renderingQueue.isHighestPriority(this)) {\n        this.renderingState = RenderingStates.PAUSED;\n        this.resume = () => {\n          this.renderingState = RenderingStates.RUNNING;\n          cont();\n        };\n        return;\n      }\n      cont();\n    };\n\n    const { width, height } = viewport;\n    const canvas = document.createElement(\"canvas\");\n    canvas.setAttribute(\"role\", \"presentation\");\n\n    const hasHCM = !!(pageColors?.background && pageColors?.foreground);\n    const prevCanvas = this.canvas;\n\n    // In HCM, a final filter is applied on the canvas which means that\n    // before it's applied we've normal colors. Consequently, to avoid to\n    // have a final flash we just display it once all the drawing is done.\n    const updateOnFirstShow = !prevCanvas && !hasHCM;\n    this.canvas = canvas;\n    this.#originalViewport = viewport;\n\n    let showCanvas = isLastShow => {\n      if (updateOnFirstShow) {\n        // Don't add the canvas until the first draw callback, or until\n        // drawing is complete when `!this.renderingQueue`, to prevent black\n        // flickering.\n        // In whatever case, the canvas must be the first child.\n        canvasWrapper.prepend(canvas);\n        showCanvas = null;\n        return;\n      }\n      if (!isLastShow) {\n        return;\n      }\n\n      if (prevCanvas) {\n        prevCanvas.replaceWith(canvas);\n        prevCanvas.width = prevCanvas.height = 0;\n      } else {\n        canvasWrapper.prepend(canvas);\n      }\n\n      showCanvas = null;\n    };\n\n    const ctx = canvas.getContext(\"2d\", {\n      alpha: false,\n      willReadFrequently: !this.#enableHWA,\n    });\n    const outputScale = (this.outputScale = new OutputScale());\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this.maxCanvasPixels === 0\n    ) {\n      const invScale = 1 / this.scale;\n      // Use a scale that makes the canvas have the originally intended size\n      // of the page.\n      outputScale.sx *= invScale;\n      outputScale.sy *= invScale;\n      this.#hasRestrictedScaling = true;\n    } else if (this.maxCanvasPixels > 0) {\n      const pixelsInViewport = width * height;\n      const maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport);\n      if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\n        outputScale.sx = maxScale;\n        outputScale.sy = maxScale;\n        this.#hasRestrictedScaling = true;\n      } else {\n        this.#hasRestrictedScaling = false;\n      }\n    }\n    const sfx = approximateFraction(outputScale.sx);\n    const sfy = approximateFraction(outputScale.sy);\n\n    const canvasWidth = (canvas.width = floorToDivide(\n      calcRound(width * outputScale.sx),\n      sfx[0]\n    ));\n    const canvasHeight = (canvas.height = floorToDivide(\n      calcRound(height * outputScale.sy),\n      sfy[0]\n    ));\n    const pageWidth = floorToDivide(calcRound(width), sfx[1]);\n    const pageHeight = floorToDivide(calcRound(height), sfy[1]);\n    outputScale.sx = canvasWidth / pageWidth;\n    outputScale.sy = canvasHeight / pageHeight;\n\n    if (this.#scaleRoundX !== sfx[1]) {\n      div.style.setProperty(\"--scale-round-x\", `${sfx[1]}px`);\n      this.#scaleRoundX = sfx[1];\n    }\n    if (this.#scaleRoundY !== sfy[1]) {\n      div.style.setProperty(\"--scale-round-y\", `${sfy[1]}px`);\n      this.#scaleRoundY = sfy[1];\n    }\n\n    // Rendering area\n    const transform = outputScale.scaled\n      ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0]\n      : null;\n    const renderContext = {\n      canvasContext: ctx,\n      transform,\n      viewport,\n      annotationMode: this.#annotationMode,\n      optionalContentConfigPromise: this._optionalContentConfigPromise,\n      annotationCanvasMap: this._annotationCanvasMap,\n      pageColors,\n      isEditing: this.#isEditing,\n    };\n    const renderTask = (this.renderTask = pdfPage.render(renderContext));\n    renderTask.onContinue = renderContinueCallback;\n\n    const resultPromise = renderTask.promise.then(\n      async () => {\n        showCanvas?.(true);\n        await this.#finishRenderTask(renderTask);\n\n        this.structTreeLayer ||= new StructTreeLayerBuilder(\n          pdfPage,\n          viewport.rawDims\n        );\n\n        this.#renderTextLayer();\n\n        if (this.annotationLayer) {\n          await this.#renderAnnotationLayer();\n        }\n\n        const { annotationEditorUIManager } = this.#layerProperties;\n\n        if (!annotationEditorUIManager) {\n          return;\n        }\n        this.drawLayer ||= new DrawLayerBuilder({\n          pageIndex: this.id,\n        });\n        await this.#renderDrawLayer();\n        this.drawLayer.setParent(canvasWrapper);\n\n        this.annotationEditorLayer ||= new AnnotationEditorLayerBuilder({\n          uiManager: annotationEditorUIManager,\n          pdfPage,\n          l10n,\n          structTreeLayer: this.structTreeLayer,\n          accessibilityManager: this._accessibilityManager,\n          annotationLayer: this.annotationLayer?.annotationLayer,\n          textLayer: this.textLayer,\n          drawLayer: this.drawLayer.getDrawLayer(),\n          onAppend: annotationEditorLayerDiv => {\n            this.#addLayer(annotationEditorLayerDiv, \"annotationEditorLayer\");\n          },\n        });\n        this.#renderAnnotationEditorLayer();\n      },\n      error => {\n        // When zooming with a `drawingDelay` set, avoid temporarily showing\n        // a black canvas if rendering was cancelled before the `onContinue`-\n        // callback had been invoked at least once.\n        if (!(error instanceof RenderingCancelledException)) {\n          showCanvas?.(true);\n        } else {\n          prevCanvas?.remove();\n          this.#resetCanvas();\n        }\n        return this.#finishRenderTask(renderTask, error);\n      }\n    );\n\n    if (pdfPage.isPureXfa) {\n      if (!this.xfaLayer) {\n        const { annotationStorage, linkService } = this.#layerProperties;\n\n        this.xfaLayer = new XfaLayerBuilder({\n          pdfPage,\n          annotationStorage,\n          linkService,\n        });\n      }\n      this.#renderXfaLayer();\n    }\n\n    div.setAttribute(\"data-loaded\", true);\n\n    this.eventBus.dispatch(\"pagerender\", {\n      source: this,\n      pageNumber: this.id,\n    });\n    return resultPromise;\n  }\n\n  /**\n   * @param {string|null} label\n   */\n  setPageLabel(label) {\n    this.pageLabel = typeof label === \"string\" ? label : null;\n\n    this.div.setAttribute(\n      \"data-l10n-args\",\n      JSON.stringify({ page: this.pageLabel ?? this.id })\n    );\n\n    if (this.pageLabel !== null) {\n      this.div.setAttribute(\"data-page-label\", this.pageLabel);\n    } else {\n      this.div.removeAttribute(\"data-page-label\");\n    }\n  }\n\n  /**\n   * For use by the `PDFThumbnailView.setImage`-method.\n   * @ignore\n   */\n  get thumbnailCanvas() {\n    const { directDrawing, initialOptionalContent, regularAnnotations } =\n      this.#useThumbnailCanvas;\n    return directDrawing && initialOptionalContent && regularAnnotations\n      ? this.canvas\n      : null;\n  }\n}\n\nexport { PDFPageView };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getPdfFilenameFromUrl } from \"pdfjs-lib\";\n\nasync function docProperties(pdfDocument) {\n  const url = \"\",\n    baseUrl = url.split(\"#\", 1)[0];\n  // eslint-disable-next-line prefer-const\n  let { info, metadata, contentDispositionFilename, contentLength } =\n    await pdfDocument.getMetadata();\n\n  if (!contentLength) {\n    const { length } = await pdfDocument.getDownloadInfo();\n    contentLength = length;\n  }\n\n  return {\n    ...info,\n    baseURL: baseUrl,\n    filesize: contentLength,\n    filename: contentDispositionFilename || getPdfFilenameFromUrl(url),\n    metadata: metadata?.getRaw(),\n    authors: metadata?.get(\"dc:creator\"),\n    numPages: pdfDocument.numPages,\n    URL: url,\n  };\n}\n\nclass GenericScripting {\n  constructor(sandboxBundleSrc) {\n    this._ready = new Promise((resolve, reject) => {\n      const sandbox =\n        typeof PDFJSDev === \"undefined\"\n          ? import(sandboxBundleSrc) // eslint-disable-line no-unsanitized/method\n          : __non_webpack_import__(sandboxBundleSrc);\n      sandbox\n        .then(pdfjsSandbox => {\n          resolve(pdfjsSandbox.QuickJSSandbox());\n        })\n        .catch(reject);\n    });\n  }\n\n  async createSandbox(data) {\n    const sandbox = await this._ready;\n    sandbox.create(data);\n  }\n\n  async dispatchEventInSandbox(event) {\n    const sandbox = await this._ready;\n    setTimeout(() => sandbox.dispatchEvent(event), 0);\n  }\n\n  async destroySandbox() {\n    const sandbox = await this._ready;\n    sandbox.nukeSandbox();\n  }\n}\n\nexport { docProperties, GenericScripting };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n\nimport { apiPageLayoutToViewerModes, RenderingStates } from \"./ui_utils.js\";\nimport { shadow } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} PDFScriptingManagerOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {string} [sandboxBundleSrc] - The path and filename of the\n *   scripting bundle.\n * @property {Object} [externalServices] - The factory that is used when\n *   initializing scripting; must contain a `createScripting` method.\n *   PLEASE NOTE: Primarily intended for the default viewer use-case.\n * @property {function} [docProperties] - The function that is used to lookup\n *   the necessary document properties.\n */\n\nclass PDFScriptingManager {\n  #closeCapability = null;\n\n  #destroyCapability = null;\n\n  #docProperties = null;\n\n  #eventAbortController = null;\n\n  #eventBus = null;\n\n  #externalServices = null;\n\n  #pdfDocument = null;\n\n  #pdfViewer = null;\n\n  #ready = false;\n\n  #scripting = null;\n\n  #willPrintCapability = null;\n\n  /**\n   * @param {PDFScriptingManagerOptions} options\n   */\n  constructor({ eventBus, externalServices = null, docProperties = null }) {\n    this.#eventBus = eventBus;\n    this.#externalServices = externalServices;\n    this.#docProperties = docProperties;\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      Object.defineProperty(this, \"sandboxTrip\", {\n        value: () =>\n          setTimeout(\n            () =>\n              this.#scripting?.dispatchEventInSandbox({\n                name: \"sandboxtripbegin\",\n              }),\n            0\n          ),\n      });\n    }\n  }\n\n  setViewer(pdfViewer) {\n    this.#pdfViewer = pdfViewer;\n  }\n\n  async setDocument(pdfDocument) {\n    if (this.#pdfDocument) {\n      await this.#destroyScripting();\n    }\n    this.#pdfDocument = pdfDocument;\n\n    if (!pdfDocument) {\n      return;\n    }\n    const [objects, calculationOrder, docActions] = await Promise.all([\n      pdfDocument.getFieldObjects(),\n      pdfDocument.getCalculationOrderIds(),\n      pdfDocument.getJSActions(),\n    ]);\n\n    if (!objects && !docActions) {\n      // No FieldObjects or JavaScript actions were found in the document.\n      await this.#destroyScripting();\n      return;\n    }\n    if (pdfDocument !== this.#pdfDocument) {\n      return; // The document was closed while the data resolved.\n    }\n    try {\n      this.#scripting = this.#initScripting();\n    } catch (error) {\n      console.error(\"setDocument:\", error);\n\n      await this.#destroyScripting();\n      return;\n    }\n    const eventBus = this.#eventBus;\n\n    this.#eventAbortController = new AbortController();\n    const { signal } = this.#eventAbortController;\n\n    eventBus._on(\n      \"updatefromsandbox\",\n      event => {\n        if (event?.source === window) {\n          this.#updateFromSandbox(event.detail);\n        }\n      },\n      { signal }\n    );\n    eventBus._on(\n      \"dispatcheventinsandbox\",\n      event => {\n        this.#scripting?.dispatchEventInSandbox(event.detail);\n      },\n      { signal }\n    );\n\n    eventBus._on(\n      \"pagechanging\",\n      ({ pageNumber, previous }) => {\n        if (pageNumber === previous) {\n          return; // The current page didn't change.\n        }\n        this.#dispatchPageClose(previous);\n        this.#dispatchPageOpen(pageNumber);\n      },\n      { signal }\n    );\n    eventBus._on(\n      \"pagerendered\",\n      ({ pageNumber }) => {\n        if (!this._pageOpenPending.has(pageNumber)) {\n          return; // No pending \"PageOpen\" event for the newly rendered page.\n        }\n        if (pageNumber !== this.#pdfViewer.currentPageNumber) {\n          return; // The newly rendered page is no longer the current one.\n        }\n        this.#dispatchPageOpen(pageNumber);\n      },\n      { signal }\n    );\n    eventBus._on(\n      \"pagesdestroy\",\n      async () => {\n        await this.#dispatchPageClose(this.#pdfViewer.currentPageNumber);\n\n        await this.#scripting?.dispatchEventInSandbox({\n          id: \"doc\",\n          name: \"WillClose\",\n        });\n\n        this.#closeCapability?.resolve();\n      },\n      { signal }\n    );\n\n    try {\n      const docProperties = await this.#docProperties(pdfDocument);\n      if (pdfDocument !== this.#pdfDocument) {\n        return; // The document was closed while the properties resolved.\n      }\n\n      await this.#scripting.createSandbox({\n        objects,\n        calculationOrder,\n        appInfo: {\n          platform: navigator.platform,\n          language: navigator.language,\n        },\n        docInfo: {\n          ...docProperties,\n          actions: docActions,\n        },\n      });\n\n      eventBus.dispatch(\"sandboxcreated\", { source: this });\n    } catch (error) {\n      console.error(\"setDocument:\", error);\n\n      await this.#destroyScripting();\n      return;\n    }\n\n    await this.#scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"Open\",\n    });\n    await this.#dispatchPageOpen(\n      this.#pdfViewer.currentPageNumber,\n      /* initialize = */ true\n    );\n\n    // Defer this slightly, to ensure that scripting is *fully* initialized.\n    Promise.resolve().then(() => {\n      if (pdfDocument === this.#pdfDocument) {\n        this.#ready = true;\n      }\n    });\n  }\n\n  async dispatchWillSave() {\n    return this.#scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"WillSave\",\n    });\n  }\n\n  async dispatchDidSave() {\n    return this.#scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"DidSave\",\n    });\n  }\n\n  async dispatchWillPrint() {\n    if (!this.#scripting) {\n      return;\n    }\n    await this.#willPrintCapability?.promise;\n    this.#willPrintCapability = Promise.withResolvers();\n    try {\n      await this.#scripting.dispatchEventInSandbox({\n        id: \"doc\",\n        name: \"WillPrint\",\n      });\n    } catch (ex) {\n      this.#willPrintCapability.resolve();\n      this.#willPrintCapability = null;\n      throw ex;\n    }\n\n    await this.#willPrintCapability.promise;\n  }\n\n  async dispatchDidPrint() {\n    return this.#scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"DidPrint\",\n    });\n  }\n\n  get destroyPromise() {\n    return this.#destroyCapability?.promise || null;\n  }\n\n  get ready() {\n    return this.#ready;\n  }\n\n  /**\n   * @private\n   */\n  get _pageOpenPending() {\n    return shadow(this, \"_pageOpenPending\", new Set());\n  }\n\n  /**\n   * @private\n   */\n  get _visitedPages() {\n    return shadow(this, \"_visitedPages\", new Map());\n  }\n\n  async #updateFromSandbox(detail) {\n    const pdfViewer = this.#pdfViewer;\n    // Ignore some events, see below, that don't make sense in PresentationMode.\n    const isInPresentationMode =\n      pdfViewer.isInPresentationMode || pdfViewer.isChangingPresentationMode;\n\n    const { id, siblings, command, value } = detail;\n    if (!id) {\n      if (\n        typeof PDFJSDev !== \"undefined\" &&\n        PDFJSDev.test(\"TESTING\") &&\n        command === \"sandboxTripEnd\"\n      ) {\n        window.setTimeout(() => {\n          window.dispatchEvent(new CustomEvent(\"sandboxtripend\"));\n        }, 0);\n        return;\n      }\n\n      switch (command) {\n        case \"clear\":\n          console.clear();\n          break;\n        case \"error\":\n          console.error(value);\n          break;\n        case \"layout\":\n          if (!isInPresentationMode) {\n            const modes = apiPageLayoutToViewerModes(value);\n            pdfViewer.spreadMode = modes.spreadMode;\n          }\n          break;\n        case \"page-num\":\n          pdfViewer.currentPageNumber = value + 1;\n          break;\n        case \"print\":\n          await pdfViewer.pagesPromise;\n          this.#eventBus.dispatch(\"print\", { source: this });\n          break;\n        case \"println\":\n          console.log(value);\n          break;\n        case \"zoom\":\n          if (!isInPresentationMode) {\n            pdfViewer.currentScaleValue = value;\n          }\n          break;\n        case \"SaveAs\":\n          this.#eventBus.dispatch(\"download\", { source: this });\n          break;\n        case \"FirstPage\":\n          pdfViewer.currentPageNumber = 1;\n          break;\n        case \"LastPage\":\n          pdfViewer.currentPageNumber = pdfViewer.pagesCount;\n          break;\n        case \"NextPage\":\n          pdfViewer.nextPage();\n          break;\n        case \"PrevPage\":\n          pdfViewer.previousPage();\n          break;\n        case \"ZoomViewIn\":\n          if (!isInPresentationMode) {\n            pdfViewer.increaseScale();\n          }\n          break;\n        case \"ZoomViewOut\":\n          if (!isInPresentationMode) {\n            pdfViewer.decreaseScale();\n          }\n          break;\n        case \"WillPrintFinished\":\n          this.#willPrintCapability?.resolve();\n          this.#willPrintCapability = null;\n          break;\n      }\n      return;\n    }\n\n    if (isInPresentationMode && detail.focus) {\n      return;\n    }\n    delete detail.id;\n    delete detail.siblings;\n\n    const ids = siblings ? [id, ...siblings] : [id];\n    for (const elementId of ids) {\n      const element = document.querySelector(\n        `[data-element-id=\"${elementId}\"]`\n      );\n      if (element) {\n        element.dispatchEvent(new CustomEvent(\"updatefromsandbox\", { detail }));\n      } else {\n        // The element hasn't been rendered yet, use the AnnotationStorage.\n        this.#pdfDocument?.annotationStorage.setValue(elementId, detail);\n      }\n    }\n  }\n\n  async #dispatchPageOpen(pageNumber, initialize = false) {\n    const pdfDocument = this.#pdfDocument,\n      visitedPages = this._visitedPages;\n\n    if (initialize) {\n      this.#closeCapability = Promise.withResolvers();\n    }\n    if (!this.#closeCapability) {\n      return; // Scripting isn't fully initialized yet.\n    }\n    const pageView = this.#pdfViewer.getPageView(/* index = */ pageNumber - 1);\n\n    if (pageView?.renderingState !== RenderingStates.FINISHED) {\n      this._pageOpenPending.add(pageNumber);\n      return; // Wait for the page to finish rendering.\n    }\n    this._pageOpenPending.delete(pageNumber);\n\n    const actionsPromise = (async () => {\n      // Avoid sending, and thus serializing, the `actions` data more than once.\n      const actions = await (!visitedPages.has(pageNumber)\n        ? pageView.pdfPage?.getJSActions()\n        : null);\n      if (pdfDocument !== this.#pdfDocument) {\n        return; // The document was closed while the actions resolved.\n      }\n\n      await this.#scripting?.dispatchEventInSandbox({\n        id: \"page\",\n        name: \"PageOpen\",\n        pageNumber,\n        actions,\n      });\n    })();\n    visitedPages.set(pageNumber, actionsPromise);\n  }\n\n  async #dispatchPageClose(pageNumber) {\n    const pdfDocument = this.#pdfDocument,\n      visitedPages = this._visitedPages;\n\n    if (!this.#closeCapability) {\n      return; // Scripting isn't fully initialized yet.\n    }\n    if (this._pageOpenPending.has(pageNumber)) {\n      return; // The page is still rendering; no \"PageOpen\" event dispatched.\n    }\n    const actionsPromise = visitedPages.get(pageNumber);\n    if (!actionsPromise) {\n      return; // The \"PageClose\" event must be preceded by a \"PageOpen\" event.\n    }\n    visitedPages.set(pageNumber, null);\n\n    // Ensure that the \"PageOpen\" event is dispatched first.\n    await actionsPromise;\n    if (pdfDocument !== this.#pdfDocument) {\n      return; // The document was closed while the actions resolved.\n    }\n\n    await this.#scripting?.dispatchEventInSandbox({\n      id: \"page\",\n      name: \"PageClose\",\n      pageNumber,\n    });\n  }\n\n  #initScripting() {\n    this.#destroyCapability = Promise.withResolvers();\n\n    if (this.#scripting) {\n      throw new Error(\"#initScripting: Scripting already exists.\");\n    }\n    return this.#externalServices.createScripting();\n  }\n\n  async #destroyScripting() {\n    if (!this.#scripting) {\n      this.#pdfDocument = null;\n\n      this.#destroyCapability?.resolve();\n      return;\n    }\n    if (this.#closeCapability) {\n      await Promise.race([\n        this.#closeCapability.promise,\n        new Promise(resolve => {\n          // Avoid the scripting/sandbox-destruction hanging indefinitely.\n          setTimeout(resolve, 1000);\n        }),\n      ]).catch(() => {\n        // Ignore any errors, to ensure that the sandbox is always destroyed.\n      });\n      this.#closeCapability = null;\n    }\n    this.#pdfDocument = null;\n\n    try {\n      await this.#scripting.destroySandbox();\n    } catch {}\n\n    this.#willPrintCapability?.reject(new Error(\"Scripting destroyed.\"));\n    this.#willPrintCapability = null;\n\n    this.#eventAbortController?.abort();\n    this.#eventAbortController = null;\n\n    this._pageOpenPending.clear();\n    this._visitedPages.clear();\n\n    this.#scripting = null;\n    this.#ready = false;\n\n    this.#destroyCapability?.resolve();\n  }\n}\n\nexport { PDFScriptingManager };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { docProperties, GenericScripting } from \"./generic_scripting.js\";\nimport { PDFScriptingManager } from \"./pdf_scripting_manager.js\";\n\nclass PDFScriptingManagerComponents extends PDFScriptingManager {\n  constructor(options) {\n    // The default viewer already handles adding/removing of DOM events,\n    // hence limit this to only the viewer components.\n    if (!options.externalServices) {\n      window.addEventListener(\"updatefromsandbox\", event => {\n        options.eventBus.dispatch(\"updatefromsandbox\", {\n          source: window,\n          detail: event.detail,\n        });\n      });\n    }\n\n    options.externalServices ||= {\n      createScripting: () => new GenericScripting(options.sandboxBundleSrc),\n    };\n    options.docProperties ||= pdfDocument => docProperties(pdfDocument);\n    super(options);\n  }\n}\n\nexport { PDFScriptingManagerComponents as PDFScriptingManager };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces\").IRenderableView} IRenderableView */\n/** @typedef {import(\"./pdf_viewer\").PDFViewer} PDFViewer */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_thumbnail_viewer\").PDFThumbnailViewer} PDFThumbnailViewer */\n\nimport { RenderingCancelledException } from \"pdfjs-lib\";\nimport { RenderingStates } from \"./ui_utils.js\";\n\nconst CLEANUP_TIMEOUT = 30000;\n\n/**\n * Controls rendering of the views for pages and thumbnails.\n */\nclass PDFRenderingQueue {\n  constructor() {\n    this.pdfViewer = null;\n    this.pdfThumbnailViewer = null;\n    this.onIdle = null;\n    this.highestPriorityPage = null;\n    /** @type {number} */\n    this.idleTimeout = null;\n    this.printing = false;\n    this.isThumbnailViewEnabled = false;\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      Object.defineProperty(this, \"hasViewer\", {\n        value: () => !!this.pdfViewer,\n      });\n    }\n  }\n\n  /**\n   * @param {PDFViewer} pdfViewer\n   */\n  setViewer(pdfViewer) {\n    this.pdfViewer = pdfViewer;\n  }\n\n  /**\n   * @param {PDFThumbnailViewer} pdfThumbnailViewer\n   */\n  setThumbnailViewer(pdfThumbnailViewer) {\n    this.pdfThumbnailViewer = pdfThumbnailViewer;\n  }\n\n  /**\n   * @param {IRenderableView} view\n   * @returns {boolean}\n   */\n  isHighestPriority(view) {\n    return this.highestPriorityPage === view.renderingId;\n  }\n\n  /**\n   * @param {Object} currentlyVisiblePages\n   */\n  renderHighestPriority(currentlyVisiblePages) {\n    if (this.idleTimeout) {\n      clearTimeout(this.idleTimeout);\n      this.idleTimeout = null;\n    }\n\n    // Pages have a higher priority than thumbnails, so check them first.\n    if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {\n      return;\n    }\n    // No pages needed rendering, so check thumbnails.\n    if (\n      this.isThumbnailViewEnabled &&\n      this.pdfThumbnailViewer?.forceRendering()\n    ) {\n      return;\n    }\n\n    if (this.printing) {\n      // If printing is currently ongoing do not reschedule cleanup.\n      return;\n    }\n\n    if (this.onIdle) {\n      this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\n    }\n  }\n\n  /**\n   * @param {Object} visible\n   * @param {Array} views\n   * @param {boolean} scrolledDown\n   * @param {boolean} [preRenderExtra]\n   */\n  getHighestPriority(visible, views, scrolledDown, preRenderExtra = false) {\n    /**\n     * The state has changed. Figure out which page has the highest priority to\n     * render next (if any).\n     *\n     * Priority:\n     * 1. visible pages\n     * 2. if last scrolled down, the page after the visible pages, or\n     *    if last scrolled up, the page before the visible pages\n     */\n    const visibleViews = visible.views,\n      numVisible = visibleViews.length;\n\n    if (numVisible === 0) {\n      return null;\n    }\n    for (let i = 0; i < numVisible; i++) {\n      const view = visibleViews[i].view;\n      if (!this.isViewFinished(view)) {\n        return view;\n      }\n    }\n    const firstId = visible.first.id,\n      lastId = visible.last.id;\n\n    // All the visible views have rendered; try to handle any \"holes\" in the\n    // page layout (can happen e.g. with spreadModes at higher zoom levels).\n    if (lastId - firstId + 1 > numVisible) {\n      const visibleIds = visible.ids;\n      for (let i = 1, ii = lastId - firstId; i < ii; i++) {\n        const holeId = scrolledDown ? firstId + i : lastId - i;\n        if (visibleIds.has(holeId)) {\n          continue;\n        }\n        const holeView = views[holeId - 1];\n        if (!this.isViewFinished(holeView)) {\n          return holeView;\n        }\n      }\n    }\n\n    // All the visible views have rendered; try to render next/previous page.\n    // (IDs start at 1, so no need to add 1 when `scrolledDown === true`.)\n    let preRenderIndex = scrolledDown ? lastId : firstId - 2;\n    let preRenderView = views[preRenderIndex];\n\n    if (preRenderView && !this.isViewFinished(preRenderView)) {\n      return preRenderView;\n    }\n    if (preRenderExtra) {\n      preRenderIndex += scrolledDown ? 1 : -1;\n      preRenderView = views[preRenderIndex];\n\n      if (preRenderView && !this.isViewFinished(preRenderView)) {\n        return preRenderView;\n      }\n    }\n    // Everything that needs to be rendered has been.\n    return null;\n  }\n\n  /**\n   * @param {IRenderableView} view\n   * @returns {boolean}\n   */\n  isViewFinished(view) {\n    return view.renderingState === RenderingStates.FINISHED;\n  }\n\n  /**\n   * Render a page or thumbnail view. This calls the appropriate function\n   * based on the views state. If the view is already rendered it will return\n   * `false`.\n   *\n   * @param {IRenderableView} view\n   */\n  renderView(view) {\n    switch (view.renderingState) {\n      case RenderingStates.FINISHED:\n        return false;\n      case RenderingStates.PAUSED:\n        this.highestPriorityPage = view.renderingId;\n        view.resume();\n        break;\n      case RenderingStates.RUNNING:\n        this.highestPriorityPage = view.renderingId;\n        break;\n      case RenderingStates.INITIAL:\n        this.highestPriorityPage = view.renderingId;\n        view\n          .draw()\n          .finally(() => {\n            this.renderHighestPriority();\n          })\n          .catch(reason => {\n            if (reason instanceof RenderingCancelledException) {\n              return;\n            }\n            console.error(\"renderView:\", reason);\n          });\n        break;\n    }\n    return true;\n  }\n}\n\nexport { PDFRenderingQueue };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFDocumentProxy} PDFDocumentProxy */\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/display_utils\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/optional_content_config\").OptionalContentConfig} OptionalContentConfig */\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n/** @typedef {import(\"./interfaces\").IDownloadManager} IDownloadManager */\n/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n/** @typedef {import(\"./interfaces\").IPDFLinkService} IPDFLinkService */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_find_controller\").PDFFindController} PDFFindController */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_scripting_manager\").PDFScriptingManager} PDFScriptingManager */\n\nimport {\n  AnnotationEditorType,\n  AnnotationEditorUIManager,\n  AnnotationMode,\n  PermissionFlag,\n  PixelsPerInch,\n  shadow,\n  stopEvent,\n  version,\n} from \"pdfjs-lib\";\nimport {\n  DEFAULT_SCALE,\n  DEFAULT_SCALE_DELTA,\n  DEFAULT_SCALE_VALUE,\n  docStyle,\n  getVisibleElements,\n  isPortraitOrientation,\n  isValidRotation,\n  isValidScrollMode,\n  isValidSpreadMode,\n  MAX_AUTO_SCALE,\n  MAX_SCALE,\n  MIN_SCALE,\n  PresentationModeState,\n  removeNullCharacters,\n  RenderingStates,\n  SCROLLBAR_PADDING,\n  scrollIntoView,\n  ScrollMode,\n  SpreadMode,\n  TextLayerMode,\n  UNKNOWN_SCALE,\n  VERTICAL_PADDING,\n  watchScroll,\n} from \"./ui_utils.js\";\nimport { GenericL10n } from \"web-null_l10n\";\nimport { PDFPageView } from \"./pdf_page_view.js\";\nimport { PDFRenderingQueue } from \"./pdf_rendering_queue.js\";\nimport { SimpleLinkService } from \"./pdf_link_service.js\";\n\nconst DEFAULT_CACHE_SIZE = 10;\n\nconst PagesCountLimit = {\n  FORCE_SCROLL_MODE_PAGE: 10000,\n  FORCE_LAZY_PAGE_INIT: 5000,\n  PAUSE_EAGER_PAGE_INIT: 250,\n};\n\nfunction isValidAnnotationEditorMode(mode) {\n  return (\n    Object.values(AnnotationEditorType).includes(mode) &&\n    mode !== AnnotationEditorType.DISABLE\n  );\n}\n\n/**\n * @typedef {Object} PDFViewerOptions\n * @property {HTMLDivElement} container - The container for the viewer element.\n * @property {HTMLDivElement} [viewer] - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {IPDFLinkService} [linkService] - The navigation/linking service.\n * @property {IDownloadManager} [downloadManager] - The download manager\n *   component.\n * @property {PDFFindController} [findController] - The find controller\n *   component.\n * @property {PDFScriptingManager} [scriptingManager] - The scripting manager\n *   component.\n * @property {PDFRenderingQueue} [renderingQueue] - The rendering queue object.\n * @property {boolean} [removePageBorders] - Removes the border shadow around\n *   the pages. The default value is `false`.\n * @property {number} [textLayerMode] - Controls if the text layer used for\n *   selection and searching is created. The constants from {TextLayerMode}\n *   should be used. The default value is `TextLayerMode.ENABLE`.\n * @property {number} [annotationMode] - Controls if the annotation layer is\n *   created, and if interactive form elements or `AnnotationStorage`-data are\n *   being rendered. The constants from {@link AnnotationMode} should be used;\n *   see also {@link RenderParameters} and {@link GetOperatorListParameters}.\n *   The default value is `AnnotationMode.ENABLE_FORMS`.\n * @property {number} [annotationEditorMode] - Enables the creation and editing\n *   of new Annotations. The constants from {@link AnnotationEditorType} should\n *   be used. The default value is `AnnotationEditorType.NONE`.\n * @property {string} [annotationEditorHighlightColors] - A comma separated list\n *   of colors to propose to highlight some text in the pdf.\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   mainly for annotation icons. Include trailing slash.\n * @property {boolean} [enablePrintAutoRotate] - Enables automatic rotation of\n *   landscape pages upon printing. The default is `false`.\n * @property {number} [maxCanvasPixels] - The maximum supported canvas size in\n *   total pixels, i.e. width * height. Use `-1` for no limit, or `0` for\n *   CSS-only zooming. The default value is 4096 * 8192 (32 mega-pixels).\n * @property {IL10n} [l10n] - Localization service.\n * @property {boolean} [enablePermissions] - Enables PDF document permissions,\n *   when they exist. The default value is `false`.\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n *   with user defined ones in order to improve readability in high contrast\n *   mode.\n * @property {boolean} [enableHWA] - Enables hardware acceleration for\n *   rendering. The default value is `false`.\n * @property {boolean} [supportsPinchToZoom] - Enable zooming on pinch gesture.\n *   The default value is `true`.\n */\n\nclass PDFPageViewBuffer {\n  // Here we rely on the fact that `Set`s preserve the insertion order.\n  #buf = new Set();\n\n  #size = 0;\n\n  constructor(size) {\n    this.#size = size;\n  }\n\n  push(view) {\n    const buf = this.#buf;\n    if (buf.has(view)) {\n      buf.delete(view); // Move the view to the \"end\" of the buffer.\n    }\n    buf.add(view);\n\n    if (buf.size > this.#size) {\n      this.#destroyFirstView();\n    }\n  }\n\n  /**\n   * After calling resize, the size of the buffer will be `newSize`.\n   * The optional parameter `idsToKeep` is, if present, a Set of page-ids to\n   * push to the back of the buffer, delaying their destruction. The size of\n   * `idsToKeep` has no impact on the final size of the buffer; if `idsToKeep`\n   * is larger than `newSize`, some of those pages will be destroyed anyway.\n   */\n  resize(newSize, idsToKeep = null) {\n    this.#size = newSize;\n\n    const buf = this.#buf;\n    if (idsToKeep) {\n      const ii = buf.size;\n      let i = 1;\n      for (const view of buf) {\n        if (idsToKeep.has(view.id)) {\n          buf.delete(view); // Move the view to the \"end\" of the buffer.\n          buf.add(view);\n        }\n        if (++i > ii) {\n          break;\n        }\n      }\n    }\n\n    while (buf.size > this.#size) {\n      this.#destroyFirstView();\n    }\n  }\n\n  has(view) {\n    return this.#buf.has(view);\n  }\n\n  [Symbol.iterator]() {\n    return this.#buf.keys();\n  }\n\n  #destroyFirstView() {\n    const firstView = this.#buf.keys().next().value;\n\n    firstView?.destroy();\n    this.#buf.delete(firstView);\n  }\n}\n\n/**\n * Simple viewer control to display PDF content/pages.\n */\nclass PDFViewer {\n  #buffer = null;\n\n  #altTextManager = null;\n\n  #annotationEditorHighlightColors = null;\n\n  #annotationEditorMode = AnnotationEditorType.NONE;\n\n  #annotationEditorUIManager = null;\n\n  #annotationMode = AnnotationMode.ENABLE_FORMS;\n\n  #containerTopLeft = null;\n\n  #editorUndoBar = null;\n\n  #enableHWA = false;\n\n  #enableHighlightFloatingButton = false;\n\n  #enablePermissions = false;\n\n  #enableUpdatedAddImage = false;\n\n  #enableNewAltTextWhenAddingImage = false;\n\n  #eventAbortController = null;\n\n  #mlManager = null;\n\n  #switchAnnotationEditorModeAC = null;\n\n  #switchAnnotationEditorModeTimeoutId = null;\n\n  #getAllTextInProgress = false;\n\n  #hiddenCopyElement = null;\n\n  #interruptCopyCondition = false;\n\n  #previousContainerHeight = 0;\n\n  #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this));\n\n  #scrollModePageState = null;\n\n  #scaleTimeoutId = null;\n\n  #supportsPinchToZoom = true;\n\n  #textLayerMode = TextLayerMode.ENABLE;\n\n  /**\n   * @param {PDFViewerOptions} options\n   */\n  constructor(options) {\n    const viewerVersion =\n      typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_VERSION\") : null;\n    if (version !== viewerVersion) {\n      throw new Error(\n        `The API version \"${version}\" does not match the Viewer version \"${viewerVersion}\".`\n      );\n    }\n    this.container = options.container;\n    this.viewer = options.viewer || options.container.firstElementChild;\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      if (this.container?.tagName !== \"DIV\" || this.viewer?.tagName !== \"DIV\") {\n        throw new Error(\"Invalid `container` and/or `viewer` option.\");\n      }\n\n      if (\n        this.container.offsetParent &&\n        getComputedStyle(this.container).position !== \"absolute\"\n      ) {\n        throw new Error(\"The `container` must be absolutely positioned.\");\n      }\n    }\n    this.#resizeObserver.observe(this.container);\n\n    this.eventBus = options.eventBus;\n    this.linkService = options.linkService || new SimpleLinkService();\n    this.downloadManager = options.downloadManager || null;\n    this.findController = options.findController || null;\n    this.#altTextManager = options.altTextManager || null;\n    this.#editorUndoBar = options.editorUndoBar || null;\n\n    if (this.findController) {\n      this.findController.onIsPageVisible = pageNumber =>\n        this._getVisiblePages().ids.has(pageNumber);\n    }\n    this._scriptingManager = options.scriptingManager || null;\n    this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE;\n    this.#annotationMode =\n      options.annotationMode ?? AnnotationMode.ENABLE_FORMS;\n    this.#annotationEditorMode =\n      options.annotationEditorMode ?? AnnotationEditorType.NONE;\n    this.#annotationEditorHighlightColors =\n      options.annotationEditorHighlightColors || null;\n    this.#enableHighlightFloatingButton =\n      options.enableHighlightFloatingButton === true;\n    this.#enableUpdatedAddImage = options.enableUpdatedAddImage === true;\n    this.#enableNewAltTextWhenAddingImage =\n      options.enableNewAltTextWhenAddingImage === true;\n    this.imageResourcesPath = options.imageResourcesPath || \"\";\n    this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this.removePageBorders = options.removePageBorders || false;\n    }\n    this.maxCanvasPixels = options.maxCanvasPixels;\n    this.l10n = options.l10n;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this.l10n ||= new GenericL10n();\n    }\n    this.#enablePermissions = options.enablePermissions || false;\n    this.pageColors = options.pageColors || null;\n    this.#mlManager = options.mlManager || null;\n    this.#enableHWA = options.enableHWA || false;\n    this.#supportsPinchToZoom = options.supportsPinchToZoom !== false;\n\n    this.defaultRenderingQueue = !options.renderingQueue;\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this.defaultRenderingQueue\n    ) {\n      // Custom rendering queue is not specified, using default one\n      this.renderingQueue = new PDFRenderingQueue();\n      this.renderingQueue.setViewer(this);\n    } else {\n      this.renderingQueue = options.renderingQueue;\n    }\n\n    const { abortSignal } = options;\n    abortSignal?.addEventListener(\n      \"abort\",\n      () => {\n        this.#resizeObserver.disconnect();\n        this.#resizeObserver = null;\n      },\n      { once: true }\n    );\n\n    this.scroll = watchScroll(\n      this.container,\n      this._scrollUpdate.bind(this),\n      abortSignal\n    );\n    this.presentationModeState = PresentationModeState.UNKNOWN;\n    this._resetView();\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this.removePageBorders\n    ) {\n      this.viewer.classList.add(\"removePageBorders\");\n    }\n\n    this.#updateContainerHeightCss();\n\n    // Trigger API-cleanup, once thumbnail rendering has finished,\n    // if the relevant pageView is *not* cached in the buffer.\n    this.eventBus._on(\"thumbnailrendered\", ({ pageNumber, pdfPage }) => {\n      const pageView = this._pages[pageNumber - 1];\n      if (!this.#buffer.has(pageView)) {\n        pdfPage?.cleanup();\n      }\n    });\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      !options.l10n\n    ) {\n      // Ensure that Fluent is connected in e.g. the COMPONENTS build.\n      this.l10n.translate(this.container);\n    }\n  }\n\n  get pagesCount() {\n    return this._pages.length;\n  }\n\n  getPageView(index) {\n    return this._pages[index];\n  }\n\n  getCachedPageViews() {\n    return new Set(this.#buffer);\n  }\n\n  /**\n   * @type {boolean} - True if all {PDFPageView} objects are initialized.\n   */\n  get pageViewsReady() {\n    // Prevent printing errors when 'disableAutoFetch' is set, by ensuring\n    // that *all* pages have in fact been completely loaded.\n    return this._pages.every(pageView => pageView?.pdfPage);\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get renderForms() {\n    return this.#annotationMode === AnnotationMode.ENABLE_FORMS;\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get enableScripting() {\n    return !!this._scriptingManager;\n  }\n\n  /**\n   * @type {number}\n   */\n  get currentPageNumber() {\n    return this._currentPageNumber;\n  }\n\n  /**\n   * @param {number} val - The page number.\n   */\n  set currentPageNumber(val) {\n    if (!Number.isInteger(val)) {\n      throw new Error(\"Invalid page number.\");\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    // The intent can be to just reset a scroll position and/or scale.\n    if (!this._setCurrentPageNumber(val, /* resetCurrentPageView = */ true)) {\n      console.error(`currentPageNumber: \"${val}\" is not a valid page.`);\n    }\n  }\n\n  /**\n   * @returns {boolean} Whether the pageNumber is valid (within bounds).\n   * @private\n   */\n  _setCurrentPageNumber(val, resetCurrentPageView = false) {\n    if (this._currentPageNumber === val) {\n      if (resetCurrentPageView) {\n        this.#resetCurrentPageView();\n      }\n      return true;\n    }\n\n    if (!(0 < val && val <= this.pagesCount)) {\n      return false;\n    }\n    const previous = this._currentPageNumber;\n    this._currentPageNumber = val;\n\n    this.eventBus.dispatch(\"pagechanging\", {\n      source: this,\n      pageNumber: val,\n      pageLabel: this._pageLabels?.[val - 1] ?? null,\n      previous,\n    });\n\n    if (resetCurrentPageView) {\n      this.#resetCurrentPageView();\n    }\n    return true;\n  }\n\n  /**\n   * @type {string|null} Returns the current page label, or `null` if no page\n   *   labels exist.\n   */\n  get currentPageLabel() {\n    return this._pageLabels?.[this._currentPageNumber - 1] ?? null;\n  }\n\n  /**\n   * @param {string} val - The page label.\n   */\n  set currentPageLabel(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    let page = val | 0; // Fallback page number.\n    if (this._pageLabels) {\n      const i = this._pageLabels.indexOf(val);\n      if (i >= 0) {\n        page = i + 1;\n      }\n    }\n    // The intent can be to just reset a scroll position and/or scale.\n    if (!this._setCurrentPageNumber(page, /* resetCurrentPageView = */ true)) {\n      console.error(`currentPageLabel: \"${val}\" is not a valid page.`);\n    }\n  }\n\n  /**\n   * @type {number}\n   */\n  get currentScale() {\n    return this._currentScale !== UNKNOWN_SCALE\n      ? this._currentScale\n      : DEFAULT_SCALE;\n  }\n\n  /**\n   * @param {number} val - Scale of the pages in percents.\n   */\n  set currentScale(val) {\n    if (isNaN(val)) {\n      throw new Error(\"Invalid numeric scale.\");\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    this.#setScale(val, { noScroll: false });\n  }\n\n  /**\n   * @type {string}\n   */\n  get currentScaleValue() {\n    return this._currentScaleValue;\n  }\n\n  /**\n   * @param val - The scale of the pages (in percent or predefined value).\n   */\n  set currentScaleValue(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    this.#setScale(val, { noScroll: false });\n  }\n\n  /**\n   * @type {number}\n   */\n  get pagesRotation() {\n    return this._pagesRotation;\n  }\n\n  /**\n   * @param {number} rotation - The rotation of the pages (0, 90, 180, 270).\n   */\n  set pagesRotation(rotation) {\n    if (!isValidRotation(rotation)) {\n      throw new Error(\"Invalid pages rotation angle.\");\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    // Normalize the rotation, by clamping it to the [0, 360) range.\n    rotation %= 360;\n    if (rotation < 0) {\n      rotation += 360;\n    }\n    if (this._pagesRotation === rotation) {\n      return; // The rotation didn't change.\n    }\n    this._pagesRotation = rotation;\n\n    const pageNumber = this._currentPageNumber;\n\n    this.refresh(true, { rotation });\n\n    // Prevent errors in case the rotation changes *before* the scale has been\n    // set to a non-default value.\n    if (this._currentScaleValue) {\n      this.#setScale(this._currentScaleValue, { noScroll: true });\n    }\n\n    this.eventBus.dispatch(\"rotationchanging\", {\n      source: this,\n      pagesRotation: rotation,\n      pageNumber,\n    });\n\n    if (this.defaultRenderingQueue) {\n      this.update();\n    }\n  }\n\n  get firstPagePromise() {\n    return this.pdfDocument ? this._firstPageCapability.promise : null;\n  }\n\n  get onePageRendered() {\n    return this.pdfDocument ? this._onePageRenderedCapability.promise : null;\n  }\n\n  get pagesPromise() {\n    return this.pdfDocument ? this._pagesCapability.promise : null;\n  }\n\n  get _layerProperties() {\n    const self = this;\n    return shadow(this, \"_layerProperties\", {\n      get annotationEditorUIManager() {\n        return self.#annotationEditorUIManager;\n      },\n      get annotationStorage() {\n        return self.pdfDocument?.annotationStorage;\n      },\n      get downloadManager() {\n        return self.downloadManager;\n      },\n      get enableScripting() {\n        return !!self._scriptingManager;\n      },\n      get fieldObjectsPromise() {\n        return self.pdfDocument?.getFieldObjects();\n      },\n      get findController() {\n        return self.findController;\n      },\n      get hasJSActionsPromise() {\n        return self.pdfDocument?.hasJSActions();\n      },\n      get linkService() {\n        return self.linkService;\n      },\n    });\n  }\n\n  /**\n   * Currently only *some* permissions are supported.\n   * @returns {Object}\n   */\n  #initializePermissions(permissions) {\n    const params = {\n      annotationEditorMode: this.#annotationEditorMode,\n      annotationMode: this.#annotationMode,\n      textLayerMode: this.#textLayerMode,\n    };\n    if (!permissions) {\n      return params;\n    }\n\n    if (\n      !permissions.includes(PermissionFlag.COPY) &&\n      this.#textLayerMode === TextLayerMode.ENABLE\n    ) {\n      params.textLayerMode = TextLayerMode.ENABLE_PERMISSIONS;\n    }\n\n    if (!permissions.includes(PermissionFlag.MODIFY_CONTENTS)) {\n      params.annotationEditorMode = AnnotationEditorType.DISABLE;\n    }\n\n    if (\n      !permissions.includes(PermissionFlag.MODIFY_ANNOTATIONS) &&\n      !permissions.includes(PermissionFlag.FILL_INTERACTIVE_FORMS) &&\n      this.#annotationMode === AnnotationMode.ENABLE_FORMS\n    ) {\n      params.annotationMode = AnnotationMode.ENABLE;\n    }\n\n    return params;\n  }\n\n  async #onePageRenderedOrForceFetch(signal) {\n    // Unless the viewer *and* its pages are visible, rendering won't start and\n    // `this._onePageRenderedCapability` thus won't be resolved.\n    // To ensure that automatic printing, on document load, still works even in\n    // those cases we force-allow fetching of all pages when:\n    //  - The current window/tab is inactive, which will prevent rendering since\n    //    `requestAnimationFrame` is being used; fixes bug 1746213.\n    //  - The viewer is hidden in the DOM, e.g. in a `display: none` <iframe>\n    //    element; fixes bug 1618621.\n    //  - The viewer is visible, but none of the pages are (e.g. if the\n    //    viewer is very small); fixes bug 1618955.\n    if (\n      document.visibilityState === \"hidden\" ||\n      !this.container.offsetParent ||\n      this._getVisiblePages().views.length === 0\n    ) {\n      return;\n    }\n\n    // Handle the window/tab becoming inactive *after* rendering has started;\n    // fixes (another part of) bug 1746213.\n    const hiddenCapability = Promise.withResolvers(),\n      ac = new AbortController();\n    document.addEventListener(\n      \"visibilitychange\",\n      () => {\n        if (document.visibilityState === \"hidden\") {\n          hiddenCapability.resolve();\n        }\n      },\n      {\n        signal:\n          (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n          typeof AbortSignal.any === \"function\"\n            ? AbortSignal.any([signal, ac.signal])\n            : signal,\n      }\n    );\n\n    await Promise.race([\n      this._onePageRenderedCapability.promise,\n      hiddenCapability.promise,\n    ]);\n    ac.abort(); // Remove the \"visibilitychange\" listener immediately.\n  }\n\n  async getAllText() {\n    const texts = [];\n    const buffer = [];\n    for (\n      let pageNum = 1, pagesCount = this.pdfDocument.numPages;\n      pageNum <= pagesCount;\n      ++pageNum\n    ) {\n      if (this.#interruptCopyCondition) {\n        return null;\n      }\n      buffer.length = 0;\n      const page = await this.pdfDocument.getPage(pageNum);\n      // By default getTextContent pass disableNormalization equals to false\n      // which is fine because we want a normalized string.\n      const { items } = await page.getTextContent();\n      for (const item of items) {\n        if (item.str) {\n          buffer.push(item.str);\n        }\n        if (item.hasEOL) {\n          buffer.push(\"\\n\");\n        }\n      }\n      texts.push(removeNullCharacters(buffer.join(\"\")));\n    }\n\n    return texts.join(\"\\n\");\n  }\n\n  #copyCallback(textLayerMode, event) {\n    const selection = document.getSelection();\n    const { focusNode, anchorNode } = selection;\n    if (\n      anchorNode &&\n      focusNode &&\n      selection.containsNode(this.#hiddenCopyElement)\n    ) {\n      // About the condition above:\n      //  - having non-null anchorNode and focusNode are here to guaranty that\n      //    we have at least a kind of selection.\n      //  - this.#hiddenCopyElement is an invisible element which is impossible\n      //    to select manually (its display is none) but ctrl+A will select all\n      //    including this element so having it in the selection means that all\n      //    has been selected.\n\n      if (\n        this.#getAllTextInProgress ||\n        textLayerMode === TextLayerMode.ENABLE_PERMISSIONS\n      ) {\n        stopEvent(event);\n        return;\n      }\n      this.#getAllTextInProgress = true;\n\n      // TODO: if all the pages are rendered we don't need to wait for\n      // getAllText and we could just get text from the Selection object.\n\n      // Select all the document.\n      const { classList } = this.viewer;\n      classList.add(\"copyAll\");\n\n      const ac = new AbortController();\n      window.addEventListener(\n        \"keydown\",\n        ev => (this.#interruptCopyCondition = ev.key === \"Escape\"),\n        { signal: ac.signal }\n      );\n\n      this.getAllText()\n        .then(async text => {\n          if (text !== null) {\n            await navigator.clipboard.writeText(text);\n          }\n        })\n        .catch(reason => {\n          console.warn(\n            `Something goes wrong when extracting the text: ${reason.message}`\n          );\n        })\n        .finally(() => {\n          this.#getAllTextInProgress = false;\n          this.#interruptCopyCondition = false;\n          ac.abort();\n          classList.remove(\"copyAll\");\n        });\n\n      stopEvent(event);\n    }\n  }\n\n  /**\n   * @param {PDFDocumentProxy} pdfDocument\n   */\n  setDocument(pdfDocument) {\n    if (this.pdfDocument) {\n      this.eventBus.dispatch(\"pagesdestroy\", { source: this });\n\n      this._cancelRendering();\n      this._resetView();\n\n      this.findController?.setDocument(null);\n      this._scriptingManager?.setDocument(null);\n\n      this.#annotationEditorUIManager?.destroy();\n      this.#annotationEditorUIManager = null;\n    }\n\n    this.pdfDocument = pdfDocument;\n    if (!pdfDocument) {\n      return;\n    }\n    const pagesCount = pdfDocument.numPages;\n    const firstPagePromise = pdfDocument.getPage(1);\n    // Rendering (potentially) depends on this, hence fetching it immediately.\n    const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({\n      intent: \"display\",\n    });\n    const permissionsPromise = this.#enablePermissions\n      ? pdfDocument.getPermissions()\n      : Promise.resolve();\n\n    const { eventBus, pageColors, viewer } = this;\n\n    this.#eventAbortController = new AbortController();\n    const { signal } = this.#eventAbortController;\n\n    // Given that browsers don't handle huge amounts of DOM-elements very well,\n    // enforce usage of PAGE-scrolling when loading *very* long/large documents.\n    if (pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) {\n      console.warn(\n        \"Forcing PAGE-scrolling for performance reasons, given the length of the document.\"\n      );\n      const mode = (this._scrollMode = ScrollMode.PAGE);\n      eventBus.dispatch(\"scrollmodechanged\", { source: this, mode });\n    }\n\n    this._pagesCapability.promise.then(\n      () => {\n        eventBus.dispatch(\"pagesloaded\", { source: this, pagesCount });\n      },\n      () => {\n        /* Prevent \"Uncaught (in promise)\"-messages in the console. */\n      }\n    );\n\n    const onBeforeDraw = evt => {\n      const pageView = this._pages[evt.pageNumber - 1];\n      if (!pageView) {\n        return;\n      }\n      // Add the page to the buffer at the start of drawing. That way it can be\n      // evicted from the buffer and destroyed even if we pause its rendering.\n      this.#buffer.push(pageView);\n    };\n    eventBus._on(\"pagerender\", onBeforeDraw, { signal });\n\n    const onAfterDraw = evt => {\n      if (evt.cssTransform) {\n        return;\n      }\n      this._onePageRenderedCapability.resolve({ timestamp: evt.timestamp });\n\n      eventBus._off(\"pagerendered\", onAfterDraw); // Remove immediately.\n    };\n    eventBus._on(\"pagerendered\", onAfterDraw, { signal });\n\n    // Fetch a single page so we can get a viewport that will be the default\n    // viewport for all pages\n    Promise.all([firstPagePromise, permissionsPromise])\n      .then(([firstPdfPage, permissions]) => {\n        if (pdfDocument !== this.pdfDocument) {\n          return; // The document was closed while the first page resolved.\n        }\n        this._firstPageCapability.resolve(firstPdfPage);\n        this._optionalContentConfigPromise = optionalContentConfigPromise;\n\n        const { annotationEditorMode, annotationMode, textLayerMode } =\n          this.#initializePermissions(permissions);\n\n        if (textLayerMode !== TextLayerMode.DISABLE) {\n          const element = (this.#hiddenCopyElement =\n            document.createElement(\"div\"));\n          element.id = \"hiddenCopyElement\";\n          viewer.before(element);\n        }\n\n        if (\n          ((typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n            typeof AbortSignal.any === \"function\") &&\n          annotationEditorMode !== AnnotationEditorType.DISABLE\n        ) {\n          const mode = annotationEditorMode;\n\n          if (pdfDocument.isPureXfa) {\n            console.warn(\"Warning: XFA-editing is not implemented.\");\n          } else if (isValidAnnotationEditorMode(mode)) {\n            this.#annotationEditorUIManager = new AnnotationEditorUIManager(\n              this.container,\n              viewer,\n              this.#altTextManager,\n              eventBus,\n              pdfDocument,\n              pageColors,\n              this.#annotationEditorHighlightColors,\n              this.#enableHighlightFloatingButton,\n              this.#enableUpdatedAddImage,\n              this.#enableNewAltTextWhenAddingImage,\n              this.#mlManager,\n              this.#editorUndoBar,\n              this.#supportsPinchToZoom\n            );\n            eventBus.dispatch(\"annotationeditoruimanager\", {\n              source: this,\n              uiManager: this.#annotationEditorUIManager,\n            });\n            if (mode !== AnnotationEditorType.NONE) {\n              if (mode === AnnotationEditorType.STAMP) {\n                this.#mlManager?.loadModel(\"altText\");\n              }\n              this.#annotationEditorUIManager.updateMode(mode);\n            }\n          } else {\n            console.error(`Invalid AnnotationEditor mode: ${mode}`);\n          }\n        }\n\n        const viewerElement =\n          this._scrollMode === ScrollMode.PAGE ? null : viewer;\n        const scale = this.currentScale;\n        const viewport = firstPdfPage.getViewport({\n          scale: scale * PixelsPerInch.PDF_TO_CSS_UNITS,\n        });\n        // Ensure that the various layers always get the correct initial size,\n        // see issue 15795.\n        viewer.style.setProperty(\"--scale-factor\", viewport.scale);\n\n        if (pageColors?.background) {\n          viewer.style.setProperty(\"--page-bg-color\", pageColors.background);\n        }\n        if (\n          pageColors?.foreground === \"CanvasText\" ||\n          pageColors?.background === \"Canvas\"\n        ) {\n          viewer.style.setProperty(\n            \"--hcm-highlight-filter\",\n            pdfDocument.filterFactory.addHighlightHCMFilter(\n              \"highlight\",\n              \"CanvasText\",\n              \"Canvas\",\n              \"HighlightText\",\n              \"Highlight\"\n            )\n          );\n          viewer.style.setProperty(\n            \"--hcm-highlight-selected-filter\",\n            pdfDocument.filterFactory.addHighlightHCMFilter(\n              \"highlight_selected\",\n              \"CanvasText\",\n              \"Canvas\",\n              \"HighlightText\",\n              \"ButtonText\"\n            )\n          );\n        }\n\n        for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n          const pageView = new PDFPageView({\n            container: viewerElement,\n            eventBus,\n            id: pageNum,\n            scale,\n            defaultViewport: viewport.clone(),\n            optionalContentConfigPromise,\n            renderingQueue: this.renderingQueue,\n            textLayerMode,\n            annotationMode,\n            imageResourcesPath: this.imageResourcesPath,\n            maxCanvasPixels: this.maxCanvasPixels,\n            pageColors,\n            l10n: this.l10n,\n            layerProperties: this._layerProperties,\n            enableHWA: this.#enableHWA,\n          });\n          this._pages.push(pageView);\n        }\n        // Set the first `pdfPage` immediately, since it's already loaded,\n        // rather than having to repeat the `PDFDocumentProxy.getPage` call in\n        // the `this.#ensurePdfPageLoaded` method before rendering can start.\n        this._pages[0]?.setPdfPage(firstPdfPage);\n\n        if (this._scrollMode === ScrollMode.PAGE) {\n          // Ensure that the current page becomes visible on document load.\n          this.#ensurePageViewVisible();\n        } else if (this._spreadMode !== SpreadMode.NONE) {\n          this._updateSpreadMode();\n        }\n\n        // Fetch all the pages since the viewport is needed before printing\n        // starts to create the correct size canvas. Wait until one page is\n        // rendered so we don't tie up too many resources early on.\n        this.#onePageRenderedOrForceFetch(signal).then(async () => {\n          if (pdfDocument !== this.pdfDocument) {\n            return; // The document was closed while the first page rendered.\n          }\n          this.findController?.setDocument(pdfDocument); // Enable searching.\n          this._scriptingManager?.setDocument(pdfDocument); // Enable scripting.\n\n          if (this.#hiddenCopyElement) {\n            document.addEventListener(\n              \"copy\",\n              this.#copyCallback.bind(this, textLayerMode),\n              { signal }\n            );\n          }\n\n          if (this.#annotationEditorUIManager) {\n            // Ensure that the Editor buttons, in the toolbar, are updated.\n            eventBus.dispatch(\"annotationeditormodechanged\", {\n              source: this,\n              mode: this.#annotationEditorMode,\n            });\n          }\n\n          // In addition to 'disableAutoFetch' being set, also attempt to reduce\n          // resource usage when loading *very* long/large documents.\n          if (\n            pdfDocument.loadingParams.disableAutoFetch ||\n            pagesCount > PagesCountLimit.FORCE_LAZY_PAGE_INIT\n          ) {\n            // XXX: Printing is semi-broken with auto fetch disabled.\n            this._pagesCapability.resolve();\n            return;\n          }\n          let getPagesLeft = pagesCount - 1; // The first page was already loaded.\n\n          if (getPagesLeft <= 0) {\n            this._pagesCapability.resolve();\n            return;\n          }\n          for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) {\n            const promise = pdfDocument.getPage(pageNum).then(\n              pdfPage => {\n                const pageView = this._pages[pageNum - 1];\n                if (!pageView.pdfPage) {\n                  pageView.setPdfPage(pdfPage);\n                }\n                if (--getPagesLeft === 0) {\n                  this._pagesCapability.resolve();\n                }\n              },\n              reason => {\n                console.error(\n                  `Unable to get page ${pageNum} to initialize viewer`,\n                  reason\n                );\n                if (--getPagesLeft === 0) {\n                  this._pagesCapability.resolve();\n                }\n              }\n            );\n\n            if (pageNum % PagesCountLimit.PAUSE_EAGER_PAGE_INIT === 0) {\n              await promise;\n            }\n          }\n        });\n\n        eventBus.dispatch(\"pagesinit\", { source: this });\n\n        pdfDocument.getMetadata().then(({ info }) => {\n          if (pdfDocument !== this.pdfDocument) {\n            return; // The document was closed while the metadata resolved.\n          }\n          if (info.Language) {\n            viewer.lang = info.Language;\n          }\n        });\n\n        if (this.defaultRenderingQueue) {\n          this.update();\n        }\n      })\n      .catch(reason => {\n        console.error(\"Unable to initialize viewer\", reason);\n\n        this._pagesCapability.reject(reason);\n      });\n  }\n\n  /**\n   * @param {Array|null} labels\n   */\n  setPageLabels(labels) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (!labels) {\n      this._pageLabels = null;\n    } else if (\n      !(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)\n    ) {\n      this._pageLabels = null;\n      console.error(`setPageLabels: Invalid page labels.`);\n    } else {\n      this._pageLabels = labels;\n    }\n    // Update all the `PDFPageView` instances.\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null);\n    }\n  }\n\n  _resetView() {\n    this._pages = [];\n    this._currentPageNumber = 1;\n    this._currentScale = UNKNOWN_SCALE;\n    this._currentScaleValue = null;\n    this._pageLabels = null;\n    this.#buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\n    this._location = null;\n    this._pagesRotation = 0;\n    this._optionalContentConfigPromise = null;\n    this._firstPageCapability = Promise.withResolvers();\n    this._onePageRenderedCapability = Promise.withResolvers();\n    this._pagesCapability = Promise.withResolvers();\n    this._scrollMode = ScrollMode.VERTICAL;\n    this._previousScrollMode = ScrollMode.UNKNOWN;\n    this._spreadMode = SpreadMode.NONE;\n\n    this.#scrollModePageState = {\n      previousPageNumber: 1,\n      scrollDown: true,\n      pages: [],\n    };\n\n    this.#eventAbortController?.abort();\n    this.#eventAbortController = null;\n\n    // Remove the pages from the DOM...\n    this.viewer.textContent = \"\";\n    // ... and reset the Scroll mode CSS class(es) afterwards.\n    this._updateScrollMode();\n\n    this.viewer.removeAttribute(\"lang\");\n\n    this.#hiddenCopyElement?.remove();\n    this.#hiddenCopyElement = null;\n\n    this.#cleanupSwitchAnnotationEditorMode();\n  }\n\n  #ensurePageViewVisible() {\n    if (this._scrollMode !== ScrollMode.PAGE) {\n      throw new Error(\"#ensurePageViewVisible: Invalid scrollMode value.\");\n    }\n    const pageNumber = this._currentPageNumber,\n      state = this.#scrollModePageState,\n      viewer = this.viewer;\n\n    // Temporarily remove all the pages from the DOM...\n    viewer.textContent = \"\";\n    // ... and clear out the active ones.\n    state.pages.length = 0;\n\n    if (this._spreadMode === SpreadMode.NONE && !this.isInPresentationMode) {\n      // Finally, append the new page to the viewer.\n      const pageView = this._pages[pageNumber - 1];\n      viewer.append(pageView.div);\n\n      state.pages.push(pageView);\n    } else {\n      const pageIndexSet = new Set(),\n        parity = this._spreadMode - 1;\n\n      // Determine the pageIndices in the new spread.\n      if (parity === -1) {\n        // PresentationMode is active, with `SpreadMode.NONE` set.\n        pageIndexSet.add(pageNumber - 1);\n      } else if (pageNumber % 2 !== parity) {\n        // Left-hand side page.\n        pageIndexSet.add(pageNumber - 1);\n        pageIndexSet.add(pageNumber);\n      } else {\n        // Right-hand side page.\n        pageIndexSet.add(pageNumber - 2);\n        pageIndexSet.add(pageNumber - 1);\n      }\n\n      // Finally, append the new pages to the viewer and apply the spreadMode.\n      const spread = document.createElement(\"div\");\n      spread.className = \"spread\";\n\n      if (this.isInPresentationMode) {\n        const dummyPage = document.createElement(\"div\");\n        dummyPage.className = \"dummyPage\";\n        spread.append(dummyPage);\n      }\n\n      for (const i of pageIndexSet) {\n        const pageView = this._pages[i];\n        if (!pageView) {\n          continue;\n        }\n        spread.append(pageView.div);\n\n        state.pages.push(pageView);\n      }\n      viewer.append(spread);\n    }\n\n    state.scrollDown = pageNumber >= state.previousPageNumber;\n    state.previousPageNumber = pageNumber;\n  }\n\n  _scrollUpdate() {\n    if (this.pagesCount === 0) {\n      return;\n    }\n    this.update();\n  }\n\n  #scrollIntoView(pageView, pageSpot = null) {\n    const { div, id } = pageView;\n\n    // Ensure that `this._currentPageNumber` is correct, when `#scrollIntoView`\n    // is called directly (and not from `#resetCurrentPageView`).\n    if (this._currentPageNumber !== id) {\n      this._setCurrentPageNumber(id);\n    }\n    if (this._scrollMode === ScrollMode.PAGE) {\n      this.#ensurePageViewVisible();\n      // Ensure that rendering always occurs, to avoid showing a blank page,\n      // even if the current position doesn't change when the page is scrolled.\n      this.update();\n    }\n\n    if (!pageSpot && !this.isInPresentationMode) {\n      const left = div.offsetLeft + div.clientLeft,\n        right = left + div.clientWidth;\n      const { scrollLeft, clientWidth } = this.container;\n      if (\n        this._scrollMode === ScrollMode.HORIZONTAL ||\n        left < scrollLeft ||\n        right > scrollLeft + clientWidth\n      ) {\n        pageSpot = { left: 0, top: 0 };\n      }\n    }\n    scrollIntoView(div, pageSpot);\n\n    // Ensure that the correct *initial* document position is set, when any\n    // OpenParameters are used, for documents with non-default Scroll/Spread\n    // modes (fixes issue 15695). This is necessary since the scroll-handler\n    // invokes the `update`-method asynchronously, and `this._location` could\n    // thus be wrong when the initial zooming occurs in the default viewer.\n    if (!this._currentScaleValue && this._location) {\n      this._location = null;\n    }\n  }\n\n  /**\n   * Prevent unnecessary re-rendering of all pages when the scale changes\n   * only because of limited numerical precision.\n   */\n  #isSameScale(newScale) {\n    return (\n      newScale === this._currentScale ||\n      Math.abs(newScale - this._currentScale) < 1e-15\n    );\n  }\n\n  #setScaleUpdatePages(\n    newScale,\n    newValue,\n    { noScroll = false, preset = false, drawingDelay = -1, origin = null }\n  ) {\n    this._currentScaleValue = newValue.toString();\n\n    if (this.#isSameScale(newScale)) {\n      if (preset) {\n        this.eventBus.dispatch(\"scalechanging\", {\n          source: this,\n          scale: newScale,\n          presetValue: newValue,\n        });\n      }\n      return;\n    }\n\n    this.viewer.style.setProperty(\n      \"--scale-factor\",\n      newScale * PixelsPerInch.PDF_TO_CSS_UNITS\n    );\n\n    const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000;\n    this.refresh(true, {\n      scale: newScale,\n      drawingDelay: postponeDrawing ? drawingDelay : -1,\n    });\n\n    if (postponeDrawing) {\n      this.#scaleTimeoutId = setTimeout(() => {\n        this.#scaleTimeoutId = null;\n        this.refresh();\n      }, drawingDelay);\n    }\n\n    const previousScale = this._currentScale;\n    this._currentScale = newScale;\n\n    if (!noScroll) {\n      let page = this._currentPageNumber,\n        dest;\n      if (\n        this._location &&\n        !(this.isInPresentationMode || this.isChangingPresentationMode)\n      ) {\n        page = this._location.pageNumber;\n        dest = [\n          null,\n          { name: \"XYZ\" },\n          this._location.left,\n          this._location.top,\n          null,\n        ];\n      }\n      this.scrollPageIntoView({\n        pageNumber: page,\n        destArray: dest,\n        allowNegativeOffset: true,\n      });\n      if (Array.isArray(origin)) {\n        // If the origin of the scaling transform is specified, preserve its\n        // location on screen. If not specified, scaling will fix the top-left\n        // corner of the visible PDF area.\n        const scaleDiff = newScale / previousScale - 1;\n        const [top, left] = this.containerTopLeft;\n        this.container.scrollLeft += (origin[0] - left) * scaleDiff;\n        this.container.scrollTop += (origin[1] - top) * scaleDiff;\n      }\n    }\n\n    this.eventBus.dispatch(\"scalechanging\", {\n      source: this,\n      scale: newScale,\n      presetValue: preset ? newValue : undefined,\n    });\n\n    if (this.defaultRenderingQueue) {\n      this.update();\n    }\n  }\n\n  get #pageWidthScaleFactor() {\n    if (\n      this._spreadMode !== SpreadMode.NONE &&\n      this._scrollMode !== ScrollMode.HORIZONTAL\n    ) {\n      return 2;\n    }\n    return 1;\n  }\n\n  #setScale(value, options) {\n    let scale = parseFloat(value);\n\n    if (scale > 0) {\n      options.preset = false;\n      this.#setScaleUpdatePages(scale, value, options);\n    } else {\n      const currentPage = this._pages[this._currentPageNumber - 1];\n      if (!currentPage) {\n        return;\n      }\n      let hPadding = SCROLLBAR_PADDING,\n        vPadding = VERTICAL_PADDING;\n\n      if (this.isInPresentationMode) {\n        // Pages have a 2px (transparent) border in PresentationMode, see\n        // the `web/pdf_viewer.css` file.\n        hPadding = vPadding = 4; // 2 * 2px\n        if (this._spreadMode !== SpreadMode.NONE) {\n          // Account for two pages being visible in PresentationMode, thus\n          // \"doubling\" the total border width.\n          hPadding *= 2;\n        }\n      } else if (\n        (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n        this.removePageBorders\n      ) {\n        hPadding = vPadding = 0;\n      } else if (this._scrollMode === ScrollMode.HORIZONTAL) {\n        [hPadding, vPadding] = [vPadding, hPadding]; // Swap the padding values.\n      }\n      const pageWidthScale =\n        (((this.container.clientWidth - hPadding) / currentPage.width) *\n          currentPage.scale) /\n        this.#pageWidthScaleFactor;\n      const pageHeightScale =\n        ((this.container.clientHeight - vPadding) / currentPage.height) *\n        currentPage.scale;\n      switch (value) {\n        case \"page-actual\":\n          scale = 1;\n          break;\n        case \"page-width\":\n          scale = pageWidthScale;\n          break;\n        case \"page-height\":\n          scale = pageHeightScale;\n          break;\n        case \"page-fit\":\n          scale = Math.min(pageWidthScale, pageHeightScale);\n          break;\n        case \"auto\":\n          // For pages in landscape mode, fit the page height to the viewer\n          // *unless* the page would thus become too wide to fit horizontally.\n          const horizontalScale = isPortraitOrientation(currentPage)\n            ? pageWidthScale\n            : Math.min(pageHeightScale, pageWidthScale);\n          scale = Math.min(MAX_AUTO_SCALE, horizontalScale);\n          break;\n        default:\n          console.error(`#setScale: \"${value}\" is an unknown zoom value.`);\n          return;\n      }\n      options.preset = true;\n      this.#setScaleUpdatePages(scale, value, options);\n    }\n  }\n\n  /**\n   * Refreshes page view: scrolls to the current page and updates the scale.\n   */\n  #resetCurrentPageView() {\n    const pageView = this._pages[this._currentPageNumber - 1];\n\n    if (this.isInPresentationMode) {\n      // Fixes the case when PDF has different page sizes.\n      this.#setScale(this._currentScaleValue, { noScroll: true });\n    }\n    this.#scrollIntoView(pageView);\n  }\n\n  /**\n   * @param {string} label - The page label.\n   * @returns {number|null} The page number corresponding to the page label,\n   *   or `null` when no page labels exist and/or the input is invalid.\n   */\n  pageLabelToPageNumber(label) {\n    if (!this._pageLabels) {\n      return null;\n    }\n    const i = this._pageLabels.indexOf(label);\n    if (i < 0) {\n      return null;\n    }\n    return i + 1;\n  }\n\n  /**\n   * @typedef {Object} ScrollPageIntoViewParameters\n   * @property {number} pageNumber - The page number.\n   * @property {Array} [destArray] - The original PDF destination array, in the\n   *   format: <page-ref> </XYZ|/FitXXX> <args..>\n   * @property {boolean} [allowNegativeOffset] - Allow negative page offsets.\n   *   The default value is `false`.\n   * @property {boolean} [ignoreDestinationZoom] - Ignore the zoom argument in\n   *   the destination array. The default value is `false`.\n   */\n\n  /**\n   * Scrolls page into view.\n   * @param {ScrollPageIntoViewParameters} params\n   */\n  scrollPageIntoView({\n    pageNumber,\n    destArray = null,\n    allowNegativeOffset = false,\n    ignoreDestinationZoom = false,\n  }) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const pageView =\n      Number.isInteger(pageNumber) && this._pages[pageNumber - 1];\n    if (!pageView) {\n      console.error(\n        `scrollPageIntoView: \"${pageNumber}\" is not a valid pageNumber parameter.`\n      );\n      return;\n    }\n\n    if (this.isInPresentationMode || !destArray) {\n      this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n      return;\n    }\n    let x = 0,\n      y = 0;\n    let width = 0,\n      height = 0,\n      widthScale,\n      heightScale;\n    const changeOrientation = pageView.rotation % 180 !== 0;\n    const pageWidth =\n      (changeOrientation ? pageView.height : pageView.width) /\n      pageView.scale /\n      PixelsPerInch.PDF_TO_CSS_UNITS;\n    const pageHeight =\n      (changeOrientation ? pageView.width : pageView.height) /\n      pageView.scale /\n      PixelsPerInch.PDF_TO_CSS_UNITS;\n    let scale = 0;\n    switch (destArray[1].name) {\n      case \"XYZ\":\n        x = destArray[2];\n        y = destArray[3];\n        scale = destArray[4];\n        // If x and/or y coordinates are not supplied, default to\n        // _top_ left of the page (not the obvious bottom left,\n        // since aligning the bottom of the intended page with the\n        // top of the window is rarely helpful).\n        x = x !== null ? x : 0;\n        y = y !== null ? y : pageHeight;\n        break;\n      case \"Fit\":\n      case \"FitB\":\n        scale = \"page-fit\";\n        break;\n      case \"FitH\":\n      case \"FitBH\":\n        y = destArray[2];\n        scale = \"page-width\";\n        // According to the PDF spec, section 12.3.2.2, a `null` value in the\n        // parameter should maintain the position relative to the new page.\n        if (y === null && this._location) {\n          x = this._location.left;\n          y = this._location.top;\n        } else if (typeof y !== \"number\" || y < 0) {\n          // The \"top\" value isn't optional, according to the spec, however some\n          // bad PDF generators will pretend that it is (fixes bug 1663390).\n          y = pageHeight;\n        }\n        break;\n      case \"FitV\":\n      case \"FitBV\":\n        x = destArray[2];\n        width = pageWidth;\n        height = pageHeight;\n        scale = \"page-height\";\n        break;\n      case \"FitR\":\n        x = destArray[2];\n        y = destArray[3];\n        width = destArray[4] - x;\n        height = destArray[5] - y;\n        let hPadding = SCROLLBAR_PADDING,\n          vPadding = VERTICAL_PADDING;\n\n        if (\n          (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n          this.removePageBorders\n        ) {\n          hPadding = vPadding = 0;\n        }\n        widthScale =\n          (this.container.clientWidth - hPadding) /\n          width /\n          PixelsPerInch.PDF_TO_CSS_UNITS;\n        heightScale =\n          (this.container.clientHeight - vPadding) /\n          height /\n          PixelsPerInch.PDF_TO_CSS_UNITS;\n        scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n        break;\n      default:\n        console.error(\n          `scrollPageIntoView: \"${destArray[1].name}\" is not a valid destination type.`\n        );\n        return;\n    }\n\n    if (!ignoreDestinationZoom) {\n      if (scale && scale !== this._currentScale) {\n        this.currentScaleValue = scale;\n      } else if (this._currentScale === UNKNOWN_SCALE) {\n        this.currentScaleValue = DEFAULT_SCALE_VALUE;\n      }\n    }\n\n    if (scale === \"page-fit\" && !destArray[4]) {\n      this.#scrollIntoView(pageView);\n      return;\n    }\n\n    const boundingRect = [\n      pageView.viewport.convertToViewportPoint(x, y),\n      pageView.viewport.convertToViewportPoint(x + width, y + height),\n    ];\n    let left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n    let top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n\n    if (!allowNegativeOffset) {\n      // Some bad PDF generators will create destinations with e.g. top values\n      // that exceeds the page height. Ensure that offsets are not negative,\n      // to prevent a previous page from becoming visible (fixes bug 874482).\n      left = Math.max(left, 0);\n      top = Math.max(top, 0);\n    }\n    this.#scrollIntoView(pageView, /* pageSpot = */ { left, top });\n  }\n\n  _updateLocation(firstPage) {\n    const currentScale = this._currentScale;\n    const currentScaleValue = this._currentScaleValue;\n    const normalizedScaleValue =\n      parseFloat(currentScaleValue) === currentScale\n        ? Math.round(currentScale * 10000) / 100\n        : currentScaleValue;\n\n    const pageNumber = firstPage.id;\n    const currentPageView = this._pages[pageNumber - 1];\n    const container = this.container;\n    const topLeft = currentPageView.getPagePoint(\n      container.scrollLeft - firstPage.x,\n      container.scrollTop - firstPage.y\n    );\n    const intLeft = Math.round(topLeft[0]);\n    const intTop = Math.round(topLeft[1]);\n\n    let pdfOpenParams = `#page=${pageNumber}`;\n    if (!this.isInPresentationMode) {\n      pdfOpenParams += `&zoom=${normalizedScaleValue},${intLeft},${intTop}`;\n    }\n\n    this._location = {\n      pageNumber,\n      scale: normalizedScaleValue,\n      top: intTop,\n      left: intLeft,\n      rotation: this._pagesRotation,\n      pdfOpenParams,\n    };\n  }\n\n  update() {\n    const visible = this._getVisiblePages();\n    const visiblePages = visible.views,\n      numVisiblePages = visiblePages.length;\n\n    if (numVisiblePages === 0) {\n      return;\n    }\n    const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);\n    this.#buffer.resize(newCacheSize, visible.ids);\n\n    this.renderingQueue.renderHighestPriority(visible);\n\n    const isSimpleLayout =\n      this._spreadMode === SpreadMode.NONE &&\n      (this._scrollMode === ScrollMode.PAGE ||\n        this._scrollMode === ScrollMode.VERTICAL);\n    const currentId = this._currentPageNumber;\n    let stillFullyVisible = false;\n\n    for (const page of visiblePages) {\n      if (page.percent < 100) {\n        break;\n      }\n      if (page.id === currentId && isSimpleLayout) {\n        stillFullyVisible = true;\n        break;\n      }\n    }\n    this._setCurrentPageNumber(\n      stillFullyVisible ? currentId : visiblePages[0].id\n    );\n\n    this._updateLocation(visible.first);\n    this.eventBus.dispatch(\"updateviewarea\", {\n      source: this,\n      location: this._location,\n    });\n  }\n\n  #switchToEditAnnotationMode() {\n    const visible = this._getVisiblePages();\n    const pagesToRefresh = [];\n    const { ids, views } = visible;\n    for (const page of views) {\n      const { view } = page;\n      if (!view.hasEditableAnnotations()) {\n        ids.delete(view.id);\n        continue;\n      }\n      pagesToRefresh.push(page);\n    }\n\n    if (pagesToRefresh.length === 0) {\n      return null;\n    }\n    this.renderingQueue.renderHighestPriority({\n      first: pagesToRefresh[0],\n      last: pagesToRefresh.at(-1),\n      views: pagesToRefresh,\n      ids,\n    });\n\n    return ids;\n  }\n\n  containsElement(element) {\n    return this.container.contains(element);\n  }\n\n  focus() {\n    this.container.focus();\n  }\n\n  get _isContainerRtl() {\n    return getComputedStyle(this.container).direction === \"rtl\";\n  }\n\n  get isInPresentationMode() {\n    return this.presentationModeState === PresentationModeState.FULLSCREEN;\n  }\n\n  get isChangingPresentationMode() {\n    return this.presentationModeState === PresentationModeState.CHANGING;\n  }\n\n  get isHorizontalScrollbarEnabled() {\n    return this.isInPresentationMode\n      ? false\n      : this.container.scrollWidth > this.container.clientWidth;\n  }\n\n  get isVerticalScrollbarEnabled() {\n    return this.isInPresentationMode\n      ? false\n      : this.container.scrollHeight > this.container.clientHeight;\n  }\n\n  _getVisiblePages() {\n    const views =\n        this._scrollMode === ScrollMode.PAGE\n          ? this.#scrollModePageState.pages\n          : this._pages,\n      horizontal = this._scrollMode === ScrollMode.HORIZONTAL,\n      rtl = horizontal && this._isContainerRtl;\n\n    return getVisibleElements({\n      scrollEl: this.container,\n      views,\n      sortByVisibility: true,\n      horizontal,\n      rtl,\n    });\n  }\n\n  cleanup() {\n    for (const pageView of this._pages) {\n      if (pageView.renderingState !== RenderingStates.FINISHED) {\n        pageView.reset();\n      }\n    }\n  }\n\n  /**\n   * @private\n   */\n  _cancelRendering() {\n    for (const pageView of this._pages) {\n      pageView.cancelRendering();\n    }\n  }\n\n  /**\n   * @param {PDFPageView} pageView\n   * @returns {Promise<PDFPageProxy | null>}\n   */\n  async #ensurePdfPageLoaded(pageView) {\n    if (pageView.pdfPage) {\n      return pageView.pdfPage;\n    }\n    try {\n      const pdfPage = await this.pdfDocument.getPage(pageView.id);\n      if (!pageView.pdfPage) {\n        pageView.setPdfPage(pdfPage);\n      }\n      return pdfPage;\n    } catch (reason) {\n      console.error(\"Unable to get page for page view\", reason);\n      return null; // Page error -- there is nothing that can be done.\n    }\n  }\n\n  #getScrollAhead(visible) {\n    if (visible.first?.id === 1) {\n      return true;\n    } else if (visible.last?.id === this.pagesCount) {\n      return false;\n    }\n    switch (this._scrollMode) {\n      case ScrollMode.PAGE:\n        return this.#scrollModePageState.scrollDown;\n      case ScrollMode.HORIZONTAL:\n        return this.scroll.right;\n    }\n    return this.scroll.down;\n  }\n\n  forceRendering(currentlyVisiblePages) {\n    const visiblePages = currentlyVisiblePages || this._getVisiblePages();\n    const scrollAhead = this.#getScrollAhead(visiblePages);\n    const preRenderExtra =\n      this._spreadMode !== SpreadMode.NONE &&\n      this._scrollMode !== ScrollMode.HORIZONTAL;\n\n    const pageView = this.renderingQueue.getHighestPriority(\n      visiblePages,\n      this._pages,\n      scrollAhead,\n      preRenderExtra\n    );\n\n    if (pageView) {\n      this.#ensurePdfPageLoaded(pageView).then(() => {\n        this.renderingQueue.renderView(pageView);\n      });\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * @type {boolean} Whether all pages of the PDF document have identical\n   *   widths and heights.\n   */\n  get hasEqualPageSizes() {\n    const firstPageView = this._pages[0];\n    for (let i = 1, ii = this._pages.length; i < ii; ++i) {\n      const pageView = this._pages[i];\n      if (\n        pageView.width !== firstPageView.width ||\n        pageView.height !== firstPageView.height\n      ) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Returns sizes of the pages.\n   * @returns {Array} Array of objects with width/height/rotation fields.\n   */\n  getPagesOverview() {\n    let initialOrientation;\n    return this._pages.map(pageView => {\n      const viewport = pageView.pdfPage.getViewport({ scale: 1 });\n      const orientation = isPortraitOrientation(viewport);\n      if (initialOrientation === undefined) {\n        initialOrientation = orientation;\n      } else if (\n        this.enablePrintAutoRotate &&\n        orientation !== initialOrientation\n      ) {\n        // Rotate to fit the initial orientation.\n        return {\n          width: viewport.height,\n          height: viewport.width,\n          rotation: (viewport.rotation - 90) % 360,\n        };\n      }\n      return {\n        width: viewport.width,\n        height: viewport.height,\n        rotation: viewport.rotation,\n      };\n    });\n  }\n\n  /**\n   * @type {Promise<OptionalContentConfig | null>}\n   */\n  get optionalContentConfigPromise() {\n    if (!this.pdfDocument) {\n      return Promise.resolve(null);\n    }\n    if (!this._optionalContentConfigPromise) {\n      console.error(\"optionalContentConfigPromise: Not initialized yet.\");\n      // Prevent issues if the getter is accessed *before* the `onePageRendered`\n      // promise has resolved; won't (normally) happen in the default viewer.\n      return this.pdfDocument.getOptionalContentConfig({ intent: \"display\" });\n    }\n    return this._optionalContentConfigPromise;\n  }\n\n  /**\n   * @param {Promise<OptionalContentConfig>} promise - A promise that is\n   *   resolved with an {@link OptionalContentConfig} instance.\n   */\n  set optionalContentConfigPromise(promise) {\n    if (!(promise instanceof Promise)) {\n      throw new Error(`Invalid optionalContentConfigPromise: ${promise}`);\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (!this._optionalContentConfigPromise) {\n      // Ignore the setter *before* the `onePageRendered` promise has resolved,\n      // since it'll be overwritten anyway; won't happen in the default viewer.\n      return;\n    }\n    this._optionalContentConfigPromise = promise;\n\n    this.refresh(false, { optionalContentConfigPromise: promise });\n\n    this.eventBus.dispatch(\"optionalcontentconfigchanged\", {\n      source: this,\n      promise,\n    });\n  }\n\n  /**\n   * @type {number} One of the values in {ScrollMode}.\n   */\n  get scrollMode() {\n    return this._scrollMode;\n  }\n\n  /**\n   * @param {number} mode - The direction in which the document pages should be\n   *   laid out within the scrolling container.\n   *   The constants from {ScrollMode} should be used.\n   */\n  set scrollMode(mode) {\n    if (\n      typeof PDFJSDev === \"undefined\"\n        ? window.isGECKOVIEW\n        : PDFJSDev.test(\"GECKOVIEW\")\n    ) {\n      // NOTE: Always ignore the pageLayout in GeckoView since there's\n      // no UI available to change Scroll/Spread modes for the user.\n      return;\n    }\n    if (this._scrollMode === mode) {\n      return; // The Scroll mode didn't change.\n    }\n    if (!isValidScrollMode(mode)) {\n      throw new Error(`Invalid scroll mode: ${mode}`);\n    }\n    if (this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) {\n      return; // Disabled for performance reasons.\n    }\n    this._previousScrollMode = this._scrollMode;\n\n    this._scrollMode = mode;\n    this.eventBus.dispatch(\"scrollmodechanged\", { source: this, mode });\n\n    this._updateScrollMode(/* pageNumber = */ this._currentPageNumber);\n  }\n\n  _updateScrollMode(pageNumber = null) {\n    const scrollMode = this._scrollMode,\n      viewer = this.viewer;\n\n    viewer.classList.toggle(\n      \"scrollHorizontal\",\n      scrollMode === ScrollMode.HORIZONTAL\n    );\n    viewer.classList.toggle(\"scrollWrapped\", scrollMode === ScrollMode.WRAPPED);\n\n    if (!this.pdfDocument || !pageNumber) {\n      return;\n    }\n\n    if (scrollMode === ScrollMode.PAGE) {\n      this.#ensurePageViewVisible();\n    } else if (this._previousScrollMode === ScrollMode.PAGE) {\n      // Ensure that the current spreadMode is still applied correctly when\n      // the *previous* scrollMode was `ScrollMode.PAGE`.\n      this._updateSpreadMode();\n    }\n    // Non-numeric scale values can be sensitive to the scroll orientation.\n    // Call this before re-scrolling to the current page, to ensure that any\n    // changes in scale don't move the current page.\n    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n      this.#setScale(this._currentScaleValue, { noScroll: true });\n    }\n    this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n    this.update();\n  }\n\n  /**\n   * @type {number} One of the values in {SpreadMode}.\n   */\n  get spreadMode() {\n    return this._spreadMode;\n  }\n\n  /**\n   * @param {number} mode - Group the pages in spreads, starting with odd- or\n   *   even-number pages (unless `SpreadMode.NONE` is used).\n   *   The constants from {SpreadMode} should be used.\n   */\n  set spreadMode(mode) {\n    if (\n      typeof PDFJSDev === \"undefined\"\n        ? window.isGECKOVIEW\n        : PDFJSDev.test(\"GECKOVIEW\")\n    ) {\n      // NOTE: Always ignore the pageLayout in GeckoView since there's\n      // no UI available to change Scroll/Spread modes for the user.\n      return;\n    }\n    if (this._spreadMode === mode) {\n      return; // The Spread mode didn't change.\n    }\n    if (!isValidSpreadMode(mode)) {\n      throw new Error(`Invalid spread mode: ${mode}`);\n    }\n    this._spreadMode = mode;\n    this.eventBus.dispatch(\"spreadmodechanged\", { source: this, mode });\n\n    this._updateSpreadMode(/* pageNumber = */ this._currentPageNumber);\n  }\n\n  _updateSpreadMode(pageNumber = null) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const viewer = this.viewer,\n      pages = this._pages;\n\n    if (this._scrollMode === ScrollMode.PAGE) {\n      this.#ensurePageViewVisible();\n    } else {\n      // Temporarily remove all the pages from the DOM.\n      viewer.textContent = \"\";\n\n      if (this._spreadMode === SpreadMode.NONE) {\n        for (const pageView of this._pages) {\n          viewer.append(pageView.div);\n        }\n      } else {\n        const parity = this._spreadMode - 1;\n        let spread = null;\n        for (let i = 0, ii = pages.length; i < ii; ++i) {\n          if (spread === null) {\n            spread = document.createElement(\"div\");\n            spread.className = \"spread\";\n            viewer.append(spread);\n          } else if (i % 2 === parity) {\n            spread = spread.cloneNode(false);\n            viewer.append(spread);\n          }\n          spread.append(pages[i].div);\n        }\n      }\n    }\n\n    if (!pageNumber) {\n      return;\n    }\n    // Non-numeric scale values can be sensitive to the scroll orientation.\n    // Call this before re-scrolling to the current page, to ensure that any\n    // changes in scale don't move the current page.\n    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n      this.#setScale(this._currentScaleValue, { noScroll: true });\n    }\n    this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n    this.update();\n  }\n\n  /**\n   * @private\n   */\n  _getPageAdvance(currentPageNumber, previous = false) {\n    switch (this._scrollMode) {\n      case ScrollMode.WRAPPED: {\n        const { views } = this._getVisiblePages(),\n          pageLayout = new Map();\n\n        // Determine the current (visible) page layout.\n        for (const { id, y, percent, widthPercent } of views) {\n          if (percent === 0 || widthPercent < 100) {\n            continue;\n          }\n          let yArray = pageLayout.get(y);\n          if (!yArray) {\n            pageLayout.set(y, (yArray ||= []));\n          }\n          yArray.push(id);\n        }\n        // Find the row of the current page.\n        for (const yArray of pageLayout.values()) {\n          const currentIndex = yArray.indexOf(currentPageNumber);\n          if (currentIndex === -1) {\n            continue;\n          }\n          const numPages = yArray.length;\n          if (numPages === 1) {\n            break;\n          }\n          // Handle documents with varying page sizes.\n          if (previous) {\n            for (let i = currentIndex - 1, ii = 0; i >= ii; i--) {\n              const currentId = yArray[i],\n                expectedId = yArray[i + 1] - 1;\n              if (currentId < expectedId) {\n                return currentPageNumber - expectedId;\n              }\n            }\n          } else {\n            for (let i = currentIndex + 1, ii = numPages; i < ii; i++) {\n              const currentId = yArray[i],\n                expectedId = yArray[i - 1] + 1;\n              if (currentId > expectedId) {\n                return expectedId - currentPageNumber;\n              }\n            }\n          }\n          // The current row is \"complete\", advance to the previous/next one.\n          if (previous) {\n            const firstId = yArray[0];\n            if (firstId < currentPageNumber) {\n              return currentPageNumber - firstId + 1;\n            }\n          } else {\n            const lastId = yArray[numPages - 1];\n            if (lastId > currentPageNumber) {\n              return lastId - currentPageNumber + 1;\n            }\n          }\n          break;\n        }\n        break;\n      }\n      case ScrollMode.HORIZONTAL: {\n        break;\n      }\n      case ScrollMode.PAGE:\n      case ScrollMode.VERTICAL: {\n        if (this._spreadMode === SpreadMode.NONE) {\n          break; // Normal vertical scrolling.\n        }\n        const parity = this._spreadMode - 1;\n\n        if (previous && currentPageNumber % 2 !== parity) {\n          break; // Left-hand side page.\n        } else if (!previous && currentPageNumber % 2 === parity) {\n          break; // Right-hand side page.\n        }\n        const { views } = this._getVisiblePages(),\n          expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1;\n\n        for (const { id, percent, widthPercent } of views) {\n          if (id !== expectedId) {\n            continue;\n          }\n          if (percent > 0 && widthPercent === 100) {\n            return 2;\n          }\n          break;\n        }\n        break;\n      }\n    }\n    return 1;\n  }\n\n  /**\n   * Go to the next page, taking scroll/spread-modes into account.\n   * @returns {boolean} Whether navigation occurred.\n   */\n  nextPage() {\n    const currentPageNumber = this._currentPageNumber,\n      pagesCount = this.pagesCount;\n\n    if (currentPageNumber >= pagesCount) {\n      return false;\n    }\n    const advance =\n      this._getPageAdvance(currentPageNumber, /* previous = */ false) || 1;\n\n    this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount);\n    return true;\n  }\n\n  /**\n   * Go to the previous page, taking scroll/spread-modes into account.\n   * @returns {boolean} Whether navigation occurred.\n   */\n  previousPage() {\n    const currentPageNumber = this._currentPageNumber;\n\n    if (currentPageNumber <= 1) {\n      return false;\n    }\n    const advance =\n      this._getPageAdvance(currentPageNumber, /* previous = */ true) || 1;\n\n    this.currentPageNumber = Math.max(currentPageNumber - advance, 1);\n    return true;\n  }\n\n  /**\n   * @typedef {Object} ChangeScaleOptions\n   * @property {number} [drawingDelay]\n   * @property {number} [scaleFactor]\n   * @property {number} [steps]\n   * @property {Array} [origin] x and y coordinates of the scale\n   *                            transformation origin.\n   */\n\n  /**\n   * Changes the current zoom level by the specified amount.\n   * @param {ChangeScaleOptions} [options]\n   */\n  updateScale({ drawingDelay, scaleFactor = null, steps = null, origin }) {\n    if (steps === null && scaleFactor === null) {\n      throw new Error(\n        \"Invalid updateScale options: either `steps` or `scaleFactor` must be provided.\"\n      );\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    let newScale = this._currentScale;\n    if (scaleFactor > 0 && scaleFactor !== 1) {\n      newScale = Math.round(newScale * scaleFactor * 100) / 100;\n    } else if (steps) {\n      const delta = steps > 0 ? DEFAULT_SCALE_DELTA : 1 / DEFAULT_SCALE_DELTA;\n      const round = steps > 0 ? Math.ceil : Math.floor;\n      steps = Math.abs(steps);\n      do {\n        newScale = round((newScale * delta).toFixed(2) * 10) / 10;\n      } while (--steps > 0);\n    }\n    newScale = Math.max(MIN_SCALE, Math.min(MAX_SCALE, newScale));\n    this.#setScale(newScale, { noScroll: false, drawingDelay, origin });\n  }\n\n  /**\n   * Increase the current zoom level one, or more, times.\n   * @param {ChangeScaleOptions} [options]\n   */\n  increaseScale(options = {}) {\n    this.updateScale({ ...options, steps: options.steps ?? 1 });\n  }\n\n  /**\n   * Decrease the current zoom level one, or more, times.\n   * @param {ChangeScaleOptions} [options]\n   */\n  decreaseScale(options = {}) {\n    this.updateScale({ ...options, steps: -(options.steps ?? 1) });\n  }\n\n  #updateContainerHeightCss(height = this.container.clientHeight) {\n    if (height !== this.#previousContainerHeight) {\n      this.#previousContainerHeight = height;\n      docStyle.setProperty(\"--viewer-container-height\", `${height}px`);\n    }\n  }\n\n  #resizeObserverCallback(entries) {\n    for (const entry of entries) {\n      if (entry.target === this.container) {\n        this.#updateContainerHeightCss(\n          Math.floor(entry.borderBoxSize[0].blockSize)\n        );\n        this.#containerTopLeft = null;\n        break;\n      }\n    }\n  }\n\n  get containerTopLeft() {\n    return (this.#containerTopLeft ||= [\n      this.container.offsetTop,\n      this.container.offsetLeft,\n    ]);\n  }\n\n  #cleanupSwitchAnnotationEditorMode() {\n    this.#switchAnnotationEditorModeAC?.abort();\n    this.#switchAnnotationEditorModeAC = null;\n\n    if (this.#switchAnnotationEditorModeTimeoutId !== null) {\n      clearTimeout(this.#switchAnnotationEditorModeTimeoutId);\n      this.#switchAnnotationEditorModeTimeoutId = null;\n    }\n  }\n\n  get annotationEditorMode() {\n    return this.#annotationEditorUIManager\n      ? this.#annotationEditorMode\n      : AnnotationEditorType.DISABLE;\n  }\n\n  /**\n   * @typedef {Object} AnnotationEditorModeOptions\n   * @property {number} mode - The editor mode (none, FreeText, ink, ...).\n   * @property {string|null} [editId] - ID of the existing annotation to edit.\n   * @property {boolean} [isFromKeyboard] - True if the mode change is due to a\n   *   keyboard action.\n   */\n\n  /**\n   * @param {AnnotationEditorModeOptions} options\n   */\n  set annotationEditorMode({ mode, editId = null, isFromKeyboard = false }) {\n    if (!this.#annotationEditorUIManager) {\n      throw new Error(`The AnnotationEditor is not enabled.`);\n    }\n    if (this.#annotationEditorMode === mode) {\n      return; // The AnnotationEditor mode didn't change.\n    }\n    if (!isValidAnnotationEditorMode(mode)) {\n      throw new Error(`Invalid AnnotationEditor mode: ${mode}`);\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (mode === AnnotationEditorType.STAMP) {\n      this.#mlManager?.loadModel(\"altText\");\n    }\n\n    const { eventBus } = this;\n    const updater = () => {\n      this.#cleanupSwitchAnnotationEditorMode();\n      this.#annotationEditorMode = mode;\n      this.#annotationEditorUIManager.updateMode(mode, editId, isFromKeyboard);\n      eventBus.dispatch(\"annotationeditormodechanged\", {\n        source: this,\n        mode,\n      });\n    };\n\n    if (\n      mode === AnnotationEditorType.NONE ||\n      this.#annotationEditorMode === AnnotationEditorType.NONE\n    ) {\n      const isEditing = mode !== AnnotationEditorType.NONE;\n      if (!isEditing) {\n        this.pdfDocument.annotationStorage.resetModifiedIds();\n      }\n      for (const pageView of this._pages) {\n        pageView.toggleEditingMode(isEditing);\n      }\n      // We must call #switchToEditAnnotationMode unconditionally to ensure that\n      // page is rendered if it's useful or not.\n      const idsToRefresh = this.#switchToEditAnnotationMode();\n      if (isEditing && idsToRefresh) {\n        // We're editing so we must switch to editing mode when the rendering is\n        // done.\n        this.#cleanupSwitchAnnotationEditorMode();\n        this.#switchAnnotationEditorModeAC = new AbortController();\n        const signal = AbortSignal.any([\n          this.#eventAbortController.signal,\n          this.#switchAnnotationEditorModeAC.signal,\n        ]);\n\n        eventBus._on(\n          \"pagerendered\",\n          ({ pageNumber }) => {\n            idsToRefresh.delete(pageNumber);\n            if (idsToRefresh.size === 0) {\n              this.#switchAnnotationEditorModeTimeoutId = setTimeout(\n                updater,\n                0\n              );\n            }\n          },\n          { signal }\n        );\n        return;\n      }\n    }\n    updater();\n  }\n\n  refresh(noUpdate = false, updateArgs = Object.create(null)) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    for (const pageView of this._pages) {\n      pageView.update(updateArgs);\n    }\n    if (this.#scaleTimeoutId !== null) {\n      clearTimeout(this.#scaleTimeoutId);\n      this.#scaleTimeoutId = null;\n    }\n    if (!noUpdate) {\n      this.update();\n    }\n  }\n}\n\nexport { PagesCountLimit, PDFPageViewBuffer, PDFViewer };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ScrollMode, SpreadMode } from \"./ui_utils.js\";\nimport { PDFViewer } from \"./pdf_viewer.js\";\n\nclass PDFSinglePageViewer extends PDFViewer {\n  _resetView() {\n    super._resetView();\n    this._scrollMode = ScrollMode.PAGE;\n    this._spreadMode = SpreadMode.NONE;\n  }\n\n  // eslint-disable-next-line accessor-pairs\n  set scrollMode(mode) {}\n\n  _updateScrollMode() {}\n\n  // eslint-disable-next-line accessor-pairs\n  set spreadMode(mode) {}\n\n  _updateSpreadMode() {}\n}\n\nexport { PDFSinglePageViewer };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FindState, PDFFindController } from \"./pdf_find_controller.js\";\nimport {\n  LinkTarget,\n  PDFLinkService,\n  SimpleLinkService,\n} from \"./pdf_link_service.js\";\nimport {\n  parseQueryString,\n  ProgressBar,\n  RenderingStates,\n  ScrollMode,\n  SpreadMode,\n} from \"./ui_utils.js\";\nimport { AnnotationLayerBuilder } from \"./annotation_layer_builder.js\";\nimport { DownloadManager } from \"./download_manager.js\";\nimport { EventBus } from \"./event_utils.js\";\nimport { GenericL10n } from \"./genericl10n.js\";\nimport { PDFHistory } from \"./pdf_history.js\";\nimport { PDFPageView } from \"./pdf_page_view.js\";\nimport { PDFScriptingManager } from \"./pdf_scripting_manager.component.js\";\nimport { PDFSinglePageViewer } from \"./pdf_single_page_viewer.js\";\nimport { PDFViewer } from \"./pdf_viewer.js\";\nimport { StructTreeLayerBuilder } from \"./struct_tree_layer_builder.js\";\nimport { TextLayerBuilder } from \"./text_layer_builder.js\";\nimport { XfaLayerBuilder } from \"./xfa_layer_builder.js\";\n\n/* eslint-disable-next-line no-unused-vars */\nconst pdfjsVersion =\n  typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_VERSION\") : void 0;\n/* eslint-disable-next-line no-unused-vars */\nconst pdfjsBuild =\n  typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_BUILD\") : void 0;\n\nexport {\n  AnnotationLayerBuilder,\n  DownloadManager,\n  EventBus,\n  FindState,\n  GenericL10n,\n  LinkTarget,\n  parseQueryString,\n  PDFFindController,\n  PDFHistory,\n  PDFLinkService,\n  PDFPageView,\n  PDFScriptingManager,\n  PDFSinglePageViewer,\n  PDFViewer,\n  ProgressBar,\n  RenderingStates,\n  ScrollMode,\n  SimpleLinkService,\n  SpreadMode,\n  StructTreeLayerBuilder,\n  TextLayerBuilder,\n  XfaLayerBuilder,\n};\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\nimport { b as setCSSProperty, e as elementChildren, s as setInnerHTML, c as createElement } from '../shared/utils.mjs';\n\nfunction Virtual({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  extendParams({\n    virtual: {\n      enabled: false,\n      slides: [],\n      cache: true,\n      slidesPerViewAutoSlideSize: 320,\n      renderSlide: null,\n      renderExternal: null,\n      renderExternalUpdate: true,\n      addSlidesBefore: 0,\n      addSlidesAfter: 0\n    }\n  });\n  let cssModeTimeout;\n  const document = getDocument();\n  swiper.virtual = {\n    cache: {},\n    from: undefined,\n    to: undefined,\n    slides: [],\n    offset: 0,\n    slidesGrid: []\n  };\n  const tempDOM = document.createElement('div');\n  function renderSlide(slide, index) {\n    const params = swiper.params.virtual;\n    if (params.cache && swiper.virtual.cache[index]) {\n      return swiper.virtual.cache[index];\n    }\n    // eslint-disable-next-line\n    let slideEl;\n    if (params.renderSlide) {\n      slideEl = params.renderSlide.call(swiper, slide, index);\n      if (typeof slideEl === 'string') {\n        setInnerHTML(tempDOM, slideEl);\n        slideEl = tempDOM.children[0];\n      }\n    } else if (swiper.isElement) {\n      slideEl = createElement('swiper-slide');\n    } else {\n      slideEl = createElement('div', swiper.params.slideClass);\n    }\n    slideEl.setAttribute('data-swiper-slide-index', index);\n    if (!params.renderSlide) {\n      setInnerHTML(slideEl, slide);\n    }\n    if (params.cache) {\n      swiper.virtual.cache[index] = slideEl;\n    }\n    return slideEl;\n  }\n  function update(force, beforeInit, forceActiveIndex) {\n    const {\n      slidesPerGroup,\n      centeredSlides,\n      slidesPerView,\n      loop: isLoop,\n      initialSlide\n    } = swiper.params;\n    if (beforeInit && !isLoop && initialSlide > 0) {\n      return;\n    }\n    const {\n      addSlidesBefore,\n      addSlidesAfter,\n      slidesPerViewAutoSlideSize\n    } = swiper.params.virtual;\n    const {\n      from: previousFrom,\n      to: previousTo,\n      slides,\n      slidesGrid: previousSlidesGrid,\n      offset: previousOffset\n    } = swiper.virtual;\n    if (!swiper.params.cssMode) {\n      swiper.updateActiveIndex();\n    }\n    const activeIndex = typeof forceActiveIndex === 'undefined' ? swiper.activeIndex || 0 : forceActiveIndex;\n    let offsetProp;\n    if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n    let slidesPerViewNumeric;\n    if (slidesPerView === 'auto') {\n      if (slidesPerViewAutoSlideSize) {\n        let swiperSize = swiper.size;\n        if (!swiperSize) {\n          swiperSize = swiper.isHorizontal() ? swiper.el.getBoundingClientRect().width : swiper.el.getBoundingClientRect().height;\n        }\n        slidesPerViewNumeric = Math.max(1, Math.ceil(swiperSize / slidesPerViewAutoSlideSize));\n      } else {\n        slidesPerViewNumeric = 1;\n      }\n    } else {\n      slidesPerViewNumeric = slidesPerView;\n    }\n    let slidesAfter;\n    let slidesBefore;\n    if (centeredSlides) {\n      slidesAfter = Math.floor(slidesPerViewNumeric / 2) + slidesPerGroup + addSlidesAfter;\n      slidesBefore = Math.floor(slidesPerViewNumeric / 2) + slidesPerGroup + addSlidesBefore;\n    } else {\n      slidesAfter = slidesPerViewNumeric + (slidesPerGroup - 1) + addSlidesAfter;\n      slidesBefore = (isLoop ? slidesPerViewNumeric : slidesPerGroup) + addSlidesBefore;\n    }\n    let from = activeIndex - slidesBefore;\n    let to = activeIndex + slidesAfter;\n    if (!isLoop) {\n      from = Math.max(from, 0);\n      to = Math.min(to, slides.length - 1);\n    }\n    let offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n    if (isLoop && activeIndex >= slidesBefore) {\n      from -= slidesBefore;\n      if (!centeredSlides) offset += swiper.slidesGrid[0];\n    } else if (isLoop && activeIndex < slidesBefore) {\n      from = -slidesBefore;\n      if (centeredSlides) offset += swiper.slidesGrid[0];\n    }\n    Object.assign(swiper.virtual, {\n      from,\n      to,\n      offset,\n      slidesGrid: swiper.slidesGrid,\n      slidesBefore,\n      slidesAfter\n    });\n    function onRendered() {\n      swiper.updateSlides();\n      swiper.updateProgress();\n      swiper.updateSlidesClasses();\n      emit('virtualUpdate');\n    }\n    if (previousFrom === from && previousTo === to && !force) {\n      if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n        swiper.slides.forEach(slideEl => {\n          slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;\n        });\n      }\n      swiper.updateProgress();\n      emit('virtualUpdate');\n      return;\n    }\n    if (swiper.params.virtual.renderExternal) {\n      swiper.params.virtual.renderExternal.call(swiper, {\n        offset,\n        from,\n        to,\n        slides: function getSlides() {\n          const slidesToRender = [];\n          for (let i = from; i <= to; i += 1) {\n            slidesToRender.push(slides[i]);\n          }\n          return slidesToRender;\n        }()\n      });\n      if (swiper.params.virtual.renderExternalUpdate) {\n        onRendered();\n      } else {\n        emit('virtualUpdate');\n      }\n      return;\n    }\n    const prependIndexes = [];\n    const appendIndexes = [];\n    const getSlideIndex = index => {\n      let slideIndex = index;\n      if (index < 0) {\n        slideIndex = slides.length + index;\n      } else if (slideIndex >= slides.length) {\n        // eslint-disable-next-line\n        slideIndex = slideIndex - slides.length;\n      }\n      return slideIndex;\n    };\n    if (force) {\n      swiper.slides.filter(el => el.matches(`.${swiper.params.slideClass}, swiper-slide`)).forEach(slideEl => {\n        slideEl.remove();\n      });\n    } else {\n      for (let i = previousFrom; i <= previousTo; i += 1) {\n        if (i < from || i > to) {\n          const slideIndex = getSlideIndex(i);\n          swiper.slides.filter(el => el.matches(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${slideIndex}\"], swiper-slide[data-swiper-slide-index=\"${slideIndex}\"]`)).forEach(slideEl => {\n            slideEl.remove();\n          });\n        }\n      }\n    }\n    const loopFrom = isLoop ? -slides.length : 0;\n    const loopTo = isLoop ? slides.length * 2 : slides.length;\n    for (let i = loopFrom; i < loopTo; i += 1) {\n      if (i >= from && i <= to) {\n        const slideIndex = getSlideIndex(i);\n        if (typeof previousTo === 'undefined' || force) {\n          appendIndexes.push(slideIndex);\n        } else {\n          if (i > previousTo) appendIndexes.push(slideIndex);\n          if (i < previousFrom) prependIndexes.push(slideIndex);\n        }\n      }\n    }\n    appendIndexes.forEach(index => {\n      swiper.slidesEl.append(renderSlide(slides[index], index));\n    });\n    if (isLoop) {\n      for (let i = prependIndexes.length - 1; i >= 0; i -= 1) {\n        const index = prependIndexes[i];\n        swiper.slidesEl.prepend(renderSlide(slides[index], index));\n      }\n    } else {\n      prependIndexes.sort((a, b) => b - a);\n      prependIndexes.forEach(index => {\n        swiper.slidesEl.prepend(renderSlide(slides[index], index));\n      });\n    }\n    elementChildren(swiper.slidesEl, '.swiper-slide, swiper-slide').forEach(slideEl => {\n      slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;\n    });\n    onRendered();\n  }\n  function appendSlide(slides) {\n    if (typeof slides === 'object' && 'length' in slides) {\n      for (let i = 0; i < slides.length; i += 1) {\n        if (slides[i]) swiper.virtual.slides.push(slides[i]);\n      }\n    } else {\n      swiper.virtual.slides.push(slides);\n    }\n    update(true);\n  }\n  function prependSlide(slides) {\n    const activeIndex = swiper.activeIndex;\n    let newActiveIndex = activeIndex + 1;\n    let numberOfNewSlides = 1;\n    if (Array.isArray(slides)) {\n      for (let i = 0; i < slides.length; i += 1) {\n        if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n      }\n      newActiveIndex = activeIndex + slides.length;\n      numberOfNewSlides = slides.length;\n    } else {\n      swiper.virtual.slides.unshift(slides);\n    }\n    if (swiper.params.virtual.cache) {\n      const cache = swiper.virtual.cache;\n      const newCache = {};\n      Object.keys(cache).forEach(cachedIndex => {\n        const cachedEl = cache[cachedIndex];\n        const cachedElIndex = cachedEl.getAttribute('data-swiper-slide-index');\n        if (cachedElIndex) {\n          cachedEl.setAttribute('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides);\n        }\n        newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cachedEl;\n      });\n      swiper.virtual.cache = newCache;\n    }\n    update(true);\n    swiper.slideTo(newActiveIndex, 0);\n  }\n  function removeSlide(slidesIndexes) {\n    if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n    let activeIndex = swiper.activeIndex;\n    if (Array.isArray(slidesIndexes)) {\n      for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n        if (swiper.params.virtual.cache) {\n          delete swiper.virtual.cache[slidesIndexes[i]];\n          // shift cache indexes\n          Object.keys(swiper.virtual.cache).forEach(key => {\n            if (key > slidesIndexes) {\n              swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];\n              swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);\n              delete swiper.virtual.cache[key];\n            }\n          });\n        }\n        swiper.virtual.slides.splice(slidesIndexes[i], 1);\n        if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n        activeIndex = Math.max(activeIndex, 0);\n      }\n    } else {\n      if (swiper.params.virtual.cache) {\n        delete swiper.virtual.cache[slidesIndexes];\n        // shift cache indexes\n        Object.keys(swiper.virtual.cache).forEach(key => {\n          if (key > slidesIndexes) {\n            swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];\n            swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);\n            delete swiper.virtual.cache[key];\n          }\n        });\n      }\n      swiper.virtual.slides.splice(slidesIndexes, 1);\n      if (slidesIndexes < activeIndex) activeIndex -= 1;\n      activeIndex = Math.max(activeIndex, 0);\n    }\n    update(true);\n    swiper.slideTo(activeIndex, 0);\n  }\n  function removeAllSlides() {\n    swiper.virtual.slides = [];\n    if (swiper.params.virtual.cache) {\n      swiper.virtual.cache = {};\n    }\n    update(true);\n    swiper.slideTo(0, 0);\n  }\n  on('beforeInit', () => {\n    if (!swiper.params.virtual.enabled) return;\n    let domSlidesAssigned;\n    if (typeof swiper.passedParams.virtual.slides === 'undefined') {\n      const slides = [...swiper.slidesEl.children].filter(el => el.matches(`.${swiper.params.slideClass}, swiper-slide`));\n      if (slides && slides.length) {\n        swiper.virtual.slides = [...slides];\n        domSlidesAssigned = true;\n        slides.forEach((slideEl, slideIndex) => {\n          slideEl.setAttribute('data-swiper-slide-index', slideIndex);\n          swiper.virtual.cache[slideIndex] = slideEl;\n          slideEl.remove();\n        });\n      }\n    }\n    if (!domSlidesAssigned) {\n      swiper.virtual.slides = swiper.params.virtual.slides;\n    }\n    swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n    swiper.params.watchSlidesProgress = true;\n    swiper.originalParams.watchSlidesProgress = true;\n    update(false, true);\n  });\n  on('setTranslate', () => {\n    if (!swiper.params.virtual.enabled) return;\n    if (swiper.params.cssMode && !swiper._immediateVirtual) {\n      clearTimeout(cssModeTimeout);\n      cssModeTimeout = setTimeout(() => {\n        update();\n      }, 100);\n    } else {\n      update();\n    }\n  });\n  on('init update resize', () => {\n    if (!swiper.params.virtual.enabled) return;\n    if (swiper.params.cssMode) {\n      setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n    }\n  });\n  Object.assign(swiper.virtual, {\n    appendSlide,\n    prependSlide,\n    removeSlide,\n    removeAllSlides,\n    update\n  });\n}\n\nexport { Virtual as default };\n","import { g as getDocument, a as getWindow } from '../shared/ssr-window.esm.mjs';\nimport { d as elementParents, f as elementOffset } from '../shared/utils.mjs';\n\n/* eslint-disable consistent-return */\nfunction Keyboard({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const document = getDocument();\n  const window = getWindow();\n  swiper.keyboard = {\n    enabled: false\n  };\n  extendParams({\n    keyboard: {\n      enabled: false,\n      onlyInViewport: true,\n      pageUpDown: true,\n      speed: undefined\n    }\n  });\n  function handle(event) {\n    if (!swiper.enabled) return;\n    const {\n      rtlTranslate: rtl\n    } = swiper;\n    let e = event;\n    if (e.originalEvent) e = e.originalEvent; // jquery fix\n    const kc = e.keyCode || e.charCode;\n    const pageUpDown = swiper.params.keyboard.pageUpDown;\n    const isPageUp = pageUpDown && kc === 33;\n    const isPageDown = pageUpDown && kc === 34;\n    const isArrowLeft = kc === 37;\n    const isArrowRight = kc === 39;\n    const isArrowUp = kc === 38;\n    const isArrowDown = kc === 40;\n    // Directions locks\n    if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) {\n      return false;\n    }\n    if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) {\n      return false;\n    }\n    if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n      return undefined;\n    }\n    if (document.activeElement && (document.activeElement.isContentEditable || document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea'))) {\n      return undefined;\n    }\n    if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {\n      let inView = false;\n      // Check that swiper should be inside of visible area of window\n      if (elementParents(swiper.el, `.${swiper.params.slideClass}, swiper-slide`).length > 0 && elementParents(swiper.el, `.${swiper.params.slideActiveClass}`).length === 0) {\n        return undefined;\n      }\n      const el = swiper.el;\n      const swiperWidth = el.clientWidth;\n      const swiperHeight = el.clientHeight;\n      const windowWidth = window.innerWidth;\n      const windowHeight = window.innerHeight;\n      const swiperOffset = elementOffset(el);\n      if (rtl) swiperOffset.left -= el.scrollLeft;\n      const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]];\n      for (let i = 0; i < swiperCoord.length; i += 1) {\n        const point = swiperCoord[i];\n        if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n          if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n          inView = true;\n        }\n      }\n      if (!inView) return undefined;\n    }\n    const speed = swiper.params.keyboard.speed;\n    if (swiper.isHorizontal()) {\n      if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n        if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n      }\n      if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext(speed);\n      if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev(speed);\n    } else {\n      if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n        if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n      }\n      if (isPageDown || isArrowDown) swiper.slideNext(speed);\n      if (isPageUp || isArrowUp) swiper.slidePrev(speed);\n    }\n    emit('keyPress', kc);\n    return undefined;\n  }\n  function enable() {\n    if (swiper.keyboard.enabled) return;\n    document.addEventListener('keydown', handle);\n    swiper.keyboard.enabled = true;\n  }\n  function disable() {\n    if (!swiper.keyboard.enabled) return;\n    document.removeEventListener('keydown', handle);\n    swiper.keyboard.enabled = false;\n  }\n  on('init', () => {\n    if (swiper.params.keyboard.enabled) {\n      enable();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.keyboard.enabled) {\n      disable();\n    }\n  });\n  Object.assign(swiper.keyboard, {\n    enable,\n    disable\n  });\n}\n\nexport { Keyboard as default };\n","import { a as getWindow } from '../shared/ssr-window.esm.mjs';\nimport { n as nextTick, h as now } from '../shared/utils.mjs';\n\n/* eslint-disable consistent-return */\nfunction Mousewheel({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const window = getWindow();\n  extendParams({\n    mousewheel: {\n      enabled: false,\n      releaseOnEdges: false,\n      invert: false,\n      forceToAxis: false,\n      sensitivity: 1,\n      eventsTarget: 'container',\n      thresholdDelta: null,\n      thresholdTime: null,\n      noMousewheelClass: 'swiper-no-mousewheel'\n    }\n  });\n  swiper.mousewheel = {\n    enabled: false\n  };\n  let timeout;\n  let lastScrollTime = now();\n  let lastEventBeforeSnap;\n  const recentWheelEvents = [];\n  function normalize(e) {\n    // Reasonable defaults\n    const PIXEL_STEP = 10;\n    const LINE_HEIGHT = 40;\n    const PAGE_HEIGHT = 800;\n    let sX = 0;\n    let sY = 0; // spinX, spinY\n    let pX = 0;\n    let pY = 0; // pixelX, pixelY\n\n    // Legacy\n    if ('detail' in e) {\n      sY = e.detail;\n    }\n    if ('wheelDelta' in e) {\n      sY = -e.wheelDelta / 120;\n    }\n    if ('wheelDeltaY' in e) {\n      sY = -e.wheelDeltaY / 120;\n    }\n    if ('wheelDeltaX' in e) {\n      sX = -e.wheelDeltaX / 120;\n    }\n\n    // side scrolling on FF with DOMMouseScroll\n    if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n      sX = sY;\n      sY = 0;\n    }\n    pX = sX * PIXEL_STEP;\n    pY = sY * PIXEL_STEP;\n    if ('deltaY' in e) {\n      pY = e.deltaY;\n    }\n    if ('deltaX' in e) {\n      pX = e.deltaX;\n    }\n    if (e.shiftKey && !pX) {\n      // if user scrolls with shift he wants horizontal scroll\n      pX = pY;\n      pY = 0;\n    }\n    if ((pX || pY) && e.deltaMode) {\n      if (e.deltaMode === 1) {\n        // delta in LINE units\n        pX *= LINE_HEIGHT;\n        pY *= LINE_HEIGHT;\n      } else {\n        // delta in PAGE units\n        pX *= PAGE_HEIGHT;\n        pY *= PAGE_HEIGHT;\n      }\n    }\n\n    // Fall-back if spin cannot be determined\n    if (pX && !sX) {\n      sX = pX < 1 ? -1 : 1;\n    }\n    if (pY && !sY) {\n      sY = pY < 1 ? -1 : 1;\n    }\n    return {\n      spinX: sX,\n      spinY: sY,\n      pixelX: pX,\n      pixelY: pY\n    };\n  }\n  function handleMouseEnter() {\n    if (!swiper.enabled) return;\n    swiper.mouseEntered = true;\n  }\n  function handleMouseLeave() {\n    if (!swiper.enabled) return;\n    swiper.mouseEntered = false;\n  }\n  function animateSlider(newEvent) {\n    if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) {\n      // Prevent if delta of wheel scroll delta is below configured threshold\n      return false;\n    }\n    if (swiper.params.mousewheel.thresholdTime && now() - lastScrollTime < swiper.params.mousewheel.thresholdTime) {\n      // Prevent if time between scrolls is below configured threshold\n      return false;\n    }\n\n    // If the movement is NOT big enough and\n    // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n    //   Don't go any further (avoid insignificant scroll movement).\n    if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {\n      // Return false as a default\n      return true;\n    }\n    // If user is scrolling towards the end:\n    //   If the slider hasn't hit the latest slide or\n    //   if the slider is a loop and\n    //   if the slider isn't moving right now:\n    //     Go to next slide and\n    //     emit a scroll event.\n    // Else (the user is scrolling towards the beginning) and\n    // if the slider hasn't hit the first slide or\n    // if the slider is a loop and\n    // if the slider isn't moving right now:\n    //   Go to prev slide and\n    //   emit a scroll event.\n    if (newEvent.direction < 0) {\n      if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n        swiper.slideNext();\n        emit('scroll', newEvent.raw);\n      }\n    } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n      swiper.slidePrev();\n      emit('scroll', newEvent.raw);\n    }\n    // If you got here is because an animation has been triggered so store the current time\n    lastScrollTime = new window.Date().getTime();\n    // Return false as a default\n    return false;\n  }\n  function releaseScroll(newEvent) {\n    const params = swiper.params.mousewheel;\n    if (newEvent.direction < 0) {\n      if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n        // Return true to animate scroll on edges\n        return true;\n      }\n    } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n      // Return true to animate scroll on edges\n      return true;\n    }\n    return false;\n  }\n  function handle(event) {\n    let e = event;\n    let disableParentSwiper = true;\n    if (!swiper.enabled) return;\n\n    // Ignore event if the target or its parents have the swiper-no-mousewheel class\n    if (event.target.closest(`.${swiper.params.mousewheel.noMousewheelClass}`)) return;\n    const params = swiper.params.mousewheel;\n    if (swiper.params.cssMode) {\n      e.preventDefault();\n    }\n    let targetEl = swiper.el;\n    if (swiper.params.mousewheel.eventsTarget !== 'container') {\n      targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);\n    }\n    const targetElContainsTarget = targetEl && targetEl.contains(e.target);\n    if (!swiper.mouseEntered && !targetElContainsTarget && !params.releaseOnEdges) return true;\n    if (e.originalEvent) e = e.originalEvent; // jquery fix\n    let delta = 0;\n    const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n    const data = normalize(e);\n    if (params.forceToAxis) {\n      if (swiper.isHorizontal()) {\n        if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;\n      } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;\n    } else {\n      delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n    }\n    if (delta === 0) return true;\n    if (params.invert) delta = -delta;\n\n    // Get the scroll positions\n    let positions = swiper.getTranslate() + delta * params.sensitivity;\n    if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n    if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();\n\n    // When loop is true:\n    //     the disableParentSwiper will be true.\n    // When loop is false:\n    //     if the scroll positions is not on edge,\n    //     then the disableParentSwiper will be true.\n    //     if the scroll on edge positions,\n    //     then the disableParentSwiper will be false.\n    disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n    if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n    if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n      // Register the new event in a variable which stores the relevant data\n      const newEvent = {\n        time: now(),\n        delta: Math.abs(delta),\n        direction: Math.sign(delta),\n        raw: event\n      };\n\n      // Keep the most recent events\n      if (recentWheelEvents.length >= 2) {\n        recentWheelEvents.shift(); // only store the last N events\n      }\n\n      const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;\n      recentWheelEvents.push(newEvent);\n\n      // If there is at least one previous recorded event:\n      //   If direction has changed or\n      //   if the scroll is quicker than the previous one:\n      //     Animate the slider.\n      // Else (this is the first time the wheel is moved):\n      //     Animate the slider.\n      if (prevEvent) {\n        if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {\n          animateSlider(newEvent);\n        }\n      } else {\n        animateSlider(newEvent);\n      }\n\n      // If it's time to release the scroll:\n      //   Return now so you don't hit the preventDefault.\n      if (releaseScroll(newEvent)) {\n        return true;\n      }\n    } else {\n      // Freemode or scrollContainer:\n\n      // If we recently snapped after a momentum scroll, then ignore wheel events\n      // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n      // or if it's a new scroll (larger delta or inverse sign as last event before\n      // an end-of-momentum snap).\n      const newEvent = {\n        time: now(),\n        delta: Math.abs(delta),\n        direction: Math.sign(delta)\n      };\n      const ignoreWheelEvents = lastEventBeforeSnap && newEvent.time < lastEventBeforeSnap.time + 500 && newEvent.delta <= lastEventBeforeSnap.delta && newEvent.direction === lastEventBeforeSnap.direction;\n      if (!ignoreWheelEvents) {\n        lastEventBeforeSnap = undefined;\n        let position = swiper.getTranslate() + delta * params.sensitivity;\n        const wasBeginning = swiper.isBeginning;\n        const wasEnd = swiper.isEnd;\n        if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n        if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n        swiper.setTransition(0);\n        swiper.setTranslate(position);\n        swiper.updateProgress();\n        swiper.updateActiveIndex();\n        swiper.updateSlidesClasses();\n        if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {\n          swiper.updateSlidesClasses();\n        }\n        if (swiper.params.loop) {\n          swiper.loopFix({\n            direction: newEvent.direction < 0 ? 'next' : 'prev',\n            byMousewheel: true\n          });\n        }\n        if (swiper.params.freeMode.sticky) {\n          // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n          // the end of a momentum scroll by storing recent (N=15?) wheel events.\n          // 1. do all N events have decreasing or same (absolute value) delta?\n          // 2. did all N events arrive in the last M (M=500?) msecs?\n          // 3. does the earliest event have an (absolute value) delta that's\n          //    at least P (P=1?) larger than the most recent event's delta?\n          // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n          // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n          // Snap immediately and ignore remaining wheel events in this scroll.\n          // See comment above for \"remaining wheel events in this scroll\" determination.\n          // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n          clearTimeout(timeout);\n          timeout = undefined;\n          if (recentWheelEvents.length >= 15) {\n            recentWheelEvents.shift(); // only store the last N events\n          }\n\n          const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;\n          const firstEvent = recentWheelEvents[0];\n          recentWheelEvents.push(newEvent);\n          if (prevEvent && (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)) {\n            // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n            recentWheelEvents.splice(0);\n          } else if (recentWheelEvents.length >= 15 && newEvent.time - firstEvent.time < 500 && firstEvent.delta - newEvent.delta >= 1 && newEvent.delta <= 6) {\n            // We're at the end of the deceleration of a momentum scroll, so there's no need\n            // to wait for more events. Snap ASAP on the next tick.\n            // Also, because there's some remaining momentum we'll bias the snap in the\n            // direction of the ongoing scroll because it's better UX for the scroll to snap\n            // in the same direction as the scroll instead of reversing to snap.  Therefore,\n            // if it's already scrolled more than 20% in the current direction, keep going.\n            const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n            lastEventBeforeSnap = newEvent;\n            recentWheelEvents.splice(0);\n            timeout = nextTick(() => {\n              if (swiper.destroyed || !swiper.params) return;\n              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n            }, 0); // no delay; move on next tick\n          }\n\n          if (!timeout) {\n            // if we get here, then we haven't detected the end of a momentum scroll, so\n            // we'll consider a scroll \"complete\" when there haven't been any wheel events\n            // for 500ms.\n            timeout = nextTick(() => {\n              if (swiper.destroyed || !swiper.params) return;\n              const snapToThreshold = 0.5;\n              lastEventBeforeSnap = newEvent;\n              recentWheelEvents.splice(0);\n              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n            }, 500);\n          }\n        }\n\n        // Emit event\n        if (!ignoreWheelEvents) emit('scroll', e);\n\n        // Stop autoplay\n        if (swiper.params.autoplay && swiper.params.autoplay.disableOnInteraction) swiper.autoplay.stop();\n        // Return page scroll on edge positions\n        if (params.releaseOnEdges && (position === swiper.minTranslate() || position === swiper.maxTranslate())) {\n          return true;\n        }\n      }\n    }\n    if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n    return false;\n  }\n  function events(method) {\n    let targetEl = swiper.el;\n    if (swiper.params.mousewheel.eventsTarget !== 'container') {\n      targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);\n    }\n    targetEl[method]('mouseenter', handleMouseEnter);\n    targetEl[method]('mouseleave', handleMouseLeave);\n    targetEl[method]('wheel', handle);\n  }\n  function enable() {\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.removeEventListener('wheel', handle);\n      return true;\n    }\n    if (swiper.mousewheel.enabled) return false;\n    events('addEventListener');\n    swiper.mousewheel.enabled = true;\n    return true;\n  }\n  function disable() {\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.addEventListener(event, handle);\n      return true;\n    }\n    if (!swiper.mousewheel.enabled) return false;\n    events('removeEventListener');\n    swiper.mousewheel.enabled = false;\n    return true;\n  }\n  on('init', () => {\n    if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n      disable();\n    }\n    if (swiper.params.mousewheel.enabled) enable();\n  });\n  on('destroy', () => {\n    if (swiper.params.cssMode) {\n      enable();\n    }\n    if (swiper.mousewheel.enabled) disable();\n  });\n  Object.assign(swiper.mousewheel, {\n    enable,\n    disable\n  });\n}\n\nexport { Mousewheel as default };\n","import { e as elementChildren, c as createElement } from './utils.mjs';\n\nfunction createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n  if (swiper.params.createElements) {\n    Object.keys(checkProps).forEach(key => {\n      if (!params[key] && params.auto === true) {\n        let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0];\n        if (!element) {\n          element = createElement('div', checkProps[key]);\n          element.className = checkProps[key];\n          swiper.el.append(element);\n        }\n        params[key] = element;\n        originalParams[key] = element;\n      }\n    });\n  }\n  return params;\n}\n\nexport { createElementIfNotDefined as c };\n","import { c as createElementIfNotDefined } from '../shared/create-element-if-not-defined.mjs';\nimport { m as makeElementsArray, s as setInnerHTML } from '../shared/utils.mjs';\n\nconst arrowSvg = `<svg class=\"swiper-navigation-icon\" width=\"11\" height=\"20\" viewBox=\"0 0 11 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0.38296 20.0762C0.111788 19.805 0.111788 19.3654 0.38296 19.0942L9.19758 10.2796L0.38296 1.46497C0.111788 1.19379 0.111788 0.754138 0.38296 0.482966C0.654131 0.211794 1.09379 0.211794 1.36496 0.482966L10.4341 9.55214C10.8359 9.9539 10.8359 10.6053 10.4341 11.007L1.36496 20.0762C1.09379 20.3474 0.654131 20.3474 0.38296 20.0762Z\" fill=\"currentColor\"/></svg>`;\nfunction Navigation({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  extendParams({\n    navigation: {\n      nextEl: null,\n      prevEl: null,\n      addIcons: true,\n      hideOnClick: false,\n      disabledClass: 'swiper-button-disabled',\n      hiddenClass: 'swiper-button-hidden',\n      lockClass: 'swiper-button-lock',\n      navigationDisabledClass: 'swiper-navigation-disabled'\n    }\n  });\n  swiper.navigation = {\n    nextEl: null,\n    prevEl: null,\n    arrowSvg\n  };\n  function getEl(el) {\n    let res;\n    if (el && typeof el === 'string' && swiper.isElement) {\n      res = swiper.el.querySelector(el) || swiper.hostEl.querySelector(el);\n      if (res) return res;\n    }\n    if (el) {\n      if (typeof el === 'string') res = [...document.querySelectorAll(el)];\n      if (swiper.params.uniqueNavElements && typeof el === 'string' && res && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) {\n        res = swiper.el.querySelector(el);\n      } else if (res && res.length === 1) {\n        res = res[0];\n      }\n    }\n    if (el && !res) return el;\n    // if (Array.isArray(res) && res.length === 1) res = res[0];\n    return res;\n  }\n  function toggleEl(el, disabled) {\n    const params = swiper.params.navigation;\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      if (subEl) {\n        subEl.classList[disabled ? 'add' : 'remove'](...params.disabledClass.split(' '));\n        if (subEl.tagName === 'BUTTON') subEl.disabled = disabled;\n        if (swiper.params.watchOverflow && swiper.enabled) {\n          subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);\n        }\n      }\n    });\n  }\n  function update() {\n    // Update Navigation Buttons\n    const {\n      nextEl,\n      prevEl\n    } = swiper.navigation;\n    if (swiper.params.loop) {\n      toggleEl(prevEl, false);\n      toggleEl(nextEl, false);\n      return;\n    }\n    toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind);\n    toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind);\n  }\n  function onPrevClick(e) {\n    e.preventDefault();\n    if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return;\n    swiper.slidePrev();\n    emit('navigationPrev');\n  }\n  function onNextClick(e) {\n    e.preventDefault();\n    if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return;\n    swiper.slideNext();\n    emit('navigationNext');\n  }\n  function init() {\n    const params = swiper.params.navigation;\n    swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, {\n      nextEl: 'swiper-button-next',\n      prevEl: 'swiper-button-prev'\n    });\n    if (!(params.nextEl || params.prevEl)) return;\n    let nextEl = getEl(params.nextEl);\n    let prevEl = getEl(params.prevEl);\n    Object.assign(swiper.navigation, {\n      nextEl,\n      prevEl\n    });\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    const initButton = (el, dir) => {\n      if (el) {\n        if (params.addIcons && el.matches('.swiper-button-next,.swiper-button-prev') && !el.querySelector('svg')) {\n          const tempEl = document.createElement('div');\n          setInnerHTML(tempEl, arrowSvg);\n          el.appendChild(tempEl.querySelector('svg'));\n          tempEl.remove();\n        }\n        el.addEventListener('click', dir === 'next' ? onNextClick : onPrevClick);\n      }\n      if (!swiper.enabled && el) {\n        el.classList.add(...params.lockClass.split(' '));\n      }\n    };\n    nextEl.forEach(el => initButton(el, 'next'));\n    prevEl.forEach(el => initButton(el, 'prev'));\n  }\n  function destroy() {\n    let {\n      nextEl,\n      prevEl\n    } = swiper.navigation;\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    const destroyButton = (el, dir) => {\n      el.removeEventListener('click', dir === 'next' ? onNextClick : onPrevClick);\n      el.classList.remove(...swiper.params.navigation.disabledClass.split(' '));\n    };\n    nextEl.forEach(el => destroyButton(el, 'next'));\n    prevEl.forEach(el => destroyButton(el, 'prev'));\n  }\n  on('init', () => {\n    if (swiper.params.navigation.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      update();\n    }\n  });\n  on('toEdge fromEdge lock unlock', () => {\n    update();\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    let {\n      nextEl,\n      prevEl\n    } = swiper.navigation;\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    if (swiper.enabled) {\n      update();\n      return;\n    }\n    [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.add(swiper.params.navigation.lockClass));\n  });\n  on('click', (_s, e) => {\n    let {\n      nextEl,\n      prevEl\n    } = swiper.navigation;\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    const targetEl = e.target;\n    let targetIsButton = prevEl.includes(targetEl) || nextEl.includes(targetEl);\n    if (swiper.isElement && !targetIsButton) {\n      const path = e.path || e.composedPath && e.composedPath();\n      if (path) {\n        targetIsButton = path.find(pathEl => nextEl.includes(pathEl) || prevEl.includes(pathEl));\n      }\n    }\n    if (swiper.params.navigation.hideOnClick && !targetIsButton) {\n      if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;\n      let isHidden;\n      if (nextEl.length) {\n        isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass);\n      } else if (prevEl.length) {\n        isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass);\n      }\n      if (isHidden === true) {\n        emit('navigationShow');\n      } else {\n        emit('navigationHide');\n      }\n      [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.toggle(swiper.params.navigation.hiddenClass));\n    }\n  });\n  const enable = () => {\n    swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(' '));\n    init();\n    update();\n  };\n  const disable = () => {\n    swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(' '));\n    destroy();\n  };\n  Object.assign(swiper.navigation, {\n    enable,\n    disable,\n    update,\n    init,\n    destroy\n  });\n}\n\nexport { Navigation as default };\n","function classesToSelector(classes = '') {\n  // Escape all CSS selector special characters\n  return `.${classes.trim().replace(/([\\.:!+\\/()[\\]#>~*^$|=,'\"@{}\\\\])/g, '\\\\$1') // eslint-disable-line\n  .replace(/ /g, '.')}`;\n}\n\nexport { classesToSelector as c };\n","import { c as classesToSelector } from '../shared/classes-to-selector.mjs';\nimport { c as createElementIfNotDefined } from '../shared/create-element-if-not-defined.mjs';\nimport { m as makeElementsArray, i as elementOuterSize, j as elementIndex, s as setInnerHTML, d as elementParents } from '../shared/utils.mjs';\n\nfunction Pagination({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const pfx = 'swiper-pagination';\n  extendParams({\n    pagination: {\n      el: null,\n      bulletElement: 'span',\n      clickable: false,\n      hideOnClick: false,\n      renderBullet: null,\n      renderProgressbar: null,\n      renderFraction: null,\n      renderCustom: null,\n      progressbarOpposite: false,\n      type: 'bullets',\n      // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n      dynamicBullets: false,\n      dynamicMainBullets: 1,\n      formatFractionCurrent: number => number,\n      formatFractionTotal: number => number,\n      bulletClass: `${pfx}-bullet`,\n      bulletActiveClass: `${pfx}-bullet-active`,\n      modifierClass: `${pfx}-`,\n      currentClass: `${pfx}-current`,\n      totalClass: `${pfx}-total`,\n      hiddenClass: `${pfx}-hidden`,\n      progressbarFillClass: `${pfx}-progressbar-fill`,\n      progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n      clickableClass: `${pfx}-clickable`,\n      lockClass: `${pfx}-lock`,\n      horizontalClass: `${pfx}-horizontal`,\n      verticalClass: `${pfx}-vertical`,\n      paginationDisabledClass: `${pfx}-disabled`\n    }\n  });\n  swiper.pagination = {\n    el: null,\n    bullets: []\n  };\n  let bulletSize;\n  let dynamicBulletIndex = 0;\n  function isPaginationDisabled() {\n    return !swiper.params.pagination.el || !swiper.pagination.el || Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0;\n  }\n  function setSideBullets(bulletEl, position) {\n    const {\n      bulletActiveClass\n    } = swiper.params.pagination;\n    if (!bulletEl) return;\n    bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];\n    if (bulletEl) {\n      bulletEl.classList.add(`${bulletActiveClass}-${position}`);\n      bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];\n      if (bulletEl) {\n        bulletEl.classList.add(`${bulletActiveClass}-${position}-${position}`);\n      }\n    }\n  }\n  function getMoveDirection(prevIndex, nextIndex, length) {\n    prevIndex = prevIndex % length;\n    nextIndex = nextIndex % length;\n    if (nextIndex === prevIndex + 1) {\n      return 'next';\n    } else if (nextIndex === prevIndex - 1) {\n      return 'previous';\n    }\n    return;\n  }\n  function onBulletClick(e) {\n    const bulletEl = e.target.closest(classesToSelector(swiper.params.pagination.bulletClass));\n    if (!bulletEl) {\n      return;\n    }\n    e.preventDefault();\n    const index = elementIndex(bulletEl) * swiper.params.slidesPerGroup;\n    if (swiper.params.loop) {\n      if (swiper.realIndex === index) return;\n      const moveDirection = getMoveDirection(swiper.realIndex, index, swiper.slides.length);\n      if (moveDirection === 'next') {\n        swiper.slideNext();\n      } else if (moveDirection === 'previous') {\n        swiper.slidePrev();\n      } else {\n        swiper.slideToLoop(index);\n      }\n    } else {\n      swiper.slideTo(index);\n    }\n  }\n  function update() {\n    // Render || Update Pagination bullets/items\n    const rtl = swiper.rtl;\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    let el = swiper.pagination.el;\n    el = makeElementsArray(el);\n    // Current/Total\n    let current;\n    let previousIndex;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n    const total = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n    if (swiper.params.loop) {\n      previousIndex = swiper.previousRealIndex || 0;\n      current = swiper.params.slidesPerGroup > 1 ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup) : swiper.realIndex;\n    } else if (typeof swiper.snapIndex !== 'undefined') {\n      current = swiper.snapIndex;\n      previousIndex = swiper.previousSnapIndex;\n    } else {\n      previousIndex = swiper.previousIndex || 0;\n      current = swiper.activeIndex || 0;\n    }\n    // Types\n    if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {\n      const bullets = swiper.pagination.bullets;\n      let firstIndex;\n      let lastIndex;\n      let midIndex;\n      if (params.dynamicBullets) {\n        bulletSize = elementOuterSize(bullets[0], swiper.isHorizontal() ? 'width' : 'height', true);\n        el.forEach(subEl => {\n          subEl.style[swiper.isHorizontal() ? 'width' : 'height'] = `${bulletSize * (params.dynamicMainBullets + 4)}px`;\n        });\n        if (params.dynamicMainBullets > 1 && previousIndex !== undefined) {\n          dynamicBulletIndex += current - (previousIndex || 0);\n          if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n            dynamicBulletIndex = params.dynamicMainBullets - 1;\n          } else if (dynamicBulletIndex < 0) {\n            dynamicBulletIndex = 0;\n          }\n        }\n        firstIndex = Math.max(current - dynamicBulletIndex, 0);\n        lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n        midIndex = (lastIndex + firstIndex) / 2;\n      }\n      bullets.forEach(bulletEl => {\n        const classesToRemove = [...['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`)].map(s => typeof s === 'string' && s.includes(' ') ? s.split(' ') : s).flat();\n        bulletEl.classList.remove(...classesToRemove);\n      });\n      if (el.length > 1) {\n        bullets.forEach(bullet => {\n          const bulletIndex = elementIndex(bullet);\n          if (bulletIndex === current) {\n            bullet.classList.add(...params.bulletActiveClass.split(' '));\n          } else if (swiper.isElement) {\n            bullet.setAttribute('part', 'bullet');\n          }\n          if (params.dynamicBullets) {\n            if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n              bullet.classList.add(...`${params.bulletActiveClass}-main`.split(' '));\n            }\n            if (bulletIndex === firstIndex) {\n              setSideBullets(bullet, 'prev');\n            }\n            if (bulletIndex === lastIndex) {\n              setSideBullets(bullet, 'next');\n            }\n          }\n        });\n      } else {\n        const bullet = bullets[current];\n        if (bullet) {\n          bullet.classList.add(...params.bulletActiveClass.split(' '));\n        }\n        if (swiper.isElement) {\n          bullets.forEach((bulletEl, bulletIndex) => {\n            bulletEl.setAttribute('part', bulletIndex === current ? 'bullet-active' : 'bullet');\n          });\n        }\n        if (params.dynamicBullets) {\n          const firstDisplayedBullet = bullets[firstIndex];\n          const lastDisplayedBullet = bullets[lastIndex];\n          for (let i = firstIndex; i <= lastIndex; i += 1) {\n            if (bullets[i]) {\n              bullets[i].classList.add(...`${params.bulletActiveClass}-main`.split(' '));\n            }\n          }\n          setSideBullets(firstDisplayedBullet, 'prev');\n          setSideBullets(lastDisplayedBullet, 'next');\n        }\n      }\n      if (params.dynamicBullets) {\n        const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n        const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n        const offsetProp = rtl ? 'right' : 'left';\n        bullets.forEach(bullet => {\n          bullet.style[swiper.isHorizontal() ? offsetProp : 'top'] = `${bulletsOffset}px`;\n        });\n      }\n    }\n    el.forEach((subEl, subElIndex) => {\n      if (params.type === 'fraction') {\n        subEl.querySelectorAll(classesToSelector(params.currentClass)).forEach(fractionEl => {\n          fractionEl.textContent = params.formatFractionCurrent(current + 1);\n        });\n        subEl.querySelectorAll(classesToSelector(params.totalClass)).forEach(totalEl => {\n          totalEl.textContent = params.formatFractionTotal(total);\n        });\n      }\n      if (params.type === 'progressbar') {\n        let progressbarDirection;\n        if (params.progressbarOpposite) {\n          progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n        } else {\n          progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n        }\n        const scale = (current + 1) / total;\n        let scaleX = 1;\n        let scaleY = 1;\n        if (progressbarDirection === 'horizontal') {\n          scaleX = scale;\n        } else {\n          scaleY = scale;\n        }\n        subEl.querySelectorAll(classesToSelector(params.progressbarFillClass)).forEach(progressEl => {\n          progressEl.style.transform = `translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`;\n          progressEl.style.transitionDuration = `${swiper.params.speed}ms`;\n        });\n      }\n      if (params.type === 'custom' && params.renderCustom) {\n        setInnerHTML(subEl, params.renderCustom(swiper, current + 1, total));\n        if (subElIndex === 0) emit('paginationRender', subEl);\n      } else {\n        if (subElIndex === 0) emit('paginationRender', subEl);\n        emit('paginationUpdate', subEl);\n      }\n      if (swiper.params.watchOverflow && swiper.enabled) {\n        subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);\n      }\n    });\n  }\n  function render() {\n    // Render Container\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.grid && swiper.params.grid.rows > 1 ? swiper.slides.length / Math.ceil(swiper.params.grid.rows) : swiper.slides.length;\n    let el = swiper.pagination.el;\n    el = makeElementsArray(el);\n    let paginationHTML = '';\n    if (params.type === 'bullets') {\n      let numberOfBullets = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n      if (swiper.params.freeMode && swiper.params.freeMode.enabled && numberOfBullets > slidesLength) {\n        numberOfBullets = slidesLength;\n      }\n      for (let i = 0; i < numberOfBullets; i += 1) {\n        if (params.renderBullet) {\n          paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n        } else {\n          // prettier-ignore\n          paginationHTML += `<${params.bulletElement} ${swiper.isElement ? 'part=\"bullet\"' : ''} class=\"${params.bulletClass}\"></${params.bulletElement}>`;\n        }\n      }\n    }\n    if (params.type === 'fraction') {\n      if (params.renderFraction) {\n        paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n      } else {\n        paginationHTML = `<span class=\"${params.currentClass}\"></span>` + ' / ' + `<span class=\"${params.totalClass}\"></span>`;\n      }\n    }\n    if (params.type === 'progressbar') {\n      if (params.renderProgressbar) {\n        paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n      } else {\n        paginationHTML = `<span class=\"${params.progressbarFillClass}\"></span>`;\n      }\n    }\n    swiper.pagination.bullets = [];\n    el.forEach(subEl => {\n      if (params.type !== 'custom') {\n        setInnerHTML(subEl, paginationHTML || '');\n      }\n      if (params.type === 'bullets') {\n        swiper.pagination.bullets.push(...subEl.querySelectorAll(classesToSelector(params.bulletClass)));\n      }\n    });\n    if (params.type !== 'custom') {\n      emit('paginationRender', el[0]);\n    }\n  }\n  function init() {\n    swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, {\n      el: 'swiper-pagination'\n    });\n    const params = swiper.params.pagination;\n    if (!params.el) return;\n    let el;\n    if (typeof params.el === 'string' && swiper.isElement) {\n      el = swiper.el.querySelector(params.el);\n    }\n    if (!el && typeof params.el === 'string') {\n      el = [...document.querySelectorAll(params.el)];\n    }\n    if (!el) {\n      el = params.el;\n    }\n    if (!el || el.length === 0) return;\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && Array.isArray(el) && el.length > 1) {\n      el = [...swiper.el.querySelectorAll(params.el)];\n      // check if it belongs to another nested Swiper\n      if (el.length > 1) {\n        el = el.find(subEl => {\n          if (elementParents(subEl, '.swiper')[0] !== swiper.el) return false;\n          return true;\n        });\n      }\n    }\n    if (Array.isArray(el) && el.length === 1) el = el[0];\n    Object.assign(swiper.pagination, {\n      el\n    });\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      if (params.type === 'bullets' && params.clickable) {\n        subEl.classList.add(...(params.clickableClass || '').split(' '));\n      }\n      subEl.classList.add(params.modifierClass + params.type);\n      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n      if (params.type === 'bullets' && params.dynamicBullets) {\n        subEl.classList.add(`${params.modifierClass}${params.type}-dynamic`);\n        dynamicBulletIndex = 0;\n        if (params.dynamicMainBullets < 1) {\n          params.dynamicMainBullets = 1;\n        }\n      }\n      if (params.type === 'progressbar' && params.progressbarOpposite) {\n        subEl.classList.add(params.progressbarOppositeClass);\n      }\n      if (params.clickable) {\n        subEl.addEventListener('click', onBulletClick);\n      }\n      if (!swiper.enabled) {\n        subEl.classList.add(params.lockClass);\n      }\n    });\n  }\n  function destroy() {\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    let el = swiper.pagination.el;\n    if (el) {\n      el = makeElementsArray(el);\n      el.forEach(subEl => {\n        subEl.classList.remove(params.hiddenClass);\n        subEl.classList.remove(params.modifierClass + params.type);\n        subEl.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n        if (params.clickable) {\n          subEl.classList.remove(...(params.clickableClass || '').split(' '));\n          subEl.removeEventListener('click', onBulletClick);\n        }\n      });\n    }\n    if (swiper.pagination.bullets) swiper.pagination.bullets.forEach(subEl => subEl.classList.remove(...params.bulletActiveClass.split(' ')));\n  }\n  on('changeDirection', () => {\n    if (!swiper.pagination || !swiper.pagination.el) return;\n    const params = swiper.params.pagination;\n    let {\n      el\n    } = swiper.pagination;\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.classList.remove(params.horizontalClass, params.verticalClass);\n      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n    });\n  });\n  on('init', () => {\n    if (swiper.params.pagination.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      render();\n      update();\n    }\n  });\n  on('activeIndexChange', () => {\n    if (typeof swiper.snapIndex === 'undefined') {\n      update();\n    }\n  });\n  on('snapIndexChange', () => {\n    update();\n  });\n  on('snapGridLengthChange', () => {\n    render();\n    update();\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    let {\n      el\n    } = swiper.pagination;\n    if (el) {\n      el = makeElementsArray(el);\n      el.forEach(subEl => subEl.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.pagination.lockClass));\n    }\n  });\n  on('lock unlock', () => {\n    update();\n  });\n  on('click', (_s, e) => {\n    const targetEl = e.target;\n    const el = makeElementsArray(swiper.pagination.el);\n    if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && el && el.length > 0 && !targetEl.classList.contains(swiper.params.pagination.bulletClass)) {\n      if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;\n      const isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass);\n      if (isHidden === true) {\n        emit('paginationShow');\n      } else {\n        emit('paginationHide');\n      }\n      el.forEach(subEl => subEl.classList.toggle(swiper.params.pagination.hiddenClass));\n    }\n  });\n  const enable = () => {\n    swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass);\n    let {\n      el\n    } = swiper.pagination;\n    if (el) {\n      el = makeElementsArray(el);\n      el.forEach(subEl => subEl.classList.remove(swiper.params.pagination.paginationDisabledClass));\n    }\n    init();\n    render();\n    update();\n  };\n  const disable = () => {\n    swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass);\n    let {\n      el\n    } = swiper.pagination;\n    if (el) {\n      el = makeElementsArray(el);\n      el.forEach(subEl => subEl.classList.add(swiper.params.pagination.paginationDisabledClass));\n    }\n    destroy();\n  };\n  Object.assign(swiper.pagination, {\n    enable,\n    disable,\n    render,\n    update,\n    init,\n    destroy\n  });\n}\n\nexport { Pagination as default };\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\nimport { m as makeElementsArray, k as classesToTokens, c as createElement, n as nextTick, f as elementOffset } from '../shared/utils.mjs';\nimport { c as createElementIfNotDefined } from '../shared/create-element-if-not-defined.mjs';\nimport { c as classesToSelector } from '../shared/classes-to-selector.mjs';\n\nfunction Scrollbar({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const document = getDocument();\n  let isTouched = false;\n  let timeout = null;\n  let dragTimeout = null;\n  let dragStartPos;\n  let dragSize;\n  let trackSize;\n  let divider;\n  extendParams({\n    scrollbar: {\n      el: null,\n      dragSize: 'auto',\n      hide: false,\n      draggable: false,\n      snapOnRelease: true,\n      lockClass: 'swiper-scrollbar-lock',\n      dragClass: 'swiper-scrollbar-drag',\n      scrollbarDisabledClass: 'swiper-scrollbar-disabled',\n      horizontalClass: `swiper-scrollbar-horizontal`,\n      verticalClass: `swiper-scrollbar-vertical`\n    }\n  });\n  swiper.scrollbar = {\n    el: null,\n    dragEl: null\n  };\n  function setTranslate() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const {\n      scrollbar,\n      rtlTranslate: rtl\n    } = swiper;\n    const {\n      dragEl,\n      el\n    } = scrollbar;\n    const params = swiper.params.scrollbar;\n    const progress = swiper.params.loop ? swiper.progressLoop : swiper.progress;\n    let newSize = dragSize;\n    let newPos = (trackSize - dragSize) * progress;\n    if (rtl) {\n      newPos = -newPos;\n      if (newPos > 0) {\n        newSize = dragSize - newPos;\n        newPos = 0;\n      } else if (-newPos + dragSize > trackSize) {\n        newSize = trackSize + newPos;\n      }\n    } else if (newPos < 0) {\n      newSize = dragSize + newPos;\n      newPos = 0;\n    } else if (newPos + dragSize > trackSize) {\n      newSize = trackSize - newPos;\n    }\n    if (swiper.isHorizontal()) {\n      dragEl.style.transform = `translate3d(${newPos}px, 0, 0)`;\n      dragEl.style.width = `${newSize}px`;\n    } else {\n      dragEl.style.transform = `translate3d(0px, ${newPos}px, 0)`;\n      dragEl.style.height = `${newSize}px`;\n    }\n    if (params.hide) {\n      clearTimeout(timeout);\n      el.style.opacity = 1;\n      timeout = setTimeout(() => {\n        el.style.opacity = 0;\n        el.style.transitionDuration = '400ms';\n      }, 1000);\n    }\n  }\n  function setTransition(duration) {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    swiper.scrollbar.dragEl.style.transitionDuration = `${duration}ms`;\n  }\n  function updateSize() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const {\n      scrollbar\n    } = swiper;\n    const {\n      dragEl,\n      el\n    } = scrollbar;\n    dragEl.style.width = '';\n    dragEl.style.height = '';\n    trackSize = swiper.isHorizontal() ? el.offsetWidth : el.offsetHeight;\n    divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n    if (swiper.params.scrollbar.dragSize === 'auto') {\n      dragSize = trackSize * divider;\n    } else {\n      dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n    }\n    if (swiper.isHorizontal()) {\n      dragEl.style.width = `${dragSize}px`;\n    } else {\n      dragEl.style.height = `${dragSize}px`;\n    }\n    if (divider >= 1) {\n      el.style.display = 'none';\n    } else {\n      el.style.display = '';\n    }\n    if (swiper.params.scrollbar.hide) {\n      el.style.opacity = 0;\n    }\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      scrollbar.el.classList[swiper.isLocked ? 'add' : 'remove'](swiper.params.scrollbar.lockClass);\n    }\n  }\n  function getPointerPosition(e) {\n    return swiper.isHorizontal() ? e.clientX : e.clientY;\n  }\n  function setDragPosition(e) {\n    const {\n      scrollbar,\n      rtlTranslate: rtl\n    } = swiper;\n    const {\n      el\n    } = scrollbar;\n    let positionRatio;\n    positionRatio = (getPointerPosition(e) - elementOffset(el)[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);\n    positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n    if (rtl) {\n      positionRatio = 1 - positionRatio;\n    }\n    const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n    swiper.updateProgress(position);\n    swiper.setTranslate(position);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n  function onDragStart(e) {\n    const params = swiper.params.scrollbar;\n    const {\n      scrollbar,\n      wrapperEl\n    } = swiper;\n    const {\n      el,\n      dragEl\n    } = scrollbar;\n    isTouched = true;\n    dragStartPos = e.target === dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;\n    e.preventDefault();\n    e.stopPropagation();\n    wrapperEl.style.transitionDuration = '100ms';\n    dragEl.style.transitionDuration = '100ms';\n    setDragPosition(e);\n    clearTimeout(dragTimeout);\n    el.style.transitionDuration = '0ms';\n    if (params.hide) {\n      el.style.opacity = 1;\n    }\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style['scroll-snap-type'] = 'none';\n    }\n    emit('scrollbarDragStart', e);\n  }\n  function onDragMove(e) {\n    const {\n      scrollbar,\n      wrapperEl\n    } = swiper;\n    const {\n      el,\n      dragEl\n    } = scrollbar;\n    if (!isTouched) return;\n    if (e.preventDefault && e.cancelable) e.preventDefault();else e.returnValue = false;\n    setDragPosition(e);\n    wrapperEl.style.transitionDuration = '0ms';\n    el.style.transitionDuration = '0ms';\n    dragEl.style.transitionDuration = '0ms';\n    emit('scrollbarDragMove', e);\n  }\n  function onDragEnd(e) {\n    const params = swiper.params.scrollbar;\n    const {\n      scrollbar,\n      wrapperEl\n    } = swiper;\n    const {\n      el\n    } = scrollbar;\n    if (!isTouched) return;\n    isTouched = false;\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style['scroll-snap-type'] = '';\n      wrapperEl.style.transitionDuration = '';\n    }\n    if (params.hide) {\n      clearTimeout(dragTimeout);\n      dragTimeout = nextTick(() => {\n        el.style.opacity = 0;\n        el.style.transitionDuration = '400ms';\n      }, 1000);\n    }\n    emit('scrollbarDragEnd', e);\n    if (params.snapOnRelease) {\n      swiper.slideToClosest();\n    }\n  }\n  function events(method) {\n    const {\n      scrollbar,\n      params\n    } = swiper;\n    const el = scrollbar.el;\n    if (!el) return;\n    const target = el;\n    const activeListener = params.passiveListeners ? {\n      passive: false,\n      capture: false\n    } : false;\n    const passiveListener = params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    if (!target) return;\n    const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n    target[eventMethod]('pointerdown', onDragStart, activeListener);\n    document[eventMethod]('pointermove', onDragMove, activeListener);\n    document[eventMethod]('pointerup', onDragEnd, passiveListener);\n  }\n  function enableDraggable() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    events('on');\n  }\n  function disableDraggable() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    events('off');\n  }\n  function init() {\n    const {\n      scrollbar,\n      el: swiperEl\n    } = swiper;\n    swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {\n      el: 'swiper-scrollbar'\n    });\n    const params = swiper.params.scrollbar;\n    if (!params.el) return;\n    let el;\n    if (typeof params.el === 'string' && swiper.isElement) {\n      el = swiper.el.querySelector(params.el);\n    }\n    if (!el && typeof params.el === 'string') {\n      el = document.querySelectorAll(params.el);\n      if (!el.length) return;\n    } else if (!el) {\n      el = params.el;\n    }\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && el.length > 1 && swiperEl.querySelectorAll(params.el).length === 1) {\n      el = swiperEl.querySelector(params.el);\n    }\n    if (el.length > 0) el = el[0];\n    el.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n    let dragEl;\n    if (el) {\n      dragEl = el.querySelector(classesToSelector(swiper.params.scrollbar.dragClass));\n      if (!dragEl) {\n        dragEl = createElement('div', swiper.params.scrollbar.dragClass);\n        el.append(dragEl);\n      }\n    }\n    Object.assign(scrollbar, {\n      el,\n      dragEl\n    });\n    if (params.draggable) {\n      enableDraggable();\n    }\n    if (el) {\n      el.classList[swiper.enabled ? 'remove' : 'add'](...classesToTokens(swiper.params.scrollbar.lockClass));\n    }\n  }\n  function destroy() {\n    const params = swiper.params.scrollbar;\n    const el = swiper.scrollbar.el;\n    if (el) {\n      el.classList.remove(...classesToTokens(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass));\n    }\n    disableDraggable();\n  }\n  on('changeDirection', () => {\n    if (!swiper.scrollbar || !swiper.scrollbar.el) return;\n    const params = swiper.params.scrollbar;\n    let {\n      el\n    } = swiper.scrollbar;\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.classList.remove(params.horizontalClass, params.verticalClass);\n      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n    });\n  });\n  on('init', () => {\n    if (swiper.params.scrollbar.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      updateSize();\n      setTranslate();\n    }\n  });\n  on('update resize observerUpdate lock unlock changeDirection', () => {\n    updateSize();\n  });\n  on('setTranslate', () => {\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    setTransition(duration);\n  });\n  on('enable disable', () => {\n    const {\n      el\n    } = swiper.scrollbar;\n    if (el) {\n      el.classList[swiper.enabled ? 'remove' : 'add'](...classesToTokens(swiper.params.scrollbar.lockClass));\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  const enable = () => {\n    swiper.el.classList.remove(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));\n    if (swiper.scrollbar.el) {\n      swiper.scrollbar.el.classList.remove(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));\n    }\n    init();\n    updateSize();\n    setTranslate();\n  };\n  const disable = () => {\n    swiper.el.classList.add(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));\n    if (swiper.scrollbar.el) {\n      swiper.scrollbar.el.classList.add(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));\n    }\n    destroy();\n  };\n  Object.assign(swiper.scrollbar, {\n    enable,\n    disable,\n    updateSize,\n    setTranslate,\n    init,\n    destroy\n  });\n}\n\nexport { Scrollbar as default };\n","import { e as elementChildren } from '../shared/utils.mjs';\n\nfunction Parallax({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    parallax: {\n      enabled: false\n    }\n  });\n  const elementsSelector = '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]';\n  const setTransform = (el, progress) => {\n    const {\n      rtl\n    } = swiper;\n    const rtlFactor = rtl ? -1 : 1;\n    const p = el.getAttribute('data-swiper-parallax') || '0';\n    let x = el.getAttribute('data-swiper-parallax-x');\n    let y = el.getAttribute('data-swiper-parallax-y');\n    const scale = el.getAttribute('data-swiper-parallax-scale');\n    const opacity = el.getAttribute('data-swiper-parallax-opacity');\n    const rotate = el.getAttribute('data-swiper-parallax-rotate');\n    if (x || y) {\n      x = x || '0';\n      y = y || '0';\n    } else if (swiper.isHorizontal()) {\n      x = p;\n      y = '0';\n    } else {\n      y = p;\n      x = '0';\n    }\n    if (x.indexOf('%') >= 0) {\n      x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n    } else {\n      x = `${x * progress * rtlFactor}px`;\n    }\n    if (y.indexOf('%') >= 0) {\n      y = `${parseInt(y, 10) * progress}%`;\n    } else {\n      y = `${y * progress}px`;\n    }\n    if (typeof opacity !== 'undefined' && opacity !== null) {\n      const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n      el.style.opacity = currentOpacity;\n    }\n    let transform = `translate3d(${x}, ${y}, 0px)`;\n    if (typeof scale !== 'undefined' && scale !== null) {\n      const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n      transform += ` scale(${currentScale})`;\n    }\n    if (rotate && typeof rotate !== 'undefined' && rotate !== null) {\n      const currentRotate = rotate * progress * -1;\n      transform += ` rotate(${currentRotate}deg)`;\n    }\n    el.style.transform = transform;\n  };\n  const setTranslate = () => {\n    const {\n      el,\n      slides,\n      progress,\n      snapGrid,\n      isElement\n    } = swiper;\n    const elements = elementChildren(el, elementsSelector);\n    if (swiper.isElement) {\n      elements.push(...elementChildren(swiper.hostEl, elementsSelector));\n    }\n    elements.forEach(subEl => {\n      setTransform(subEl, progress);\n    });\n    slides.forEach((slideEl, slideIndex) => {\n      let slideProgress = slideEl.progress;\n      if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n        slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n      }\n      slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n      slideEl.querySelectorAll(`${elementsSelector}, [data-swiper-parallax-rotate]`).forEach(subEl => {\n        setTransform(subEl, slideProgress);\n      });\n    });\n  };\n  const setTransition = (duration = swiper.params.speed) => {\n    const {\n      el,\n      hostEl\n    } = swiper;\n    const elements = [...el.querySelectorAll(elementsSelector)];\n    if (swiper.isElement) {\n      elements.push(...hostEl.querySelectorAll(elementsSelector));\n    }\n    elements.forEach(parallaxEl => {\n      let parallaxDuration = parseInt(parallaxEl.getAttribute('data-swiper-parallax-duration'), 10) || duration;\n      if (duration === 0) parallaxDuration = 0;\n      parallaxEl.style.transitionDuration = `${parallaxDuration}ms`;\n    });\n  };\n  on('beforeInit', () => {\n    if (!swiper.params.parallax.enabled) return;\n    swiper.params.watchSlidesProgress = true;\n    swiper.originalParams.watchSlidesProgress = true;\n  });\n  on('init', () => {\n    if (!swiper.params.parallax.enabled) return;\n    setTranslate();\n  });\n  on('setTranslate', () => {\n    if (!swiper.params.parallax.enabled) return;\n    setTranslate();\n  });\n  on('setTransition', (_swiper, duration) => {\n    if (!swiper.params.parallax.enabled) return;\n    setTransition(duration);\n  });\n}\n\nexport { Parallax as default };\n","import { a as getWindow } from '../shared/ssr-window.esm.mjs';\nimport { e as elementChildren, d as elementParents, f as elementOffset, l as getTranslate } from '../shared/utils.mjs';\n\nfunction Zoom({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const window = getWindow();\n  extendParams({\n    zoom: {\n      enabled: false,\n      limitToOriginalSize: false,\n      maxRatio: 3,\n      minRatio: 1,\n      panOnMouseMove: false,\n      toggle: true,\n      containerClass: 'swiper-zoom-container',\n      zoomedSlideClass: 'swiper-slide-zoomed'\n    }\n  });\n  swiper.zoom = {\n    enabled: false\n  };\n  let currentScale = 1;\n  let isScaling = false;\n  let isPanningWithMouse = false;\n  let mousePanStart = {\n    x: 0,\n    y: 0\n  };\n  const mousePanSensitivity = -3; // Negative to invert pan direction\n  let fakeGestureTouched;\n  let fakeGestureMoved;\n  const evCache = [];\n  const gesture = {\n    originX: 0,\n    originY: 0,\n    slideEl: undefined,\n    slideWidth: undefined,\n    slideHeight: undefined,\n    imageEl: undefined,\n    imageWrapEl: undefined,\n    maxRatio: 3\n  };\n  const image = {\n    isTouched: undefined,\n    isMoved: undefined,\n    currentX: undefined,\n    currentY: undefined,\n    minX: undefined,\n    minY: undefined,\n    maxX: undefined,\n    maxY: undefined,\n    width: undefined,\n    height: undefined,\n    startX: undefined,\n    startY: undefined,\n    touchesStart: {},\n    touchesCurrent: {}\n  };\n  const velocity = {\n    x: undefined,\n    y: undefined,\n    prevPositionX: undefined,\n    prevPositionY: undefined,\n    prevTime: undefined\n  };\n  let scale = 1;\n  Object.defineProperty(swiper.zoom, 'scale', {\n    get() {\n      return scale;\n    },\n    set(value) {\n      if (scale !== value) {\n        const imageEl = gesture.imageEl;\n        const slideEl = gesture.slideEl;\n        emit('zoomChange', value, imageEl, slideEl);\n      }\n      scale = value;\n    }\n  });\n  function getDistanceBetweenTouches() {\n    if (evCache.length < 2) return 1;\n    const x1 = evCache[0].pageX;\n    const y1 = evCache[0].pageY;\n    const x2 = evCache[1].pageX;\n    const y2 = evCache[1].pageY;\n    const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n    return distance;\n  }\n  function getMaxRatio() {\n    const params = swiper.params.zoom;\n    const maxRatio = gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;\n    if (params.limitToOriginalSize && gesture.imageEl && gesture.imageEl.naturalWidth) {\n      const imageMaxRatio = gesture.imageEl.naturalWidth / gesture.imageEl.offsetWidth;\n      return Math.min(imageMaxRatio, maxRatio);\n    }\n    return maxRatio;\n  }\n  function getScaleOrigin() {\n    if (evCache.length < 2) return {\n      x: null,\n      y: null\n    };\n    const box = gesture.imageEl.getBoundingClientRect();\n    return [(evCache[0].pageX + (evCache[1].pageX - evCache[0].pageX) / 2 - box.x - window.scrollX) / currentScale, (evCache[0].pageY + (evCache[1].pageY - evCache[0].pageY) / 2 - box.y - window.scrollY) / currentScale];\n  }\n  function getSlideSelector() {\n    return swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;\n  }\n  function eventWithinSlide(e) {\n    const slideSelector = getSlideSelector();\n    if (e.target.matches(slideSelector)) return true;\n    if (swiper.slides.filter(slideEl => slideEl.contains(e.target)).length > 0) return true;\n    return false;\n  }\n  function eventWithinZoomContainer(e) {\n    const selector = `.${swiper.params.zoom.containerClass}`;\n    if (e.target.matches(selector)) return true;\n    if ([...swiper.hostEl.querySelectorAll(selector)].filter(containerEl => containerEl.contains(e.target)).length > 0) return true;\n    return false;\n  }\n\n  // Events\n  function onGestureStart(e) {\n    if (e.pointerType === 'mouse') {\n      evCache.splice(0, evCache.length);\n    }\n    if (!eventWithinSlide(e)) return;\n    const params = swiper.params.zoom;\n    fakeGestureTouched = false;\n    fakeGestureMoved = false;\n    evCache.push(e);\n    if (evCache.length < 2) {\n      return;\n    }\n    fakeGestureTouched = true;\n    gesture.scaleStart = getDistanceBetweenTouches();\n    if (!gesture.slideEl) {\n      gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);\n      if (!gesture.slideEl) gesture.slideEl = swiper.slides[swiper.activeIndex];\n      let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);\n      if (imageEl) {\n        imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];\n      }\n      gesture.imageEl = imageEl;\n      if (imageEl) {\n        gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];\n      } else {\n        gesture.imageWrapEl = undefined;\n      }\n      if (!gesture.imageWrapEl) {\n        gesture.imageEl = undefined;\n        return;\n      }\n      gesture.maxRatio = getMaxRatio();\n    }\n    if (gesture.imageEl) {\n      const [originX, originY] = getScaleOrigin();\n      gesture.originX = originX;\n      gesture.originY = originY;\n      gesture.imageEl.style.transitionDuration = '0ms';\n    }\n    isScaling = true;\n  }\n  function onGestureChange(e) {\n    if (!eventWithinSlide(e)) return;\n    const params = swiper.params.zoom;\n    const zoom = swiper.zoom;\n    const pointerIndex = evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);\n    if (pointerIndex >= 0) evCache[pointerIndex] = e;\n    if (evCache.length < 2) {\n      return;\n    }\n    fakeGestureMoved = true;\n    gesture.scaleMove = getDistanceBetweenTouches();\n    if (!gesture.imageEl) {\n      return;\n    }\n    zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale;\n    if (zoom.scale > gesture.maxRatio) {\n      zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n    }\n    if (zoom.scale < params.minRatio) {\n      zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n    }\n    gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;\n  }\n  function onGestureEnd(e) {\n    if (!eventWithinSlide(e)) return;\n    if (e.pointerType === 'mouse' && e.type === 'pointerout') return;\n    const params = swiper.params.zoom;\n    const zoom = swiper.zoom;\n    const pointerIndex = evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);\n    if (pointerIndex >= 0) evCache.splice(pointerIndex, 1);\n    if (!fakeGestureTouched || !fakeGestureMoved) {\n      return;\n    }\n    fakeGestureTouched = false;\n    fakeGestureMoved = false;\n    if (!gesture.imageEl) return;\n    zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n    gesture.imageEl.style.transitionDuration = `${swiper.params.speed}ms`;\n    gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;\n    currentScale = zoom.scale;\n    isScaling = false;\n    if (zoom.scale > 1 && gesture.slideEl) {\n      gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);\n    } else if (zoom.scale <= 1 && gesture.slideEl) {\n      gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);\n    }\n    if (zoom.scale === 1) {\n      gesture.originX = 0;\n      gesture.originY = 0;\n      gesture.slideEl = undefined;\n    }\n  }\n  let allowTouchMoveTimeout;\n  function allowTouchMove() {\n    swiper.touchEventsData.preventTouchMoveFromPointerMove = false;\n  }\n  function preventTouchMove() {\n    clearTimeout(allowTouchMoveTimeout);\n    swiper.touchEventsData.preventTouchMoveFromPointerMove = true;\n    allowTouchMoveTimeout = setTimeout(() => {\n      if (swiper.destroyed) return;\n      allowTouchMove();\n    });\n  }\n  function onTouchStart(e) {\n    const device = swiper.device;\n    if (!gesture.imageEl) return;\n    if (image.isTouched) return;\n    if (device.android && e.cancelable) e.preventDefault();\n    image.isTouched = true;\n    const event = evCache.length > 0 ? evCache[0] : e;\n    image.touchesStart.x = event.pageX;\n    image.touchesStart.y = event.pageY;\n  }\n  function onTouchMove(e) {\n    const isMouseEvent = e.pointerType === 'mouse';\n    const isMousePan = isMouseEvent && swiper.params.zoom.panOnMouseMove;\n    if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) {\n      return;\n    }\n    const zoom = swiper.zoom;\n    if (!gesture.imageEl) {\n      return;\n    }\n    if (!image.isTouched || !gesture.slideEl) {\n      if (isMousePan) onMouseMove(e);\n      return;\n    }\n    if (isMousePan) {\n      onMouseMove(e);\n      return;\n    }\n    if (!image.isMoved) {\n      image.width = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;\n      image.height = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;\n      image.startX = getTranslate(gesture.imageWrapEl, 'x') || 0;\n      image.startY = getTranslate(gesture.imageWrapEl, 'y') || 0;\n      gesture.slideWidth = gesture.slideEl.offsetWidth;\n      gesture.slideHeight = gesture.slideEl.offsetHeight;\n      gesture.imageWrapEl.style.transitionDuration = '0ms';\n    }\n    // Define if we need image drag\n    const scaledWidth = image.width * zoom.scale;\n    const scaledHeight = image.height * zoom.scale;\n    image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n    image.maxX = -image.minX;\n    image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n    image.maxY = -image.minY;\n    image.touchesCurrent.x = evCache.length > 0 ? evCache[0].pageX : e.pageX;\n    image.touchesCurrent.y = evCache.length > 0 ? evCache[0].pageY : e.pageY;\n    const touchesDiff = Math.max(Math.abs(image.touchesCurrent.x - image.touchesStart.x), Math.abs(image.touchesCurrent.y - image.touchesStart.y));\n    if (touchesDiff > 5) {\n      swiper.allowClick = false;\n    }\n    if (!image.isMoved && !isScaling) {\n      if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) {\n        image.isTouched = false;\n        allowTouchMove();\n        return;\n      }\n      if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) {\n        image.isTouched = false;\n        allowTouchMove();\n        return;\n      }\n    }\n    if (e.cancelable) {\n      e.preventDefault();\n    }\n    e.stopPropagation();\n    preventTouchMove();\n    image.isMoved = true;\n    const scaleRatio = (zoom.scale - currentScale) / (gesture.maxRatio - swiper.params.zoom.minRatio);\n    const {\n      originX,\n      originY\n    } = gesture;\n    image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX + scaleRatio * (image.width - originX * 2);\n    image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY + scaleRatio * (image.height - originY * 2);\n    if (image.currentX < image.minX) {\n      image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n    }\n    if (image.currentX > image.maxX) {\n      image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n    }\n    if (image.currentY < image.minY) {\n      image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n    }\n    if (image.currentY > image.maxY) {\n      image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n    }\n\n    // Velocity\n    if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n    if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n    if (!velocity.prevTime) velocity.prevTime = Date.now();\n    velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n    velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n    if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n    if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n    velocity.prevPositionX = image.touchesCurrent.x;\n    velocity.prevPositionY = image.touchesCurrent.y;\n    velocity.prevTime = Date.now();\n    gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;\n  }\n  function onTouchEnd() {\n    const zoom = swiper.zoom;\n    evCache.length = 0;\n    if (!gesture.imageEl) return;\n    if (!image.isTouched || !image.isMoved) {\n      image.isTouched = false;\n      image.isMoved = false;\n      return;\n    }\n    image.isTouched = false;\n    image.isMoved = false;\n    let momentumDurationX = 300;\n    let momentumDurationY = 300;\n    const momentumDistanceX = velocity.x * momentumDurationX;\n    const newPositionX = image.currentX + momentumDistanceX;\n    const momentumDistanceY = velocity.y * momentumDurationY;\n    const newPositionY = image.currentY + momentumDistanceY;\n\n    // Fix duration\n    if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n    if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n    const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n    image.currentX = newPositionX;\n    image.currentY = newPositionY;\n    // Define if we need image drag\n    const scaledWidth = image.width * zoom.scale;\n    const scaledHeight = image.height * zoom.scale;\n    image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n    image.maxX = -image.minX;\n    image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n    image.maxY = -image.minY;\n    image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n    image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n    gesture.imageWrapEl.style.transitionDuration = `${momentumDuration}ms`;\n    gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;\n  }\n  function onTransitionEnd() {\n    const zoom = swiper.zoom;\n    if (gesture.slideEl && swiper.activeIndex !== swiper.slides.indexOf(gesture.slideEl)) {\n      if (gesture.imageEl) {\n        gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';\n      }\n      if (gesture.imageWrapEl) {\n        gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';\n      }\n      gesture.slideEl.classList.remove(`${swiper.params.zoom.zoomedSlideClass}`);\n      zoom.scale = 1;\n      currentScale = 1;\n      gesture.slideEl = undefined;\n      gesture.imageEl = undefined;\n      gesture.imageWrapEl = undefined;\n      gesture.originX = 0;\n      gesture.originY = 0;\n    }\n  }\n  function onMouseMove(e) {\n    // Only pan if zoomed in and mouse panning is enabled\n    if (currentScale <= 1 || !gesture.imageWrapEl) return;\n    if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) return;\n    const currentTransform = window.getComputedStyle(gesture.imageWrapEl).transform;\n    const matrix = new window.DOMMatrix(currentTransform);\n    if (!isPanningWithMouse) {\n      isPanningWithMouse = true;\n      mousePanStart.x = e.clientX;\n      mousePanStart.y = e.clientY;\n      image.startX = matrix.e;\n      image.startY = matrix.f;\n      image.width = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;\n      image.height = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;\n      gesture.slideWidth = gesture.slideEl.offsetWidth;\n      gesture.slideHeight = gesture.slideEl.offsetHeight;\n      return;\n    }\n    const deltaX = (e.clientX - mousePanStart.x) * mousePanSensitivity;\n    const deltaY = (e.clientY - mousePanStart.y) * mousePanSensitivity;\n    const scaledWidth = image.width * currentScale;\n    const scaledHeight = image.height * currentScale;\n    const slideWidth = gesture.slideWidth;\n    const slideHeight = gesture.slideHeight;\n    const minX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n    const maxX = -minX;\n    const minY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n    const maxY = -minY;\n    const newX = Math.max(Math.min(image.startX + deltaX, maxX), minX);\n    const newY = Math.max(Math.min(image.startY + deltaY, maxY), minY);\n    gesture.imageWrapEl.style.transitionDuration = '0ms';\n    gesture.imageWrapEl.style.transform = `translate3d(${newX}px, ${newY}px, 0)`;\n    mousePanStart.x = e.clientX;\n    mousePanStart.y = e.clientY;\n    image.startX = newX;\n    image.startY = newY;\n    image.currentX = newX;\n    image.currentY = newY;\n  }\n  function zoomIn(e) {\n    const zoom = swiper.zoom;\n    const params = swiper.params.zoom;\n    if (!gesture.slideEl) {\n      if (e && e.target) {\n        gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);\n      }\n      if (!gesture.slideEl) {\n        if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n          gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];\n        } else {\n          gesture.slideEl = swiper.slides[swiper.activeIndex];\n        }\n      }\n      let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);\n      if (imageEl) {\n        imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];\n      }\n      gesture.imageEl = imageEl;\n      if (imageEl) {\n        gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];\n      } else {\n        gesture.imageWrapEl = undefined;\n      }\n    }\n    if (!gesture.imageEl || !gesture.imageWrapEl) return;\n    gesture.maxRatio = getMaxRatio();\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.touchAction = 'none';\n    }\n    gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);\n    let touchX;\n    let touchY;\n    let offsetX;\n    let offsetY;\n    let diffX;\n    let diffY;\n    let translateX;\n    let translateY;\n    let imageWidth;\n    let imageHeight;\n    let scaledWidth;\n    let scaledHeight;\n    let translateMinX;\n    let translateMinY;\n    let translateMaxX;\n    let translateMaxY;\n    let slideWidth;\n    let slideHeight;\n    if (typeof image.touchesStart.x === 'undefined' && e) {\n      touchX = e.pageX;\n      touchY = e.pageY;\n    } else {\n      touchX = image.touchesStart.x;\n      touchY = image.touchesStart.y;\n    }\n    const prevScale = currentScale;\n    const forceZoomRatio = typeof e === 'number' ? e : null;\n    if (currentScale === 1 && forceZoomRatio) {\n      touchX = undefined;\n      touchY = undefined;\n      image.touchesStart.x = undefined;\n      image.touchesStart.y = undefined;\n    }\n    const maxRatio = getMaxRatio();\n    zoom.scale = forceZoomRatio || maxRatio;\n    currentScale = forceZoomRatio || maxRatio;\n    if (e && !(currentScale === 1 && forceZoomRatio)) {\n      slideWidth = gesture.slideEl.offsetWidth;\n      slideHeight = gesture.slideEl.offsetHeight;\n      offsetX = elementOffset(gesture.slideEl).left + window.scrollX;\n      offsetY = elementOffset(gesture.slideEl).top + window.scrollY;\n      diffX = offsetX + slideWidth / 2 - touchX;\n      diffY = offsetY + slideHeight / 2 - touchY;\n      imageWidth = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;\n      imageHeight = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;\n      scaledWidth = imageWidth * zoom.scale;\n      scaledHeight = imageHeight * zoom.scale;\n      translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n      translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n      translateMaxX = -translateMinX;\n      translateMaxY = -translateMinY;\n      if (prevScale > 0 && forceZoomRatio && typeof image.currentX === 'number' && typeof image.currentY === 'number') {\n        translateX = image.currentX * zoom.scale / prevScale;\n        translateY = image.currentY * zoom.scale / prevScale;\n      } else {\n        translateX = diffX * zoom.scale;\n        translateY = diffY * zoom.scale;\n      }\n      if (translateX < translateMinX) {\n        translateX = translateMinX;\n      }\n      if (translateX > translateMaxX) {\n        translateX = translateMaxX;\n      }\n      if (translateY < translateMinY) {\n        translateY = translateMinY;\n      }\n      if (translateY > translateMaxY) {\n        translateY = translateMaxY;\n      }\n    } else {\n      translateX = 0;\n      translateY = 0;\n    }\n    if (forceZoomRatio && zoom.scale === 1) {\n      gesture.originX = 0;\n      gesture.originY = 0;\n    }\n    image.currentX = translateX;\n    image.currentY = translateY;\n    gesture.imageWrapEl.style.transitionDuration = '300ms';\n    gesture.imageWrapEl.style.transform = `translate3d(${translateX}px, ${translateY}px,0)`;\n    gesture.imageEl.style.transitionDuration = '300ms';\n    gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;\n  }\n  function zoomOut() {\n    const zoom = swiper.zoom;\n    const params = swiper.params.zoom;\n    if (!gesture.slideEl) {\n      if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n        gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];\n      } else {\n        gesture.slideEl = swiper.slides[swiper.activeIndex];\n      }\n      let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);\n      if (imageEl) {\n        imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];\n      }\n      gesture.imageEl = imageEl;\n      if (imageEl) {\n        gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];\n      } else {\n        gesture.imageWrapEl = undefined;\n      }\n    }\n    if (!gesture.imageEl || !gesture.imageWrapEl) return;\n    gesture.maxRatio = getMaxRatio();\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style.overflow = '';\n      swiper.wrapperEl.style.touchAction = '';\n    }\n    zoom.scale = 1;\n    currentScale = 1;\n    image.currentX = undefined;\n    image.currentY = undefined;\n    image.touchesStart.x = undefined;\n    image.touchesStart.y = undefined;\n    gesture.imageWrapEl.style.transitionDuration = '300ms';\n    gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';\n    gesture.imageEl.style.transitionDuration = '300ms';\n    gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';\n    gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);\n    gesture.slideEl = undefined;\n    gesture.originX = 0;\n    gesture.originY = 0;\n    if (swiper.params.zoom.panOnMouseMove) {\n      mousePanStart = {\n        x: 0,\n        y: 0\n      };\n      if (isPanningWithMouse) {\n        isPanningWithMouse = false;\n        image.startX = 0;\n        image.startY = 0;\n      }\n    }\n  }\n\n  // Toggle Zoom\n  function zoomToggle(e) {\n    const zoom = swiper.zoom;\n    if (zoom.scale && zoom.scale !== 1) {\n      // Zoom Out\n      zoomOut();\n    } else {\n      // Zoom In\n      zoomIn(e);\n    }\n  }\n  function getListeners() {\n    const passiveListener = swiper.params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    const activeListenerWithCapture = swiper.params.passiveListeners ? {\n      passive: false,\n      capture: true\n    } : true;\n    return {\n      passiveListener,\n      activeListenerWithCapture\n    };\n  }\n\n  // Attach/Detach Events\n  function enable() {\n    const zoom = swiper.zoom;\n    if (zoom.enabled) return;\n    zoom.enabled = true;\n    const {\n      passiveListener,\n      activeListenerWithCapture\n    } = getListeners();\n\n    // Scale image\n    swiper.wrapperEl.addEventListener('pointerdown', onGestureStart, passiveListener);\n    swiper.wrapperEl.addEventListener('pointermove', onGestureChange, activeListenerWithCapture);\n    ['pointerup', 'pointercancel', 'pointerout'].forEach(eventName => {\n      swiper.wrapperEl.addEventListener(eventName, onGestureEnd, passiveListener);\n    });\n\n    // Move image\n    swiper.wrapperEl.addEventListener('pointermove', onTouchMove, activeListenerWithCapture);\n  }\n  function disable() {\n    const zoom = swiper.zoom;\n    if (!zoom.enabled) return;\n    zoom.enabled = false;\n    const {\n      passiveListener,\n      activeListenerWithCapture\n    } = getListeners();\n\n    // Scale image\n    swiper.wrapperEl.removeEventListener('pointerdown', onGestureStart, passiveListener);\n    swiper.wrapperEl.removeEventListener('pointermove', onGestureChange, activeListenerWithCapture);\n    ['pointerup', 'pointercancel', 'pointerout'].forEach(eventName => {\n      swiper.wrapperEl.removeEventListener(eventName, onGestureEnd, passiveListener);\n    });\n\n    // Move image\n    swiper.wrapperEl.removeEventListener('pointermove', onTouchMove, activeListenerWithCapture);\n  }\n  on('init', () => {\n    if (swiper.params.zoom.enabled) {\n      enable();\n    }\n  });\n  on('destroy', () => {\n    disable();\n  });\n  on('touchStart', (_s, e) => {\n    if (!swiper.zoom.enabled) return;\n    onTouchStart(e);\n  });\n  on('touchEnd', (_s, e) => {\n    if (!swiper.zoom.enabled) return;\n    onTouchEnd();\n  });\n  on('doubleTap', (_s, e) => {\n    if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {\n      zoomToggle(e);\n    }\n  });\n  on('transitionEnd', () => {\n    if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n      onTransitionEnd();\n    }\n  });\n  on('slideChange', () => {\n    if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n      onTransitionEnd();\n    }\n  });\n  Object.assign(swiper.zoom, {\n    enable,\n    disable,\n    in: zoomIn,\n    out: zoomOut,\n    toggle: zoomToggle\n  });\n}\n\nexport { Zoom as default };\n","import { n as nextTick, o as elementTransitionEnd } from '../shared/utils.mjs';\n\n/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nfunction Controller({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    controller: {\n      control: undefined,\n      inverse: false,\n      by: 'slide' // or 'container'\n    }\n  });\n\n  swiper.controller = {\n    control: undefined\n  };\n  function LinearSpline(x, y) {\n    const binarySearch = function search() {\n      let maxIndex;\n      let minIndex;\n      let guess;\n      return (array, val) => {\n        minIndex = -1;\n        maxIndex = array.length;\n        while (maxIndex - minIndex > 1) {\n          guess = maxIndex + minIndex >> 1;\n          if (array[guess] <= val) {\n            minIndex = guess;\n          } else {\n            maxIndex = guess;\n          }\n        }\n        return maxIndex;\n      };\n    }();\n    this.x = x;\n    this.y = y;\n    this.lastIndex = x.length - 1;\n    // Given an x value (x2), return the expected y2 value:\n    // (x1,y1) is the known point before given value,\n    // (x3,y3) is the known point after given value.\n    let i1;\n    let i3;\n    this.interpolate = function interpolate(x2) {\n      if (!x2) return 0;\n\n      // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n      i3 = binarySearch(this.x, x2);\n      i1 = i3 - 1;\n\n      // We have our indexes i1 & i3, so we can calculate already:\n      // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n      return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1];\n    };\n    return this;\n  }\n  function getInterpolateFunction(c) {\n    swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid);\n  }\n  function setTranslate(_t, byController) {\n    const controlled = swiper.controller.control;\n    let multiplier;\n    let controlledTranslate;\n    const Swiper = swiper.constructor;\n    function setControlledTranslate(c) {\n      if (c.destroyed) return;\n\n      // this will create an Interpolate function based on the snapGrids\n      // x is the Grid of the scrolled scroller and y will be the controlled scroller\n      // it makes sense to create this only once and recall it for the interpolation\n      // the function does a lot of value caching for performance\n      const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n      if (swiper.params.controller.by === 'slide') {\n        getInterpolateFunction(c);\n        // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n        // but it did not work out\n        controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n      }\n      if (!controlledTranslate || swiper.params.controller.by === 'container') {\n        multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n        if (Number.isNaN(multiplier) || !Number.isFinite(multiplier)) {\n          multiplier = 1;\n        }\n        controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n      }\n      if (swiper.params.controller.inverse) {\n        controlledTranslate = c.maxTranslate() - controlledTranslate;\n      }\n      c.updateProgress(controlledTranslate);\n      c.setTranslate(controlledTranslate, swiper);\n      c.updateActiveIndex();\n      c.updateSlidesClasses();\n    }\n    if (Array.isArray(controlled)) {\n      for (let i = 0; i < controlled.length; i += 1) {\n        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n          setControlledTranslate(controlled[i]);\n        }\n      }\n    } else if (controlled instanceof Swiper && byController !== controlled) {\n      setControlledTranslate(controlled);\n    }\n  }\n  function setTransition(duration, byController) {\n    const Swiper = swiper.constructor;\n    const controlled = swiper.controller.control;\n    let i;\n    function setControlledTransition(c) {\n      if (c.destroyed) return;\n      c.setTransition(duration, swiper);\n      if (duration !== 0) {\n        c.transitionStart();\n        if (c.params.autoHeight) {\n          nextTick(() => {\n            c.updateAutoHeight();\n          });\n        }\n        elementTransitionEnd(c.wrapperEl, () => {\n          if (!controlled) return;\n          c.transitionEnd();\n        });\n      }\n    }\n    if (Array.isArray(controlled)) {\n      for (i = 0; i < controlled.length; i += 1) {\n        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n          setControlledTransition(controlled[i]);\n        }\n      }\n    } else if (controlled instanceof Swiper && byController !== controlled) {\n      setControlledTransition(controlled);\n    }\n  }\n  function removeSpline() {\n    if (!swiper.controller.control) return;\n    if (swiper.controller.spline) {\n      swiper.controller.spline = undefined;\n      delete swiper.controller.spline;\n    }\n  }\n  on('beforeInit', () => {\n    if (typeof window !== 'undefined' && (\n    // eslint-disable-line\n    typeof swiper.params.controller.control === 'string' || swiper.params.controller.control instanceof HTMLElement)) {\n      const controlElements = typeof swiper.params.controller.control === 'string' ? [...document.querySelectorAll(swiper.params.controller.control)] : [swiper.params.controller.control];\n      controlElements.forEach(controlElement => {\n        if (!swiper.controller.control) swiper.controller.control = [];\n        if (controlElement && controlElement.swiper) {\n          swiper.controller.control.push(controlElement.swiper);\n        } else if (controlElement) {\n          const eventName = `${swiper.params.eventsPrefix}init`;\n          const onControllerSwiper = e => {\n            swiper.controller.control.push(e.detail[0]);\n            swiper.update();\n            controlElement.removeEventListener(eventName, onControllerSwiper);\n          };\n          controlElement.addEventListener(eventName, onControllerSwiper);\n        }\n      });\n      return;\n    }\n    swiper.controller.control = swiper.params.controller.control;\n  });\n  on('update', () => {\n    removeSpline();\n  });\n  on('resize', () => {\n    removeSpline();\n  });\n  on('observerUpdate', () => {\n    removeSpline();\n  });\n  on('setTranslate', (_s, translate, byController) => {\n    if (!swiper.controller.control || swiper.controller.control.destroyed) return;\n    swiper.controller.setTranslate(translate, byController);\n  });\n  on('setTransition', (_s, duration, byController) => {\n    if (!swiper.controller.control || swiper.controller.control.destroyed) return;\n    swiper.controller.setTransition(duration, byController);\n  });\n  Object.assign(swiper.controller, {\n    setTranslate,\n    setTransition\n  });\n}\n\nexport { Controller as default };\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\nimport { c as classesToSelector } from '../shared/classes-to-selector.mjs';\nimport { c as createElement, j as elementIndex, m as makeElementsArray, s as setInnerHTML } from '../shared/utils.mjs';\n\nfunction A11y({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    a11y: {\n      enabled: true,\n      notificationClass: 'swiper-notification',\n      prevSlideMessage: 'Previous slide',\n      nextSlideMessage: 'Next slide',\n      firstSlideMessage: 'This is the first slide',\n      lastSlideMessage: 'This is the last slide',\n      paginationBulletMessage: 'Go to slide {{index}}',\n      slideLabelMessage: '{{index}} / {{slidesLength}}',\n      containerMessage: null,\n      containerRoleDescriptionMessage: null,\n      containerRole: null,\n      itemRoleDescriptionMessage: null,\n      slideRole: 'group',\n      id: null,\n      scrollOnFocus: true,\n      wrapperLiveRegion: true\n    }\n  });\n  swiper.a11y = {\n    clicked: false\n  };\n  let liveRegion = null;\n  let preventFocusHandler;\n  let focusTargetSlideEl;\n  let visibilityChangedTimestamp = new Date().getTime();\n  function notify(message) {\n    const notification = liveRegion;\n    if (notification.length === 0) return;\n    setInnerHTML(notification, message);\n  }\n  function getRandomNumber(size = 16) {\n    const randomChar = () => Math.round(16 * Math.random()).toString(16);\n    return 'x'.repeat(size).replace(/x/g, randomChar);\n  }\n  function makeElFocusable(el) {\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.setAttribute('tabIndex', '0');\n    });\n  }\n  function makeElNotFocusable(el) {\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.setAttribute('tabIndex', '-1');\n    });\n  }\n  function addElRole(el, role) {\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.setAttribute('role', role);\n    });\n  }\n  function addElRoleDescription(el, description) {\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.setAttribute('aria-roledescription', description);\n    });\n  }\n  function addElControls(el, controls) {\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.setAttribute('aria-controls', controls);\n    });\n  }\n  function addElLabel(el, label) {\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.setAttribute('aria-label', label);\n    });\n  }\n  function addElId(el, id) {\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.setAttribute('id', id);\n    });\n  }\n  function addElLive(el, live) {\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.setAttribute('aria-live', live);\n    });\n  }\n  function disableEl(el) {\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.setAttribute('aria-disabled', true);\n    });\n  }\n  function enableEl(el) {\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.setAttribute('aria-disabled', false);\n    });\n  }\n  function onEnterOrSpaceKey(e) {\n    if (e.keyCode !== 13 && e.keyCode !== 32) return;\n    const params = swiper.params.a11y;\n    const targetEl = e.target;\n    if (swiper.pagination && swiper.pagination.el && (targetEl === swiper.pagination.el || swiper.pagination.el.contains(e.target))) {\n      if (!e.target.matches(classesToSelector(swiper.params.pagination.bulletClass))) return;\n    }\n    if (swiper.navigation && swiper.navigation.prevEl && swiper.navigation.nextEl) {\n      const prevEls = makeElementsArray(swiper.navigation.prevEl);\n      const nextEls = makeElementsArray(swiper.navigation.nextEl);\n      if (nextEls.includes(targetEl)) {\n        if (!(swiper.isEnd && !swiper.params.loop)) {\n          swiper.slideNext();\n        }\n        if (swiper.isEnd) {\n          notify(params.lastSlideMessage);\n        } else {\n          notify(params.nextSlideMessage);\n        }\n      }\n      if (prevEls.includes(targetEl)) {\n        if (!(swiper.isBeginning && !swiper.params.loop)) {\n          swiper.slidePrev();\n        }\n        if (swiper.isBeginning) {\n          notify(params.firstSlideMessage);\n        } else {\n          notify(params.prevSlideMessage);\n        }\n      }\n    }\n    if (swiper.pagination && targetEl.matches(classesToSelector(swiper.params.pagination.bulletClass))) {\n      targetEl.click();\n    }\n  }\n  function updateNavigation() {\n    if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return;\n    const {\n      nextEl,\n      prevEl\n    } = swiper.navigation;\n    if (prevEl) {\n      if (swiper.isBeginning) {\n        disableEl(prevEl);\n        makeElNotFocusable(prevEl);\n      } else {\n        enableEl(prevEl);\n        makeElFocusable(prevEl);\n      }\n    }\n    if (nextEl) {\n      if (swiper.isEnd) {\n        disableEl(nextEl);\n        makeElNotFocusable(nextEl);\n      } else {\n        enableEl(nextEl);\n        makeElFocusable(nextEl);\n      }\n    }\n  }\n  function hasPagination() {\n    return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length;\n  }\n  function hasClickablePagination() {\n    return hasPagination() && swiper.params.pagination.clickable;\n  }\n  function updatePagination() {\n    const params = swiper.params.a11y;\n    if (!hasPagination()) return;\n    swiper.pagination.bullets.forEach(bulletEl => {\n      if (swiper.params.pagination.clickable) {\n        makeElFocusable(bulletEl);\n        if (!swiper.params.pagination.renderBullet) {\n          addElRole(bulletEl, 'button');\n          addElLabel(bulletEl, params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, elementIndex(bulletEl) + 1));\n        }\n      }\n      if (bulletEl.matches(classesToSelector(swiper.params.pagination.bulletActiveClass))) {\n        bulletEl.setAttribute('aria-current', 'true');\n      } else {\n        bulletEl.removeAttribute('aria-current');\n      }\n    });\n  }\n  const initNavEl = (el, wrapperId, message) => {\n    makeElFocusable(el);\n    if (el.tagName !== 'BUTTON') {\n      addElRole(el, 'button');\n      el.addEventListener('keydown', onEnterOrSpaceKey);\n    }\n    addElLabel(el, message);\n    addElControls(el, wrapperId);\n  };\n  const handlePointerDown = e => {\n    if (focusTargetSlideEl && focusTargetSlideEl !== e.target && !focusTargetSlideEl.contains(e.target)) {\n      preventFocusHandler = true;\n    }\n    swiper.a11y.clicked = true;\n  };\n  const handlePointerUp = () => {\n    preventFocusHandler = false;\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        if (!swiper.destroyed) {\n          swiper.a11y.clicked = false;\n        }\n      });\n    });\n  };\n  const onVisibilityChange = e => {\n    visibilityChangedTimestamp = new Date().getTime();\n  };\n  const handleFocus = e => {\n    if (swiper.a11y.clicked || !swiper.params.a11y.scrollOnFocus) return;\n    if (new Date().getTime() - visibilityChangedTimestamp < 100) return;\n    const slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);\n    if (!slideEl || !swiper.slides.includes(slideEl)) return;\n    focusTargetSlideEl = slideEl;\n    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n    const isActive = (isVirtual ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : swiper.slides.indexOf(slideEl)) === swiper.activeIndex;\n    const isVisible = swiper.params.watchSlidesProgress && swiper.visibleSlides && swiper.visibleSlides.includes(slideEl);\n    if (isActive || isVisible) return;\n    if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;\n    if (swiper.isHorizontal()) {\n      swiper.el.scrollLeft = 0;\n    } else {\n      swiper.el.scrollTop = 0;\n    }\n    requestAnimationFrame(() => {\n      if (preventFocusHandler) return;\n      if (swiper.params.loop) {\n        swiper.slideToLoop(swiper.getSlideIndexWhenGrid(parseInt(slideEl.getAttribute('data-swiper-slide-index'))), 0);\n      } else if (isVirtual) {\n        swiper.slideTo(swiper.getSlideIndexWhenGrid(parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10)), 0);\n      } else {\n        swiper.slideTo(swiper.getSlideIndexWhenGrid(swiper.slides.indexOf(slideEl)), 0);\n      }\n      preventFocusHandler = false;\n    });\n  };\n  const initSlides = () => {\n    const params = swiper.params.a11y;\n    if (params.itemRoleDescriptionMessage) {\n      addElRoleDescription(swiper.slides, params.itemRoleDescriptionMessage);\n    }\n    if (params.slideRole) {\n      addElRole(swiper.slides, params.slideRole);\n    }\n    const slidesLength = swiper.slides.length;\n    if (params.slideLabelMessage) {\n      swiper.slides.forEach((slideEl, index) => {\n        const slideIndex = swiper.params.loop ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : index;\n        const ariaLabelMessage = params.slideLabelMessage.replace(/\\{\\{index\\}\\}/, slideIndex + 1).replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n        addElLabel(slideEl, ariaLabelMessage);\n      });\n    }\n  };\n  const init = () => {\n    const params = swiper.params.a11y;\n    swiper.el.append(liveRegion);\n\n    // Container\n    const containerEl = swiper.el;\n    if (params.containerRoleDescriptionMessage) {\n      addElRoleDescription(containerEl, params.containerRoleDescriptionMessage);\n    }\n    if (params.containerMessage) {\n      addElLabel(containerEl, params.containerMessage);\n    }\n    if (params.containerRole) {\n      addElRole(containerEl, params.containerRole);\n    }\n\n    // Wrapper\n    const wrapperEl = swiper.wrapperEl;\n    const wrapperId = params.id || wrapperEl.getAttribute('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n    addElId(wrapperEl, wrapperId);\n    if (params.wrapperLiveRegion) {\n      const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n      addElLive(wrapperEl, live);\n    }\n\n    // Slide\n    initSlides();\n\n    // Navigation\n    let {\n      nextEl,\n      prevEl\n    } = swiper.navigation ? swiper.navigation : {};\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    if (nextEl) {\n      nextEl.forEach(el => initNavEl(el, wrapperId, params.nextSlideMessage));\n    }\n    if (prevEl) {\n      prevEl.forEach(el => initNavEl(el, wrapperId, params.prevSlideMessage));\n    }\n\n    // Pagination\n    if (hasClickablePagination()) {\n      const paginationEl = makeElementsArray(swiper.pagination.el);\n      paginationEl.forEach(el => {\n        el.addEventListener('keydown', onEnterOrSpaceKey);\n      });\n    }\n\n    // Tab focus\n    const document = getDocument();\n    document.addEventListener('visibilitychange', onVisibilityChange);\n    swiper.el.addEventListener('focus', handleFocus, true);\n    swiper.el.addEventListener('pointerdown', handlePointerDown, true);\n    swiper.el.addEventListener('pointerup', handlePointerUp, true);\n  };\n  function destroy() {\n    if (liveRegion) liveRegion.remove();\n    let {\n      nextEl,\n      prevEl\n    } = swiper.navigation ? swiper.navigation : {};\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    if (nextEl) {\n      nextEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));\n    }\n    if (prevEl) {\n      prevEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));\n    }\n\n    // Pagination\n    if (hasClickablePagination()) {\n      const paginationEl = makeElementsArray(swiper.pagination.el);\n      paginationEl.forEach(el => {\n        el.removeEventListener('keydown', onEnterOrSpaceKey);\n      });\n    }\n    const document = getDocument();\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n    // Tab focus\n    if (swiper.el && typeof swiper.el !== 'string') {\n      swiper.el.removeEventListener('focus', handleFocus, true);\n      swiper.el.removeEventListener('pointerdown', handlePointerDown, true);\n      swiper.el.removeEventListener('pointerup', handlePointerUp, true);\n    }\n  }\n  on('beforeInit', () => {\n    liveRegion = createElement('span', swiper.params.a11y.notificationClass);\n    liveRegion.setAttribute('aria-live', 'assertive');\n    liveRegion.setAttribute('aria-atomic', 'true');\n  });\n  on('afterInit', () => {\n    if (!swiper.params.a11y.enabled) return;\n    init();\n  });\n  on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', () => {\n    if (!swiper.params.a11y.enabled) return;\n    initSlides();\n  });\n  on('fromEdge toEdge afterInit lock unlock', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updateNavigation();\n  });\n  on('paginationUpdate', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updatePagination();\n  });\n  on('destroy', () => {\n    if (!swiper.params.a11y.enabled) return;\n    destroy();\n  });\n}\n\nexport { A11y as default };\n","import { a as getWindow } from '../shared/ssr-window.esm.mjs';\n\nfunction History({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    history: {\n      enabled: false,\n      root: '',\n      replaceState: false,\n      key: 'slides',\n      keepQuery: false\n    }\n  });\n  let initialized = false;\n  let paths = {};\n  const slugify = text => {\n    return text.toString().replace(/\\s+/g, '-').replace(/[^\\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, '');\n  };\n  const getPathValues = urlOverride => {\n    const window = getWindow();\n    let location;\n    if (urlOverride) {\n      location = new URL(urlOverride);\n    } else {\n      location = window.location;\n    }\n    const pathArray = location.pathname.slice(1).split('/').filter(part => part !== '');\n    const total = pathArray.length;\n    const key = pathArray[total - 2];\n    const value = pathArray[total - 1];\n    return {\n      key,\n      value\n    };\n  };\n  const setHistory = (key, index) => {\n    const window = getWindow();\n    if (!initialized || !swiper.params.history.enabled) return;\n    let location;\n    if (swiper.params.url) {\n      location = new URL(swiper.params.url);\n    } else {\n      location = window.location;\n    }\n    const slide = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index=\"${index}\"]`) : swiper.slides[index];\n    let value = slugify(slide.getAttribute('data-history'));\n    if (swiper.params.history.root.length > 0) {\n      let root = swiper.params.history.root;\n      if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n      value = `${root}/${key ? `${key}/` : ''}${value}`;\n    } else if (!location.pathname.includes(key)) {\n      value = `${key ? `${key}/` : ''}${value}`;\n    }\n    if (swiper.params.history.keepQuery) {\n      value += location.search;\n    }\n    const currentState = window.history.state;\n    if (currentState && currentState.value === value) {\n      return;\n    }\n    if (swiper.params.history.replaceState) {\n      window.history.replaceState({\n        value\n      }, null, value);\n    } else {\n      window.history.pushState({\n        value\n      }, null, value);\n    }\n  };\n  const scrollToSlide = (speed, value, runCallbacks) => {\n    if (value) {\n      for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n        const slide = swiper.slides[i];\n        const slideHistory = slugify(slide.getAttribute('data-history'));\n        if (slideHistory === value) {\n          const index = swiper.getSlideIndex(slide);\n          swiper.slideTo(index, speed, runCallbacks);\n        }\n      }\n    } else {\n      swiper.slideTo(0, speed, runCallbacks);\n    }\n  };\n  const setHistoryPopState = () => {\n    paths = getPathValues(swiper.params.url);\n    scrollToSlide(swiper.params.speed, paths.value, false);\n  };\n  const init = () => {\n    const window = getWindow();\n    if (!swiper.params.history) return;\n    if (!window.history || !window.history.pushState) {\n      swiper.params.history.enabled = false;\n      swiper.params.hashNavigation.enabled = true;\n      return;\n    }\n    initialized = true;\n    paths = getPathValues(swiper.params.url);\n    if (!paths.key && !paths.value) {\n      if (!swiper.params.history.replaceState) {\n        window.addEventListener('popstate', setHistoryPopState);\n      }\n      return;\n    }\n    scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n    if (!swiper.params.history.replaceState) {\n      window.addEventListener('popstate', setHistoryPopState);\n    }\n  };\n  const destroy = () => {\n    const window = getWindow();\n    if (!swiper.params.history.replaceState) {\n      window.removeEventListener('popstate', setHistoryPopState);\n    }\n  };\n  on('init', () => {\n    if (swiper.params.history.enabled) {\n      init();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.params.history.enabled) {\n      destroy();\n    }\n  });\n  on('transitionEnd _freeModeNoMomentumRelease', () => {\n    if (initialized) {\n      setHistory(swiper.params.history.key, swiper.activeIndex);\n    }\n  });\n  on('slideChange', () => {\n    if (initialized && swiper.params.cssMode) {\n      setHistory(swiper.params.history.key, swiper.activeIndex);\n    }\n  });\n}\n\nexport { History as default };\n","import { g as getDocument, a as getWindow } from '../shared/ssr-window.esm.mjs';\nimport { e as elementChildren } from '../shared/utils.mjs';\n\nfunction HashNavigation({\n  swiper,\n  extendParams,\n  emit,\n  on\n}) {\n  let initialized = false;\n  const document = getDocument();\n  const window = getWindow();\n  extendParams({\n    hashNavigation: {\n      enabled: false,\n      replaceState: false,\n      watchState: false,\n      getSlideIndex(_s, hash) {\n        if (swiper.virtual && swiper.params.virtual.enabled) {\n          const slideWithHash = swiper.slides.find(slideEl => slideEl.getAttribute('data-hash') === hash);\n          if (!slideWithHash) return 0;\n          const index = parseInt(slideWithHash.getAttribute('data-swiper-slide-index'), 10);\n          return index;\n        }\n        return swiper.getSlideIndex(elementChildren(swiper.slidesEl, `.${swiper.params.slideClass}[data-hash=\"${hash}\"], swiper-slide[data-hash=\"${hash}\"]`)[0]);\n      }\n    }\n  });\n  const onHashChange = () => {\n    emit('hashChange');\n    const newHash = document.location.hash.replace('#', '');\n    const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index=\"${swiper.activeIndex}\"]`) : swiper.slides[swiper.activeIndex];\n    const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') : '';\n    if (newHash !== activeSlideHash) {\n      const newIndex = swiper.params.hashNavigation.getSlideIndex(swiper, newHash);\n      if (typeof newIndex === 'undefined' || Number.isNaN(newIndex)) return;\n      swiper.slideTo(newIndex);\n    }\n  };\n  const setHash = () => {\n    if (!initialized || !swiper.params.hashNavigation.enabled) return;\n    const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index=\"${swiper.activeIndex}\"]`) : swiper.slides[swiper.activeIndex];\n    const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') || activeSlideEl.getAttribute('data-history') : '';\n    if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) {\n      window.history.replaceState(null, null, `#${activeSlideHash}` || '');\n      emit('hashSet');\n    } else {\n      document.location.hash = activeSlideHash || '';\n      emit('hashSet');\n    }\n  };\n  const init = () => {\n    if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return;\n    initialized = true;\n    const hash = document.location.hash.replace('#', '');\n    if (hash) {\n      const speed = 0;\n      const index = swiper.params.hashNavigation.getSlideIndex(swiper, hash);\n      swiper.slideTo(index || 0, speed, swiper.params.runCallbacksOnInit, true);\n    }\n    if (swiper.params.hashNavigation.watchState) {\n      window.addEventListener('hashchange', onHashChange);\n    }\n  };\n  const destroy = () => {\n    if (swiper.params.hashNavigation.watchState) {\n      window.removeEventListener('hashchange', onHashChange);\n    }\n  };\n  on('init', () => {\n    if (swiper.params.hashNavigation.enabled) {\n      init();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.params.hashNavigation.enabled) {\n      destroy();\n    }\n  });\n  on('transitionEnd _freeModeNoMomentumRelease', () => {\n    if (initialized) {\n      setHash();\n    }\n  });\n  on('slideChange', () => {\n    if (initialized && swiper.params.cssMode) {\n      setHash();\n    }\n  });\n}\n\nexport { HashNavigation as default };\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\n\n/* eslint no-underscore-dangle: \"off\" */\n/* eslint no-use-before-define: \"off\" */\nfunction Autoplay({\n  swiper,\n  extendParams,\n  on,\n  emit,\n  params\n}) {\n  swiper.autoplay = {\n    running: false,\n    paused: false,\n    timeLeft: 0\n  };\n  extendParams({\n    autoplay: {\n      enabled: false,\n      delay: 3000,\n      waitForTransition: true,\n      disableOnInteraction: false,\n      stopOnLastSlide: false,\n      reverseDirection: false,\n      pauseOnMouseEnter: false\n    }\n  });\n  let timeout;\n  let raf;\n  let autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3000;\n  let autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3000;\n  let autoplayTimeLeft;\n  let autoplayStartTime = new Date().getTime();\n  let wasPaused;\n  let isTouched;\n  let pausedByTouch;\n  let touchStartTimeout;\n  let pausedByInteraction;\n  let pausedByPointerEnter;\n  function onTransitionEnd(e) {\n    if (!swiper || swiper.destroyed || !swiper.wrapperEl) return;\n    if (e.target !== swiper.wrapperEl) return;\n    swiper.wrapperEl.removeEventListener('transitionend', onTransitionEnd);\n    if (pausedByPointerEnter || e.detail && e.detail.bySwiperTouchMove) {\n      return;\n    }\n    resume();\n  }\n  const calcTimeLeft = () => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    if (swiper.autoplay.paused) {\n      wasPaused = true;\n    } else if (wasPaused) {\n      autoplayDelayCurrent = autoplayTimeLeft;\n      wasPaused = false;\n    }\n    const timeLeft = swiper.autoplay.paused ? autoplayTimeLeft : autoplayStartTime + autoplayDelayCurrent - new Date().getTime();\n    swiper.autoplay.timeLeft = timeLeft;\n    emit('autoplayTimeLeft', timeLeft, timeLeft / autoplayDelayTotal);\n    raf = requestAnimationFrame(() => {\n      calcTimeLeft();\n    });\n  };\n  const getSlideDelay = () => {\n    let activeSlideEl;\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      activeSlideEl = swiper.slides.find(slideEl => slideEl.classList.contains('swiper-slide-active'));\n    } else {\n      activeSlideEl = swiper.slides[swiper.activeIndex];\n    }\n    if (!activeSlideEl) return undefined;\n    const currentSlideDelay = parseInt(activeSlideEl.getAttribute('data-swiper-autoplay'), 10);\n    return currentSlideDelay;\n  };\n  const getTotalDelay = () => {\n    let totalDelay = swiper.params.autoplay.delay;\n    const currentSlideDelay = getSlideDelay();\n    if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0) {\n      totalDelay = currentSlideDelay;\n    }\n    return totalDelay;\n  };\n  const run = delayForce => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    cancelAnimationFrame(raf);\n    calcTimeLeft();\n    let delay = delayForce;\n    if (typeof delay === 'undefined') {\n      delay = getTotalDelay();\n      autoplayDelayTotal = delay;\n      autoplayDelayCurrent = delay;\n    }\n    autoplayTimeLeft = delay;\n    const speed = swiper.params.speed;\n    const proceed = () => {\n      if (!swiper || swiper.destroyed) return;\n      if (swiper.params.autoplay.reverseDirection) {\n        if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) {\n          swiper.slidePrev(speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.params.autoplay.stopOnLastSlide) {\n          swiper.slideTo(swiper.slides.length - 1, speed, true, true);\n          emit('autoplay');\n        }\n      } else {\n        if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) {\n          swiper.slideNext(speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.params.autoplay.stopOnLastSlide) {\n          swiper.slideTo(0, speed, true, true);\n          emit('autoplay');\n        }\n      }\n      if (swiper.params.cssMode) {\n        autoplayStartTime = new Date().getTime();\n        requestAnimationFrame(() => {\n          run();\n        });\n      }\n    };\n    if (delay > 0) {\n      clearTimeout(timeout);\n      timeout = setTimeout(() => {\n        proceed();\n      }, delay);\n    } else {\n      requestAnimationFrame(() => {\n        proceed();\n      });\n    }\n\n    // eslint-disable-next-line\n    return delay;\n  };\n  const start = () => {\n    autoplayStartTime = new Date().getTime();\n    swiper.autoplay.running = true;\n    run();\n    emit('autoplayStart');\n  };\n  const stop = () => {\n    swiper.autoplay.running = false;\n    clearTimeout(timeout);\n    cancelAnimationFrame(raf);\n    emit('autoplayStop');\n  };\n  const pause = (internal, reset) => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    clearTimeout(timeout);\n    if (!internal) {\n      pausedByInteraction = true;\n    }\n    const proceed = () => {\n      emit('autoplayPause');\n      if (swiper.params.autoplay.waitForTransition) {\n        swiper.wrapperEl.addEventListener('transitionend', onTransitionEnd);\n      } else {\n        resume();\n      }\n    };\n    swiper.autoplay.paused = true;\n    if (reset) {\n      proceed();\n      return;\n    }\n    const delay = autoplayTimeLeft || swiper.params.autoplay.delay;\n    autoplayTimeLeft = delay - (new Date().getTime() - autoplayStartTime);\n    if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) return;\n    if (autoplayTimeLeft < 0) autoplayTimeLeft = 0;\n    proceed();\n  };\n  const resume = () => {\n    if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop || swiper.destroyed || !swiper.autoplay.running) return;\n    autoplayStartTime = new Date().getTime();\n    if (pausedByInteraction) {\n      pausedByInteraction = false;\n      run(autoplayTimeLeft);\n    } else {\n      run();\n    }\n    swiper.autoplay.paused = false;\n    emit('autoplayResume');\n  };\n  const onVisibilityChange = () => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    const document = getDocument();\n    if (document.visibilityState === 'hidden') {\n      pausedByInteraction = true;\n      pause(true);\n    }\n    if (document.visibilityState === 'visible') {\n      resume();\n    }\n  };\n  const onPointerEnter = e => {\n    if (e.pointerType !== 'mouse') return;\n    pausedByInteraction = true;\n    pausedByPointerEnter = true;\n    if (swiper.animating || swiper.autoplay.paused) return;\n    pause(true);\n  };\n  const onPointerLeave = e => {\n    if (e.pointerType !== 'mouse') return;\n    pausedByPointerEnter = false;\n    if (swiper.autoplay.paused) {\n      resume();\n    }\n  };\n  const attachMouseEvents = () => {\n    if (swiper.params.autoplay.pauseOnMouseEnter) {\n      swiper.el.addEventListener('pointerenter', onPointerEnter);\n      swiper.el.addEventListener('pointerleave', onPointerLeave);\n    }\n  };\n  const detachMouseEvents = () => {\n    if (swiper.el && typeof swiper.el !== 'string') {\n      swiper.el.removeEventListener('pointerenter', onPointerEnter);\n      swiper.el.removeEventListener('pointerleave', onPointerLeave);\n    }\n  };\n  const attachDocumentEvents = () => {\n    const document = getDocument();\n    document.addEventListener('visibilitychange', onVisibilityChange);\n  };\n  const detachDocumentEvents = () => {\n    const document = getDocument();\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n  };\n  on('init', () => {\n    if (swiper.params.autoplay.enabled) {\n      attachMouseEvents();\n      attachDocumentEvents();\n      start();\n    }\n  });\n  on('destroy', () => {\n    detachMouseEvents();\n    detachDocumentEvents();\n    if (swiper.autoplay.running) {\n      stop();\n    }\n  });\n  on('_freeModeStaticRelease', () => {\n    if (pausedByTouch || pausedByInteraction) {\n      resume();\n    }\n  });\n  on('_freeModeNoMomentumRelease', () => {\n    if (!swiper.params.autoplay.disableOnInteraction) {\n      pause(true, true);\n    } else {\n      stop();\n    }\n  });\n  on('beforeTransitionStart', (_s, speed, internal) => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    if (internal || !swiper.params.autoplay.disableOnInteraction) {\n      pause(true, true);\n    } else {\n      stop();\n    }\n  });\n  on('sliderFirstMove', () => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    if (swiper.params.autoplay.disableOnInteraction) {\n      stop();\n      return;\n    }\n    isTouched = true;\n    pausedByTouch = false;\n    pausedByInteraction = false;\n    touchStartTimeout = setTimeout(() => {\n      pausedByInteraction = true;\n      pausedByTouch = true;\n      pause(true);\n    }, 200);\n  });\n  on('touchEnd', () => {\n    if (swiper.destroyed || !swiper.autoplay.running || !isTouched) return;\n    clearTimeout(touchStartTimeout);\n    clearTimeout(timeout);\n    if (swiper.params.autoplay.disableOnInteraction) {\n      pausedByTouch = false;\n      isTouched = false;\n      return;\n    }\n    if (pausedByTouch && swiper.params.cssMode) resume();\n    pausedByTouch = false;\n    isTouched = false;\n  });\n  on('slideChange', () => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    if (swiper.autoplay.paused) {\n      autoplayTimeLeft = getTotalDelay();\n      autoplayDelayTotal = getTotalDelay();\n    }\n  });\n  Object.assign(swiper.autoplay, {\n    start,\n    stop,\n    pause,\n    resume\n  });\n}\n\nexport { Autoplay as default };\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\nimport { p as isObject, e as elementChildren } from '../shared/utils.mjs';\n\nfunction Thumb({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    thumbs: {\n      swiper: null,\n      multipleActiveThumbs: true,\n      autoScrollOffset: 0,\n      slideThumbActiveClass: 'swiper-slide-thumb-active',\n      thumbsContainerClass: 'swiper-thumbs'\n    }\n  });\n  let initialized = false;\n  let swiperCreated = false;\n  swiper.thumbs = {\n    swiper: null\n  };\n  function isVirtualEnabled() {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return false;\n    return thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled;\n  }\n  function onThumbClick() {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    const clickedIndex = thumbsSwiper.clickedIndex;\n    const clickedSlide = thumbsSwiper.clickedSlide;\n    if (clickedSlide && clickedSlide.classList.contains(swiper.params.thumbs.slideThumbActiveClass)) return;\n    if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n    let slideToIndex;\n    if (thumbsSwiper.params.loop) {\n      slideToIndex = parseInt(thumbsSwiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);\n    } else {\n      slideToIndex = clickedIndex;\n    }\n    if (swiper.params.loop) {\n      swiper.slideToLoop(slideToIndex);\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  }\n  function init() {\n    const {\n      thumbs: thumbsParams\n    } = swiper.params;\n    if (initialized) return false;\n    initialized = true;\n    const SwiperClass = swiper.constructor;\n    if (thumbsParams.swiper instanceof SwiperClass) {\n      if (thumbsParams.swiper.destroyed) {\n        initialized = false;\n        return false;\n      }\n      swiper.thumbs.swiper = thumbsParams.swiper;\n      Object.assign(swiper.thumbs.swiper.originalParams, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false\n      });\n      Object.assign(swiper.thumbs.swiper.params, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false\n      });\n      swiper.thumbs.swiper.update();\n    } else if (isObject(thumbsParams.swiper)) {\n      const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n      Object.assign(thumbsSwiperParams, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false\n      });\n      swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n      swiperCreated = true;\n    }\n    swiper.thumbs.swiper.el.classList.add(swiper.params.thumbs.thumbsContainerClass);\n    swiper.thumbs.swiper.on('tap', onThumbClick);\n    if (isVirtualEnabled()) {\n      swiper.thumbs.swiper.on('virtualUpdate', () => {\n        update(false, {\n          autoScroll: false\n        });\n      });\n    }\n    return true;\n  }\n  function update(initial, p) {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n\n    // Activate thumbs\n    let thumbsToActivate = 1;\n    const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n    if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n      thumbsToActivate = swiper.params.slidesPerView;\n    }\n    if (!swiper.params.thumbs.multipleActiveThumbs) {\n      thumbsToActivate = 1;\n    }\n    thumbsToActivate = Math.floor(thumbsToActivate);\n    thumbsSwiper.slides.forEach(slideEl => slideEl.classList.remove(thumbActiveClass));\n    if (thumbsSwiper.params.loop || isVirtualEnabled()) {\n      for (let i = 0; i < thumbsToActivate; i += 1) {\n        elementChildren(thumbsSwiper.slidesEl, `[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`).forEach(slideEl => {\n          slideEl.classList.add(thumbActiveClass);\n        });\n      }\n    } else {\n      for (let i = 0; i < thumbsToActivate; i += 1) {\n        if (thumbsSwiper.slides[swiper.realIndex + i]) {\n          thumbsSwiper.slides[swiper.realIndex + i].classList.add(thumbActiveClass);\n        }\n      }\n    }\n    if (p?.autoScroll ?? true) {\n      autoScroll(initial ? 0 : undefined);\n    }\n  }\n  function autoScroll(slideSpeed) {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView;\n    const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n    const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n    if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n      const currentThumbsIndex = thumbsSwiper.activeIndex;\n      let newThumbsIndex;\n      let direction;\n      if (thumbsSwiper.params.loop) {\n        const newThumbsSlide = thumbsSwiper.slides.find(slideEl => slideEl.getAttribute('data-swiper-slide-index') === `${swiper.realIndex}`);\n        newThumbsIndex = thumbsSwiper.slides.indexOf(newThumbsSlide);\n        direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n      } else {\n        newThumbsIndex = swiper.realIndex;\n        direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n      }\n      if (useOffset) {\n        newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n      }\n      if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {\n        if (thumbsSwiper.params.centeredSlides) {\n          if (newThumbsIndex > currentThumbsIndex) {\n            newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n          } else {\n            newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n          }\n        } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) ;\n        thumbsSwiper.slideTo(newThumbsIndex, slideSpeed);\n      }\n    }\n  }\n  on('beforeInit', () => {\n    const {\n      thumbs\n    } = swiper.params;\n    if (!thumbs || !thumbs.swiper) return;\n    if (typeof thumbs.swiper === 'string' || thumbs.swiper instanceof HTMLElement) {\n      const document = getDocument();\n      const getThumbsElementAndInit = () => {\n        const thumbsElement = typeof thumbs.swiper === 'string' ? document.querySelector(thumbs.swiper) : thumbs.swiper;\n        if (thumbsElement && thumbsElement.swiper) {\n          thumbs.swiper = thumbsElement.swiper;\n          init();\n          update(true);\n        } else if (thumbsElement) {\n          const eventName = `${swiper.params.eventsPrefix}init`;\n          const onThumbsSwiper = e => {\n            thumbs.swiper = e.detail[0];\n            thumbsElement.removeEventListener(eventName, onThumbsSwiper);\n            init();\n            update(true);\n            thumbs.swiper.update();\n            swiper.update();\n          };\n          thumbsElement.addEventListener(eventName, onThumbsSwiper);\n        }\n        return thumbsElement;\n      };\n      const watchForThumbsToAppear = () => {\n        if (swiper.destroyed) return;\n        const thumbsElement = getThumbsElementAndInit();\n        if (!thumbsElement) {\n          requestAnimationFrame(watchForThumbsToAppear);\n        }\n      };\n      requestAnimationFrame(watchForThumbsToAppear);\n    } else {\n      init();\n      update(true);\n    }\n  });\n  on('slideChange update resize observerUpdate', () => {\n    update();\n  });\n  on('setTransition', (_s, duration) => {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    thumbsSwiper.setTransition(duration);\n  });\n  on('beforeDestroy', () => {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    if (swiperCreated) {\n      thumbsSwiper.destroy();\n    }\n  });\n  Object.assign(swiper.thumbs, {\n    init,\n    update\n  });\n}\n\nexport { Thumb as default };\n","import { h as now, o as elementTransitionEnd } from '../shared/utils.mjs';\n\nfunction freeMode({\n  swiper,\n  extendParams,\n  emit,\n  once\n}) {\n  extendParams({\n    freeMode: {\n      enabled: false,\n      momentum: true,\n      momentumRatio: 1,\n      momentumBounce: true,\n      momentumBounceRatio: 1,\n      momentumVelocityRatio: 1,\n      sticky: false,\n      minimumVelocity: 0.02\n    }\n  });\n  function onTouchStart() {\n    if (swiper.params.cssMode) return;\n    const translate = swiper.getTranslate();\n    swiper.setTranslate(translate);\n    swiper.setTransition(0);\n    swiper.touchEventsData.velocities.length = 0;\n    swiper.freeMode.onTouchEnd({\n      currentPos: swiper.rtl ? swiper.translate : -swiper.translate\n    });\n  }\n  function onTouchMove() {\n    if (swiper.params.cssMode) return;\n    const {\n      touchEventsData: data,\n      touches\n    } = swiper;\n    // Velocity\n    if (data.velocities.length === 0) {\n      data.velocities.push({\n        position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n        time: data.touchStartTime\n      });\n    }\n    data.velocities.push({\n      position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n      time: now()\n    });\n  }\n  function onTouchEnd({\n    currentPos\n  }) {\n    if (swiper.params.cssMode) return;\n    const {\n      params,\n      wrapperEl,\n      rtlTranslate: rtl,\n      snapGrid,\n      touchEventsData: data\n    } = swiper;\n    // Time diff\n    const touchEndTime = now();\n    const timeDiff = touchEndTime - data.touchStartTime;\n    if (currentPos < -swiper.minTranslate()) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n    if (currentPos > -swiper.maxTranslate()) {\n      if (swiper.slides.length < snapGrid.length) {\n        swiper.slideTo(snapGrid.length - 1);\n      } else {\n        swiper.slideTo(swiper.slides.length - 1);\n      }\n      return;\n    }\n    if (params.freeMode.momentum) {\n      if (data.velocities.length > 1) {\n        const lastMoveEvent = data.velocities.pop();\n        const velocityEvent = data.velocities.pop();\n        const distance = lastMoveEvent.position - velocityEvent.position;\n        const time = lastMoveEvent.time - velocityEvent.time;\n        swiper.velocity = distance / time;\n        swiper.velocity /= 2;\n        if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n          swiper.velocity = 0;\n        }\n        // this implies that the user stopped moving a finger then released.\n        // There would be no events with distance zero, so the last event is stale.\n        if (time > 150 || now() - lastMoveEvent.time > 300) {\n          swiper.velocity = 0;\n        }\n      } else {\n        swiper.velocity = 0;\n      }\n      swiper.velocity *= params.freeMode.momentumVelocityRatio;\n      data.velocities.length = 0;\n      let momentumDuration = 1000 * params.freeMode.momentumRatio;\n      const momentumDistance = swiper.velocity * momentumDuration;\n      let newPosition = swiper.translate + momentumDistance;\n      if (rtl) newPosition = -newPosition;\n      let doBounce = false;\n      let afterBouncePosition;\n      const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n      let needsLoopFix;\n      if (newPosition < swiper.maxTranslate()) {\n        if (params.freeMode.momentumBounce) {\n          if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n            newPosition = swiper.maxTranslate() - bounceAmount;\n          }\n          afterBouncePosition = swiper.maxTranslate();\n          doBounce = true;\n          data.allowMomentumBounce = true;\n        } else {\n          newPosition = swiper.maxTranslate();\n        }\n        if (params.loop && params.centeredSlides) needsLoopFix = true;\n      } else if (newPosition > swiper.minTranslate()) {\n        if (params.freeMode.momentumBounce) {\n          if (newPosition - swiper.minTranslate() > bounceAmount) {\n            newPosition = swiper.minTranslate() + bounceAmount;\n          }\n          afterBouncePosition = swiper.minTranslate();\n          doBounce = true;\n          data.allowMomentumBounce = true;\n        } else {\n          newPosition = swiper.minTranslate();\n        }\n        if (params.loop && params.centeredSlides) needsLoopFix = true;\n      } else if (params.freeMode.sticky) {\n        let nextSlide;\n        for (let j = 0; j < snapGrid.length; j += 1) {\n          if (snapGrid[j] > -newPosition) {\n            nextSlide = j;\n            break;\n          }\n        }\n        if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {\n          newPosition = snapGrid[nextSlide];\n        } else {\n          newPosition = snapGrid[nextSlide - 1];\n        }\n        newPosition = -newPosition;\n      }\n      if (needsLoopFix) {\n        once('transitionEnd', () => {\n          swiper.loopFix();\n        });\n      }\n      // Fix duration\n      if (swiper.velocity !== 0) {\n        if (rtl) {\n          momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n        } else {\n          momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n        }\n        if (params.freeMode.sticky) {\n          // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n          // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n          // It's easy to see this when simulating touch with mouse events. To fix this,\n          // limit single-slide swipes to the default slide duration. This also has the\n          // nice side effect of matching slide speed if the user stopped moving before\n          // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n          // For faster swipes, also apply limits (albeit higher ones).\n          const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n          const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n          if (moveDistance < currentSlideSize) {\n            momentumDuration = params.speed;\n          } else if (moveDistance < 2 * currentSlideSize) {\n            momentumDuration = params.speed * 1.5;\n          } else {\n            momentumDuration = params.speed * 2.5;\n          }\n        }\n      } else if (params.freeMode.sticky) {\n        swiper.slideToClosest();\n        return;\n      }\n      if (params.freeMode.momentumBounce && doBounce) {\n        swiper.updateProgress(afterBouncePosition);\n        swiper.setTransition(momentumDuration);\n        swiper.setTranslate(newPosition);\n        swiper.transitionStart(true, swiper.swipeDirection);\n        swiper.animating = true;\n        elementTransitionEnd(wrapperEl, () => {\n          if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n          emit('momentumBounce');\n          swiper.setTransition(params.speed);\n          setTimeout(() => {\n            swiper.setTranslate(afterBouncePosition);\n            elementTransitionEnd(wrapperEl, () => {\n              if (!swiper || swiper.destroyed) return;\n              swiper.transitionEnd();\n            });\n          }, 0);\n        });\n      } else if (swiper.velocity) {\n        emit('_freeModeNoMomentumRelease');\n        swiper.updateProgress(newPosition);\n        swiper.setTransition(momentumDuration);\n        swiper.setTranslate(newPosition);\n        swiper.transitionStart(true, swiper.swipeDirection);\n        if (!swiper.animating) {\n          swiper.animating = true;\n          elementTransitionEnd(wrapperEl, () => {\n            if (!swiper || swiper.destroyed) return;\n            swiper.transitionEnd();\n          });\n        }\n      } else {\n        swiper.updateProgress(newPosition);\n      }\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    } else if (params.freeMode.sticky) {\n      swiper.slideToClosest();\n      return;\n    } else if (params.freeMode) {\n      emit('_freeModeNoMomentumRelease');\n    }\n    if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n      emit('_freeModeStaticRelease');\n      swiper.updateProgress();\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n  }\n  Object.assign(swiper, {\n    freeMode: {\n      onTouchStart,\n      onTouchMove,\n      onTouchEnd\n    }\n  });\n}\n\nexport { freeMode as default };\n","function Grid({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    grid: {\n      rows: 1,\n      fill: 'column'\n    }\n  });\n  let slidesNumberEvenToRows;\n  let slidesPerRow;\n  let numFullColumns;\n  let wasMultiRow;\n  const getSpaceBetween = () => {\n    let spaceBetween = swiper.params.spaceBetween;\n    if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n      spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;\n    } else if (typeof spaceBetween === 'string') {\n      spaceBetween = parseFloat(spaceBetween);\n    }\n    return spaceBetween;\n  };\n  const initSlides = slides => {\n    const {\n      slidesPerView\n    } = swiper.params;\n    const {\n      rows,\n      fill\n    } = swiper.params.grid;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : slides.length;\n    numFullColumns = Math.floor(slidesLength / rows);\n    if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n      slidesNumberEvenToRows = slidesLength;\n    } else {\n      slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n    }\n    if (slidesPerView !== 'auto' && fill === 'row') {\n      slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, Math.floor(slidesPerView) * rows);\n    }\n    slidesPerRow = slidesNumberEvenToRows / rows;\n  };\n  const unsetSlides = () => {\n    if (swiper.slides) {\n      swiper.slides.forEach(slide => {\n        if (slide.swiperSlideGridSet) {\n          slide.style.height = '';\n          slide.style[swiper.getDirectionLabel('margin-top')] = '';\n        }\n      });\n    }\n  };\n  const updateSlide = (i, slide, slides) => {\n    const {\n      slidesPerGroup\n    } = swiper.params;\n    const spaceBetween = getSpaceBetween();\n    const {\n      rows,\n      fill\n    } = swiper.params.grid;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : slides.length;\n    // Set slides order\n    let newSlideOrderIndex;\n    let column;\n    let row;\n    if (fill === 'row' && slidesPerGroup > 1) {\n      const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n      const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n      const columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup);\n      row = Math.floor(slideIndexInGroup / columnsInGroup);\n      column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n      newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows;\n      slide.style.order = newSlideOrderIndex;\n    } else if (fill === 'column') {\n      column = Math.floor(i / rows);\n      row = i - column * rows;\n      if (column > numFullColumns || column === numFullColumns && row === rows - 1) {\n        row += 1;\n        if (row >= rows) {\n          row = 0;\n          column += 1;\n        }\n      }\n    } else {\n      row = Math.floor(i / slidesPerRow);\n      column = i - row * slidesPerRow;\n    }\n    slide.row = row;\n    slide.column = column;\n    slide.style.height = `calc((100% - ${(rows - 1) * spaceBetween}px) / ${rows})`;\n    slide.style[swiper.getDirectionLabel('margin-top')] = row !== 0 ? spaceBetween && `${spaceBetween}px` : '';\n    slide.swiperSlideGridSet = true;\n  };\n  const updateWrapperSize = (slideSize, snapGrid) => {\n    const {\n      centeredSlides,\n      roundLengths\n    } = swiper.params;\n    const spaceBetween = getSpaceBetween();\n    const {\n      rows\n    } = swiper.params.grid;\n    swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n    swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n    if (!swiper.params.cssMode) {\n      swiper.wrapperEl.style[swiper.getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;\n    }\n    if (centeredSlides) {\n      const newSlidesGrid = [];\n      for (let i = 0; i < snapGrid.length; i += 1) {\n        let slidesGridItem = snapGrid[i];\n        if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n        if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n      }\n      snapGrid.splice(0, snapGrid.length);\n      snapGrid.push(...newSlidesGrid);\n    }\n  };\n  const onInit = () => {\n    wasMultiRow = swiper.params.grid && swiper.params.grid.rows > 1;\n  };\n  const onUpdate = () => {\n    const {\n      params,\n      el\n    } = swiper;\n    const isMultiRow = params.grid && params.grid.rows > 1;\n    if (wasMultiRow && !isMultiRow) {\n      el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);\n      numFullColumns = 1;\n      swiper.emitContainerClasses();\n    } else if (!wasMultiRow && isMultiRow) {\n      el.classList.add(`${params.containerModifierClass}grid`);\n      if (params.grid.fill === 'column') {\n        el.classList.add(`${params.containerModifierClass}grid-column`);\n      }\n      swiper.emitContainerClasses();\n    }\n    wasMultiRow = isMultiRow;\n  };\n  on('init', onInit);\n  on('update', onUpdate);\n  swiper.grid = {\n    initSlides,\n    unsetSlides,\n    updateSlide,\n    updateWrapperSize\n  };\n}\n\nexport { Grid as default };\n","import { s as setInnerHTML } from '../shared/utils.mjs';\n\nfunction appendSlide(slides) {\n  const swiper = this;\n  const {\n    params,\n    slidesEl\n  } = swiper;\n  if (params.loop) {\n    swiper.loopDestroy();\n  }\n  const appendElement = slideEl => {\n    if (typeof slideEl === 'string') {\n      const tempDOM = document.createElement('div');\n      setInnerHTML(tempDOM, slideEl);\n      slidesEl.append(tempDOM.children[0]);\n      setInnerHTML(tempDOM, '');\n    } else {\n      slidesEl.append(slideEl);\n    }\n  };\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) appendElement(slides[i]);\n    }\n  } else {\n    appendElement(slides);\n  }\n  swiper.recalcSlides();\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n  if (!params.observer || swiper.isElement) {\n    swiper.update();\n  }\n}\n\nfunction prependSlide(slides) {\n  const swiper = this;\n  const {\n    params,\n    activeIndex,\n    slidesEl\n  } = swiper;\n  if (params.loop) {\n    swiper.loopDestroy();\n  }\n  let newActiveIndex = activeIndex + 1;\n  const prependElement = slideEl => {\n    if (typeof slideEl === 'string') {\n      const tempDOM = document.createElement('div');\n      setInnerHTML(tempDOM, slideEl);\n      slidesEl.prepend(tempDOM.children[0]);\n      setInnerHTML(tempDOM, '');\n    } else {\n      slidesEl.prepend(slideEl);\n    }\n  };\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) prependElement(slides[i]);\n    }\n    newActiveIndex = activeIndex + slides.length;\n  } else {\n    prependElement(slides);\n  }\n  swiper.recalcSlides();\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n  if (!params.observer || swiper.isElement) {\n    swiper.update();\n  }\n  swiper.slideTo(newActiveIndex, 0, false);\n}\n\nfunction addSlide(index, slides) {\n  const swiper = this;\n  const {\n    params,\n    activeIndex,\n    slidesEl\n  } = swiper;\n  let activeIndexBuffer = activeIndex;\n  if (params.loop) {\n    activeIndexBuffer -= swiper.loopedSlides;\n    swiper.loopDestroy();\n    swiper.recalcSlides();\n  }\n  const baseLength = swiper.slides.length;\n  if (index <= 0) {\n    swiper.prependSlide(slides);\n    return;\n  }\n  if (index >= baseLength) {\n    swiper.appendSlide(slides);\n    return;\n  }\n  let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n  const slidesBuffer = [];\n  for (let i = baseLength - 1; i >= index; i -= 1) {\n    const currentSlide = swiper.slides[i];\n    currentSlide.remove();\n    slidesBuffer.unshift(currentSlide);\n  }\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) slidesEl.append(slides[i]);\n    }\n    newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n  } else {\n    slidesEl.append(slides);\n  }\n  for (let i = 0; i < slidesBuffer.length; i += 1) {\n    slidesEl.append(slidesBuffer[i]);\n  }\n  swiper.recalcSlides();\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n  if (!params.observer || swiper.isElement) {\n    swiper.update();\n  }\n  if (params.loop) {\n    swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n  } else {\n    swiper.slideTo(newActiveIndex, 0, false);\n  }\n}\n\nfunction removeSlide(slidesIndexes) {\n  const swiper = this;\n  const {\n    params,\n    activeIndex\n  } = swiper;\n  let activeIndexBuffer = activeIndex;\n  if (params.loop) {\n    activeIndexBuffer -= swiper.loopedSlides;\n    swiper.loopDestroy();\n  }\n  let newActiveIndex = activeIndexBuffer;\n  let indexToRemove;\n  if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n    for (let i = 0; i < slidesIndexes.length; i += 1) {\n      indexToRemove = slidesIndexes[i];\n      if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();\n      if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n    }\n    newActiveIndex = Math.max(newActiveIndex, 0);\n  } else {\n    indexToRemove = slidesIndexes;\n    if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();\n    if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n    newActiveIndex = Math.max(newActiveIndex, 0);\n  }\n  swiper.recalcSlides();\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n  if (!params.observer || swiper.isElement) {\n    swiper.update();\n  }\n  if (params.loop) {\n    swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n  } else {\n    swiper.slideTo(newActiveIndex, 0, false);\n  }\n}\n\nfunction removeAllSlides() {\n  const swiper = this;\n  const slidesIndexes = [];\n  for (let i = 0; i < swiper.slides.length; i += 1) {\n    slidesIndexes.push(i);\n  }\n  swiper.removeSlide(slidesIndexes);\n}\n\nfunction Manipulation({\n  swiper\n}) {\n  Object.assign(swiper, {\n    appendSlide: appendSlide.bind(swiper),\n    prependSlide: prependSlide.bind(swiper),\n    addSlide: addSlide.bind(swiper),\n    removeSlide: removeSlide.bind(swiper),\n    removeAllSlides: removeAllSlides.bind(swiper)\n  });\n}\n\nexport { Manipulation as default };\n","function effectInit(params) {\n  const {\n    effect,\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    overwriteParams,\n    perspective,\n    recreateShadows,\n    getEffectParams\n  } = params;\n  on('beforeInit', () => {\n    if (swiper.params.effect !== effect) return;\n    swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n    if (perspective && perspective()) {\n      swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n    }\n    const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n    Object.assign(swiper.params, overwriteParamsResult);\n    Object.assign(swiper.originalParams, overwriteParamsResult);\n  });\n  on('setTranslate _virtualUpdated', () => {\n    if (swiper.params.effect !== effect) return;\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    if (swiper.params.effect !== effect) return;\n    setTransition(duration);\n  });\n  on('transitionEnd', () => {\n    if (swiper.params.effect !== effect) return;\n    if (recreateShadows) {\n      if (!getEffectParams || !getEffectParams().slideShadows) return;\n      // remove shadows\n      swiper.slides.forEach(slideEl => {\n        slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => shadowEl.remove());\n      });\n      // create new one\n      recreateShadows();\n    }\n  });\n  let requireUpdateOnVirtual;\n  on('virtualUpdate', () => {\n    if (swiper.params.effect !== effect) return;\n    if (!swiper.slides.length) {\n      requireUpdateOnVirtual = true;\n    }\n    requestAnimationFrame(() => {\n      if (requireUpdateOnVirtual && swiper.slides && swiper.slides.length) {\n        setTranslate();\n        requireUpdateOnVirtual = false;\n      }\n    });\n  });\n}\n\nexport { effectInit as e };\n","import { g as getSlideTransformEl } from './utils.mjs';\n\nfunction effectTarget(effectParams, slideEl) {\n  const transformEl = getSlideTransformEl(slideEl);\n  if (transformEl !== slideEl) {\n    transformEl.style.backfaceVisibility = 'hidden';\n    transformEl.style['-webkit-backface-visibility'] = 'hidden';\n  }\n  return transformEl;\n}\n\nexport { effectTarget as e };\n","import { o as elementTransitionEnd } from './utils.mjs';\n\nfunction effectVirtualTransitionEnd({\n  swiper,\n  duration,\n  transformElements,\n  allSlides\n}) {\n  const {\n    activeIndex\n  } = swiper;\n  const getSlide = el => {\n    if (!el.parentElement) {\n      // assume shadow root\n      const slide = swiper.slides.find(slideEl => slideEl.shadowRoot && slideEl.shadowRoot === el.parentNode);\n      return slide;\n    }\n    return el.parentElement;\n  };\n  if (swiper.params.virtualTranslate && duration !== 0) {\n    let eventTriggered = false;\n    let transitionEndTarget;\n    if (allSlides) {\n      transitionEndTarget = transformElements;\n    } else {\n      transitionEndTarget = transformElements.filter(transformEl => {\n        const el = transformEl.classList.contains('swiper-slide-transform') ? getSlide(transformEl) : transformEl;\n        return swiper.getSlideIndex(el) === activeIndex;\n      });\n    }\n    transitionEndTarget.forEach(el => {\n      elementTransitionEnd(el, () => {\n        if (eventTriggered) return;\n        if (!swiper || swiper.destroyed) return;\n        eventTriggered = true;\n        swiper.animating = false;\n        const evt = new window.CustomEvent('transitionend', {\n          bubbles: true,\n          cancelable: true\n        });\n        swiper.wrapperEl.dispatchEvent(evt);\n      });\n    });\n  }\n}\n\nexport { effectVirtualTransitionEnd as e };\n","import { e as effectInit } from '../shared/effect-init.mjs';\nimport { e as effectTarget } from '../shared/effect-target.mjs';\nimport { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';\nimport { g as getSlideTransformEl } from '../shared/utils.mjs';\n\nfunction EffectFade({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    fadeEffect: {\n      crossFade: false\n    }\n  });\n  const setTranslate = () => {\n    const {\n      slides\n    } = swiper;\n    const params = swiper.params.fadeEffect;\n    for (let i = 0; i < slides.length; i += 1) {\n      const slideEl = swiper.slides[i];\n      const offset = slideEl.swiperSlideOffset;\n      let tx = -offset;\n      if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n      let ty = 0;\n      if (!swiper.isHorizontal()) {\n        ty = tx;\n        tx = 0;\n      }\n      const slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(slideEl.progress), 0) : 1 + Math.min(Math.max(slideEl.progress, -1), 0);\n      const targetEl = effectTarget(params, slideEl);\n      targetEl.style.opacity = slideOpacity;\n      targetEl.style.transform = `translate3d(${tx}px, ${ty}px, 0px)`;\n    }\n  };\n  const setTransition = duration => {\n    const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));\n    transformElements.forEach(el => {\n      el.style.transitionDuration = `${duration}ms`;\n    });\n    effectVirtualTransitionEnd({\n      swiper,\n      duration,\n      transformElements,\n      allSlides: true\n    });\n  };\n  effectInit({\n    effect: 'fade',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      spaceBetween: 0,\n      virtualTranslate: !swiper.params.cssMode\n    })\n  });\n}\n\nexport { EffectFade as default };\n","import { e as effectInit } from '../shared/effect-init.mjs';\nimport { c as createElement, a as getRotateFix } from '../shared/utils.mjs';\n\nfunction EffectCube({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    cubeEffect: {\n      slideShadows: true,\n      shadow: true,\n      shadowOffset: 20,\n      shadowScale: 0.94\n    }\n  });\n  const createSlideShadows = (slideEl, progress, isHorizontal) => {\n    let shadowBefore = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');\n    let shadowAfter = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');\n    if (!shadowBefore) {\n      shadowBefore = createElement('div', `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'left' : 'top'}`.split(' '));\n      slideEl.append(shadowBefore);\n    }\n    if (!shadowAfter) {\n      shadowAfter = createElement('div', `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'right' : 'bottom'}`.split(' '));\n      slideEl.append(shadowAfter);\n    }\n    if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);\n    if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);\n  };\n  const recreateShadows = () => {\n    // create new ones\n    const isHorizontal = swiper.isHorizontal();\n    swiper.slides.forEach(slideEl => {\n      const progress = Math.max(Math.min(slideEl.progress, 1), -1);\n      createSlideShadows(slideEl, progress, isHorizontal);\n    });\n  };\n  const setTranslate = () => {\n    const {\n      el,\n      wrapperEl,\n      slides,\n      width: swiperWidth,\n      height: swiperHeight,\n      rtlTranslate: rtl,\n      size: swiperSize,\n      browser\n    } = swiper;\n    const r = getRotateFix(swiper);\n    const params = swiper.params.cubeEffect;\n    const isHorizontal = swiper.isHorizontal();\n    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n    let wrapperRotate = 0;\n    let cubeShadowEl;\n    if (params.shadow) {\n      if (isHorizontal) {\n        cubeShadowEl = swiper.wrapperEl.querySelector('.swiper-cube-shadow');\n        if (!cubeShadowEl) {\n          cubeShadowEl = createElement('div', 'swiper-cube-shadow');\n          swiper.wrapperEl.append(cubeShadowEl);\n        }\n        cubeShadowEl.style.height = `${swiperWidth}px`;\n      } else {\n        cubeShadowEl = el.querySelector('.swiper-cube-shadow');\n        if (!cubeShadowEl) {\n          cubeShadowEl = createElement('div', 'swiper-cube-shadow');\n          el.append(cubeShadowEl);\n        }\n      }\n    }\n    for (let i = 0; i < slides.length; i += 1) {\n      const slideEl = slides[i];\n      let slideIndex = i;\n      if (isVirtual) {\n        slideIndex = parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10);\n      }\n      let slideAngle = slideIndex * 90;\n      let round = Math.floor(slideAngle / 360);\n      if (rtl) {\n        slideAngle = -slideAngle;\n        round = Math.floor(-slideAngle / 360);\n      }\n      const progress = Math.max(Math.min(slideEl.progress, 1), -1);\n      let tx = 0;\n      let ty = 0;\n      let tz = 0;\n      if (slideIndex % 4 === 0) {\n        tx = -round * 4 * swiperSize;\n        tz = 0;\n      } else if ((slideIndex - 1) % 4 === 0) {\n        tx = 0;\n        tz = -round * 4 * swiperSize;\n      } else if ((slideIndex - 2) % 4 === 0) {\n        tx = swiperSize + round * 4 * swiperSize;\n        tz = swiperSize;\n      } else if ((slideIndex - 3) % 4 === 0) {\n        tx = -swiperSize;\n        tz = 3 * swiperSize + swiperSize * 4 * round;\n      }\n      if (rtl) {\n        tx = -tx;\n      }\n      if (!isHorizontal) {\n        ty = tx;\n        tx = 0;\n      }\n      const transform = `rotateX(${r(isHorizontal ? 0 : -slideAngle)}deg) rotateY(${r(isHorizontal ? slideAngle : 0)}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n      if (progress <= 1 && progress > -1) {\n        wrapperRotate = slideIndex * 90 + progress * 90;\n        if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n      }\n      slideEl.style.transform = transform;\n      if (params.slideShadows) {\n        createSlideShadows(slideEl, progress, isHorizontal);\n      }\n    }\n    wrapperEl.style.transformOrigin = `50% 50% -${swiperSize / 2}px`;\n    wrapperEl.style['-webkit-transform-origin'] = `50% 50% -${swiperSize / 2}px`;\n    if (params.shadow) {\n      if (isHorizontal) {\n        cubeShadowEl.style.transform = `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(89.99deg) rotateZ(0deg) scale(${params.shadowScale})`;\n      } else {\n        const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n        const multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);\n        const scale1 = params.shadowScale;\n        const scale2 = params.shadowScale / multiplier;\n        const offset = params.shadowOffset;\n        cubeShadowEl.style.transform = `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-89.99deg)`;\n      }\n    }\n    const zFactor = (browser.isSafari || browser.isWebView) && browser.needPerspectiveFix ? -swiperSize / 2 : 0;\n    wrapperEl.style.transform = `translate3d(0px,0,${zFactor}px) rotateX(${r(swiper.isHorizontal() ? 0 : wrapperRotate)}deg) rotateY(${r(swiper.isHorizontal() ? -wrapperRotate : 0)}deg)`;\n    wrapperEl.style.setProperty('--swiper-cube-translate-z', `${zFactor}px`);\n  };\n  const setTransition = duration => {\n    const {\n      el,\n      slides\n    } = swiper;\n    slides.forEach(slideEl => {\n      slideEl.style.transitionDuration = `${duration}ms`;\n      slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(subEl => {\n        subEl.style.transitionDuration = `${duration}ms`;\n      });\n    });\n    if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n      const shadowEl = el.querySelector('.swiper-cube-shadow');\n      if (shadowEl) shadowEl.style.transitionDuration = `${duration}ms`;\n    }\n  };\n  effectInit({\n    effect: 'cube',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    recreateShadows,\n    getEffectParams: () => swiper.params.cubeEffect,\n    perspective: () => true,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      resistanceRatio: 0,\n      spaceBetween: 0,\n      centeredSlides: false,\n      virtualTranslate: true\n    })\n  });\n}\n\nexport { EffectCube as default };\n","import { g as getSlideTransformEl, c as createElement } from './utils.mjs';\n\nfunction createShadow(suffix, slideEl, side) {\n  const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}${suffix ? ` swiper-slide-shadow-${suffix}` : ''}`;\n  const shadowContainer = getSlideTransformEl(slideEl);\n  let shadowEl = shadowContainer.querySelector(`.${shadowClass.split(' ').join('.')}`);\n  if (!shadowEl) {\n    shadowEl = createElement('div', shadowClass.split(' '));\n    shadowContainer.append(shadowEl);\n  }\n  return shadowEl;\n}\n\nexport { createShadow as c };\n","import { c as createShadow } from '../shared/create-shadow.mjs';\nimport { e as effectInit } from '../shared/effect-init.mjs';\nimport { e as effectTarget } from '../shared/effect-target.mjs';\nimport { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';\nimport { g as getSlideTransformEl, a as getRotateFix } from '../shared/utils.mjs';\n\nfunction EffectFlip({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    flipEffect: {\n      slideShadows: true,\n      limitRotation: true\n    }\n  });\n  const createSlideShadows = (slideEl, progress) => {\n    let shadowBefore = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');\n    let shadowAfter = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');\n    if (!shadowBefore) {\n      shadowBefore = createShadow('flip', slideEl, swiper.isHorizontal() ? 'left' : 'top');\n    }\n    if (!shadowAfter) {\n      shadowAfter = createShadow('flip', slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n    }\n    if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);\n    if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);\n  };\n  const recreateShadows = () => {\n    // Set shadows\n    swiper.params.flipEffect;\n    swiper.slides.forEach(slideEl => {\n      let progress = slideEl.progress;\n      if (swiper.params.flipEffect.limitRotation) {\n        progress = Math.max(Math.min(slideEl.progress, 1), -1);\n      }\n      createSlideShadows(slideEl, progress);\n    });\n  };\n  const setTranslate = () => {\n    const {\n      slides,\n      rtlTranslate: rtl\n    } = swiper;\n    const params = swiper.params.flipEffect;\n    const rotateFix = getRotateFix(swiper);\n    for (let i = 0; i < slides.length; i += 1) {\n      const slideEl = slides[i];\n      let progress = slideEl.progress;\n      if (swiper.params.flipEffect.limitRotation) {\n        progress = Math.max(Math.min(slideEl.progress, 1), -1);\n      }\n      const offset = slideEl.swiperSlideOffset;\n      const rotate = -180 * progress;\n      let rotateY = rotate;\n      let rotateX = 0;\n      let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n      let ty = 0;\n      if (!swiper.isHorizontal()) {\n        ty = tx;\n        tx = 0;\n        rotateX = -rotateY;\n        rotateY = 0;\n      } else if (rtl) {\n        rotateY = -rotateY;\n      }\n      slideEl.style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n      if (params.slideShadows) {\n        createSlideShadows(slideEl, progress);\n      }\n      const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateFix(rotateX)}deg) rotateY(${rotateFix(rotateY)}deg)`;\n      const targetEl = effectTarget(params, slideEl);\n      targetEl.style.transform = transform;\n    }\n  };\n  const setTransition = duration => {\n    const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));\n    transformElements.forEach(el => {\n      el.style.transitionDuration = `${duration}ms`;\n      el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {\n        shadowEl.style.transitionDuration = `${duration}ms`;\n      });\n    });\n    effectVirtualTransitionEnd({\n      swiper,\n      duration,\n      transformElements\n    });\n  };\n  effectInit({\n    effect: 'flip',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    recreateShadows,\n    getEffectParams: () => swiper.params.flipEffect,\n    perspective: () => true,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      spaceBetween: 0,\n      virtualTranslate: !swiper.params.cssMode\n    })\n  });\n}\n\nexport { EffectFlip as default };\n","import { c as createShadow } from '../shared/create-shadow.mjs';\nimport { e as effectInit } from '../shared/effect-init.mjs';\nimport { e as effectTarget } from '../shared/effect-target.mjs';\nimport { g as getSlideTransformEl, a as getRotateFix } from '../shared/utils.mjs';\n\nfunction EffectCoverflow({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    coverflowEffect: {\n      rotate: 50,\n      stretch: 0,\n      depth: 100,\n      scale: 1,\n      modifier: 1,\n      slideShadows: true\n    }\n  });\n  const setTranslate = () => {\n    const {\n      width: swiperWidth,\n      height: swiperHeight,\n      slides,\n      slidesSizesGrid\n    } = swiper;\n    const params = swiper.params.coverflowEffect;\n    const isHorizontal = swiper.isHorizontal();\n    const transform = swiper.translate;\n    const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n    const rotate = isHorizontal ? params.rotate : -params.rotate;\n    const translate = params.depth;\n    const r = getRotateFix(swiper);\n    // Each slide offset from center\n    for (let i = 0, length = slides.length; i < length; i += 1) {\n      const slideEl = slides[i];\n      const slideSize = slidesSizesGrid[i];\n      const slideOffset = slideEl.swiperSlideOffset;\n      const centerOffset = (center - slideOffset - slideSize / 2) / slideSize;\n      const offsetMultiplier = typeof params.modifier === 'function' ? params.modifier(centerOffset) : centerOffset * params.modifier;\n      let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n      let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n      // var rotateZ = 0\n      let translateZ = -translate * Math.abs(offsetMultiplier);\n      let stretch = params.stretch;\n      // Allow percentage to make a relative stretch for responsive sliders\n      if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n        stretch = parseFloat(params.stretch) / 100 * slideSize;\n      }\n      let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n      let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n      let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);\n\n      // Fix for ultra small values\n      if (Math.abs(translateX) < 0.001) translateX = 0;\n      if (Math.abs(translateY) < 0.001) translateY = 0;\n      if (Math.abs(translateZ) < 0.001) translateZ = 0;\n      if (Math.abs(rotateY) < 0.001) rotateY = 0;\n      if (Math.abs(rotateX) < 0.001) rotateX = 0;\n      if (Math.abs(scale) < 0.001) scale = 0;\n      const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px)  rotateX(${r(rotateX)}deg) rotateY(${r(rotateY)}deg) scale(${scale})`;\n      const targetEl = effectTarget(params, slideEl);\n      targetEl.style.transform = slideTransform;\n      slideEl.style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n      if (params.slideShadows) {\n        // Set shadows\n        let shadowBeforeEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');\n        let shadowAfterEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');\n        if (!shadowBeforeEl) {\n          shadowBeforeEl = createShadow('coverflow', slideEl, isHorizontal ? 'left' : 'top');\n        }\n        if (!shadowAfterEl) {\n          shadowAfterEl = createShadow('coverflow', slideEl, isHorizontal ? 'right' : 'bottom');\n        }\n        if (shadowBeforeEl) shadowBeforeEl.style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n        if (shadowAfterEl) shadowAfterEl.style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n      }\n    }\n  };\n  const setTransition = duration => {\n    const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));\n    transformElements.forEach(el => {\n      el.style.transitionDuration = `${duration}ms`;\n      el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {\n        shadowEl.style.transitionDuration = `${duration}ms`;\n      });\n    });\n  };\n  effectInit({\n    effect: 'coverflow',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => true,\n    overwriteParams: () => ({\n      watchSlidesProgress: true\n    })\n  });\n}\n\nexport { EffectCoverflow as default };\n","import { c as createShadow } from '../shared/create-shadow.mjs';\nimport { e as effectInit } from '../shared/effect-init.mjs';\nimport { e as effectTarget } from '../shared/effect-target.mjs';\nimport { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';\nimport { g as getSlideTransformEl, a as getRotateFix } from '../shared/utils.mjs';\n\nfunction EffectCreative({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    creativeEffect: {\n      limitProgress: 1,\n      shadowPerProgress: false,\n      progressMultiplier: 1,\n      perspective: true,\n      prev: {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        opacity: 1,\n        scale: 1\n      },\n      next: {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        opacity: 1,\n        scale: 1\n      }\n    }\n  });\n  const getTranslateValue = value => {\n    if (typeof value === 'string') return value;\n    return `${value}px`;\n  };\n  const setTranslate = () => {\n    const {\n      slides,\n      wrapperEl,\n      slidesSizesGrid\n    } = swiper;\n    const params = swiper.params.creativeEffect;\n    const {\n      progressMultiplier: multiplier\n    } = params;\n    const isCenteredSlides = swiper.params.centeredSlides;\n    const rotateFix = getRotateFix(swiper);\n    if (isCenteredSlides) {\n      const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;\n      wrapperEl.style.transform = `translateX(calc(50% - ${margin}px))`;\n    }\n    for (let i = 0; i < slides.length; i += 1) {\n      const slideEl = slides[i];\n      const slideProgress = slideEl.progress;\n      const progress = Math.min(Math.max(slideEl.progress, -params.limitProgress), params.limitProgress);\n      let originalProgress = progress;\n      if (!isCenteredSlides) {\n        originalProgress = Math.min(Math.max(slideEl.originalProgress, -params.limitProgress), params.limitProgress);\n      }\n      const offset = slideEl.swiperSlideOffset;\n      const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n      const r = [0, 0, 0];\n      let custom = false;\n      if (!swiper.isHorizontal()) {\n        t[1] = t[0];\n        t[0] = 0;\n      }\n      let data = {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        scale: 1,\n        opacity: 1\n      };\n      if (progress < 0) {\n        data = params.next;\n        custom = true;\n      } else if (progress > 0) {\n        data = params.prev;\n        custom = true;\n      }\n      // set translate\n      t.forEach((value, index) => {\n        t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(progress * multiplier)}))`;\n      });\n      // set rotates\n      r.forEach((value, index) => {\n        let val = data.rotate[index] * Math.abs(progress * multiplier);\n        r[index] = val;\n      });\n      slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n      const translateString = t.join(', ');\n      const rotateString = `rotateX(${rotateFix(r[0])}deg) rotateY(${rotateFix(r[1])}deg) rotateZ(${rotateFix(r[2])}deg)`;\n      const scaleString = originalProgress < 0 ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;\n      const opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier;\n      const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;\n\n      // Set shadows\n      if (custom && data.shadow || !custom) {\n        let shadowEl = slideEl.querySelector('.swiper-slide-shadow');\n        if (!shadowEl && data.shadow) {\n          shadowEl = createShadow('creative', slideEl);\n        }\n        if (shadowEl) {\n          const shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress;\n          shadowEl.style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n        }\n      }\n      const targetEl = effectTarget(params, slideEl);\n      targetEl.style.transform = transform;\n      targetEl.style.opacity = opacityString;\n      if (data.origin) {\n        targetEl.style.transformOrigin = data.origin;\n      }\n    }\n  };\n  const setTransition = duration => {\n    const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));\n    transformElements.forEach(el => {\n      el.style.transitionDuration = `${duration}ms`;\n      el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {\n        shadowEl.style.transitionDuration = `${duration}ms`;\n      });\n    });\n    effectVirtualTransitionEnd({\n      swiper,\n      duration,\n      transformElements,\n      allSlides: true\n    });\n  };\n  effectInit({\n    effect: 'creative',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => swiper.params.creativeEffect.perspective,\n    overwriteParams: () => ({\n      watchSlidesProgress: true,\n      virtualTranslate: !swiper.params.cssMode\n    })\n  });\n}\n\nexport { EffectCreative as default };\n","import { c as createShadow } from '../shared/create-shadow.mjs';\nimport { e as effectInit } from '../shared/effect-init.mjs';\nimport { e as effectTarget } from '../shared/effect-target.mjs';\nimport { e as effectVirtualTransitionEnd } from '../shared/effect-virtual-transition-end.mjs';\nimport { g as getSlideTransformEl } from '../shared/utils.mjs';\n\nfunction EffectCards({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    cardsEffect: {\n      slideShadows: true,\n      rotate: true,\n      perSlideRotate: 2,\n      perSlideOffset: 8\n    }\n  });\n  const setTranslate = () => {\n    const {\n      slides,\n      activeIndex,\n      rtlTranslate: rtl\n    } = swiper;\n    const params = swiper.params.cardsEffect;\n    const {\n      startTranslate,\n      isTouched\n    } = swiper.touchEventsData;\n    const currentTranslate = rtl ? -swiper.translate : swiper.translate;\n    for (let i = 0; i < slides.length; i += 1) {\n      const slideEl = slides[i];\n      const slideProgress = slideEl.progress;\n      const progress = Math.min(Math.max(slideProgress, -4), 4);\n      let offset = slideEl.swiperSlideOffset;\n      if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n        swiper.wrapperEl.style.transform = `translateX(${swiper.minTranslate()}px)`;\n      }\n      if (swiper.params.centeredSlides && swiper.params.cssMode) {\n        offset -= slides[0].swiperSlideOffset;\n      }\n      let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n      let tY = 0;\n      const tZ = -100 * Math.abs(progress);\n      let scale = 1;\n      let rotate = -params.perSlideRotate * progress;\n      let tXAdd = params.perSlideOffset - Math.abs(progress) * 0.75;\n      const slideIndex = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.from + i : i;\n      const isSwipeToNext = (slideIndex === activeIndex || slideIndex === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate;\n      const isSwipeToPrev = (slideIndex === activeIndex || slideIndex === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate;\n      if (isSwipeToNext || isSwipeToPrev) {\n        const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n        rotate += -28 * progress * subProgress;\n        scale += -0.5 * subProgress;\n        tXAdd += 96 * subProgress;\n        tY = `${(params.rotate || swiper.isHorizontal() ? -25 : 0) * subProgress * Math.abs(progress)}%`;\n      }\n      if (progress < 0) {\n        // next\n        tX = `calc(${tX}px ${rtl ? '-' : '+'} (${tXAdd * Math.abs(progress)}%))`;\n      } else if (progress > 0) {\n        // prev\n        tX = `calc(${tX}px ${rtl ? '-' : '+'} (-${tXAdd * Math.abs(progress)}%))`;\n      } else {\n        tX = `${tX}px`;\n      }\n      if (!swiper.isHorizontal()) {\n        const prevY = tY;\n        tY = tX;\n        tX = prevY;\n      }\n      const scaleString = progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n\n      /* eslint-disable */\n      const transform = `\n        translate3d(${tX}, ${tY}, ${tZ}px)\n        rotateZ(${params.rotate ? rtl ? -rotate : rotate : 0}deg)\n        scale(${scaleString})\n      `;\n      /* eslint-enable */\n\n      if (params.slideShadows) {\n        // Set shadows\n        let shadowEl = slideEl.querySelector('.swiper-slide-shadow');\n        if (!shadowEl) {\n          shadowEl = createShadow('cards', slideEl);\n        }\n        if (shadowEl) shadowEl.style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n      }\n      slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n      const targetEl = effectTarget(params, slideEl);\n      targetEl.style.transform = transform;\n    }\n  };\n  const setTransition = duration => {\n    const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));\n    transformElements.forEach(el => {\n      el.style.transitionDuration = `${duration}ms`;\n      el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {\n        shadowEl.style.transitionDuration = `${duration}ms`;\n      });\n    });\n    effectVirtualTransitionEnd({\n      swiper,\n      duration,\n      transformElements\n    });\n  };\n  effectInit({\n    effect: 'cards',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => true,\n    overwriteParams: () => ({\n      _loopSwapReset: false,\n      watchSlidesProgress: true,\n      loopAdditionalSlides: swiper.params.cardsEffect.rotate ? 3 : 2,\n      centeredSlides: true,\n      virtualTranslate: !swiper.params.cssMode\n    })\n  });\n}\n\nexport { EffectCards as default };\n","/**\n * SSR Window 5.0.1\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2025, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: June 27, 2025\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n  return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;\n}\nfunction extend(target = {}, src = {}) {\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n  Object.keys(src).filter(key => noExtend.indexOf(key) < 0).forEach(key => {\n    if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {\n      extend(target[key], src[key]);\n    }\n  });\n}\nconst ssrDocument = {\n  body: {},\n  addEventListener() {},\n  removeEventListener() {},\n  activeElement: {\n    blur() {},\n    nodeName: ''\n  },\n  querySelector() {\n    return null;\n  },\n  querySelectorAll() {\n    return [];\n  },\n  getElementById() {\n    return null;\n  },\n  createEvent() {\n    return {\n      initEvent() {}\n    };\n  },\n  createElement() {\n    return {\n      children: [],\n      childNodes: [],\n      style: {},\n      setAttribute() {},\n      getElementsByTagName() {\n        return [];\n      }\n    };\n  },\n  createElementNS() {\n    return {};\n  },\n  importNode() {\n    return null;\n  },\n  location: {\n    hash: '',\n    host: '',\n    hostname: '',\n    href: '',\n    origin: '',\n    pathname: '',\n    protocol: '',\n    search: ''\n  }\n};\nfunction getDocument() {\n  const doc = typeof document !== 'undefined' ? document : {};\n  extend(doc, ssrDocument);\n  return doc;\n}\nconst ssrWindow = {\n  document: ssrDocument,\n  navigator: {\n    userAgent: ''\n  },\n  location: {\n    hash: '',\n    host: '',\n    hostname: '',\n    href: '',\n    origin: '',\n    pathname: '',\n    protocol: '',\n    search: ''\n  },\n  history: {\n    replaceState() {},\n    pushState() {},\n    go() {},\n    back() {}\n  },\n  CustomEvent: function CustomEvent() {\n    return this;\n  },\n  addEventListener() {},\n  removeEventListener() {},\n  getComputedStyle() {\n    return {\n      getPropertyValue() {\n        return '';\n      }\n    };\n  },\n  Image() {},\n  Date() {},\n  screen: {},\n  setTimeout() {},\n  clearTimeout() {},\n  matchMedia() {\n    return {};\n  },\n  requestAnimationFrame(callback) {\n    if (typeof setTimeout === 'undefined') {\n      callback();\n      return null;\n    }\n    return setTimeout(callback, 0);\n  },\n  cancelAnimationFrame(id) {\n    if (typeof setTimeout === 'undefined') {\n      return;\n    }\n    clearTimeout(id);\n  }\n};\nfunction getWindow() {\n  const win = typeof window !== 'undefined' ? window : {};\n  extend(win, ssrWindow);\n  return win;\n}\n\nexport { getWindow as a, getDocument as g };\n","import { a as getWindow, g as getDocument } from './ssr-window.esm.mjs';\n\nfunction classesToTokens(classes = '') {\n  return classes.trim().split(' ').filter(c => !!c.trim());\n}\n\nfunction deleteProps(obj) {\n  const object = obj;\n  Object.keys(object).forEach(key => {\n    try {\n      object[key] = null;\n    } catch (e) {\n      // no getter for object\n    }\n    try {\n      delete object[key];\n    } catch (e) {\n      // something got wrong\n    }\n  });\n}\nfunction nextTick(callback, delay = 0) {\n  return setTimeout(callback, delay);\n}\nfunction now() {\n  return Date.now();\n}\nfunction getComputedStyle(el) {\n  const window = getWindow();\n  let style;\n  if (window.getComputedStyle) {\n    style = window.getComputedStyle(el, null);\n  }\n  if (!style && el.currentStyle) {\n    style = el.currentStyle;\n  }\n  if (!style) {\n    style = el.style;\n  }\n  return style;\n}\nfunction getTranslate(el, axis = 'x') {\n  const window = getWindow();\n  let matrix;\n  let curTransform;\n  let transformMatrix;\n  const curStyle = getComputedStyle(el);\n  if (window.WebKitCSSMatrix) {\n    curTransform = curStyle.transform || curStyle.webkitTransform;\n    if (curTransform.split(',').length > 6) {\n      curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');\n    }\n    // Some old versions of Webkit choke when 'none' is passed; pass\n    // empty string instead in this case\n    transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n  } else {\n    transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n    matrix = transformMatrix.toString().split(',');\n  }\n  if (axis === 'x') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;\n    // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);\n    // Normal Browsers\n    else curTransform = parseFloat(matrix[4]);\n  }\n  if (axis === 'y') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;\n    // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);\n    // Normal Browsers\n    else curTransform = parseFloat(matrix[5]);\n  }\n  return curTransform || 0;\n}\nfunction isObject(o) {\n  return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';\n}\nfunction isNode(node) {\n  // eslint-disable-next-line\n  if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n    return node instanceof HTMLElement;\n  }\n  return node && (node.nodeType === 1 || node.nodeType === 11);\n}\nfunction extend(...args) {\n  const to = Object(args[0]);\n  for (let i = 1; i < args.length; i += 1) {\n    const nextSource = args[i];\n    if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n      const keysArray = Object.keys(Object(nextSource)).filter(key => key !== '__proto__' && key !== 'constructor' && key !== 'prototype');\n      for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n        const nextKey = keysArray[nextIndex];\n        const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n        if (desc !== undefined && desc.enumerable) {\n          if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            to[nextKey] = {};\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else {\n            to[nextKey] = nextSource[nextKey];\n          }\n        }\n      }\n    }\n  }\n  return to;\n}\nfunction setCSSProperty(el, varName, varValue) {\n  el.style.setProperty(varName, varValue);\n}\nfunction animateCSSModeScroll({\n  swiper,\n  targetPosition,\n  side\n}) {\n  const window = getWindow();\n  const startPosition = -swiper.translate;\n  let startTime = null;\n  let time;\n  const duration = swiper.params.speed;\n  swiper.wrapperEl.style.scrollSnapType = 'none';\n  window.cancelAnimationFrame(swiper.cssModeFrameID);\n  const dir = targetPosition > startPosition ? 'next' : 'prev';\n  const isOutOfBound = (current, target) => {\n    return dir === 'next' && current >= target || dir === 'prev' && current <= target;\n  };\n  const animate = () => {\n    time = new Date().getTime();\n    if (startTime === null) {\n      startTime = time;\n    }\n    const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n    const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n    let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      currentPosition = targetPosition;\n    }\n    swiper.wrapperEl.scrollTo({\n      [side]: currentPosition\n    });\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.scrollSnapType = '';\n      setTimeout(() => {\n        swiper.wrapperEl.style.overflow = '';\n        swiper.wrapperEl.scrollTo({\n          [side]: currentPosition\n        });\n      });\n      window.cancelAnimationFrame(swiper.cssModeFrameID);\n      return;\n    }\n    swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n  };\n  animate();\n}\nfunction getSlideTransformEl(slideEl) {\n  return slideEl.querySelector('.swiper-slide-transform') || slideEl.shadowRoot && slideEl.shadowRoot.querySelector('.swiper-slide-transform') || slideEl;\n}\nfunction elementChildren(element, selector = '') {\n  const window = getWindow();\n  const children = [...element.children];\n  if (window.HTMLSlotElement && element instanceof HTMLSlotElement) {\n    children.push(...element.assignedElements());\n  }\n  if (!selector) {\n    return children;\n  }\n  return children.filter(el => el.matches(selector));\n}\nfunction elementIsChildOfSlot(el, slot) {\n  // Breadth-first search through all parent's children and assigned elements\n  const elementsQueue = [slot];\n  while (elementsQueue.length > 0) {\n    const elementToCheck = elementsQueue.shift();\n    if (el === elementToCheck) {\n      return true;\n    }\n    elementsQueue.push(...elementToCheck.children, ...(elementToCheck.shadowRoot ? elementToCheck.shadowRoot.children : []), ...(elementToCheck.assignedElements ? elementToCheck.assignedElements() : []));\n  }\n}\nfunction elementIsChildOf(el, parent) {\n  const window = getWindow();\n  let isChild = parent.contains(el);\n  if (!isChild && window.HTMLSlotElement && parent instanceof HTMLSlotElement) {\n    const children = [...parent.assignedElements()];\n    isChild = children.includes(el);\n    if (!isChild) {\n      isChild = elementIsChildOfSlot(el, parent);\n    }\n  }\n  return isChild;\n}\nfunction showWarning(text) {\n  try {\n    console.warn(text);\n    return;\n  } catch (err) {\n    // err\n  }\n}\nfunction createElement(tag, classes = []) {\n  const el = document.createElement(tag);\n  el.classList.add(...(Array.isArray(classes) ? classes : classesToTokens(classes)));\n  return el;\n}\nfunction elementOffset(el) {\n  const window = getWindow();\n  const document = getDocument();\n  const box = el.getBoundingClientRect();\n  const body = document.body;\n  const clientTop = el.clientTop || body.clientTop || 0;\n  const clientLeft = el.clientLeft || body.clientLeft || 0;\n  const scrollTop = el === window ? window.scrollY : el.scrollTop;\n  const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n  return {\n    top: box.top + scrollTop - clientTop,\n    left: box.left + scrollLeft - clientLeft\n  };\n}\nfunction elementPrevAll(el, selector) {\n  const prevEls = [];\n  while (el.previousElementSibling) {\n    const prev = el.previousElementSibling; // eslint-disable-line\n    if (selector) {\n      if (prev.matches(selector)) prevEls.push(prev);\n    } else prevEls.push(prev);\n    el = prev;\n  }\n  return prevEls;\n}\nfunction elementNextAll(el, selector) {\n  const nextEls = [];\n  while (el.nextElementSibling) {\n    const next = el.nextElementSibling; // eslint-disable-line\n    if (selector) {\n      if (next.matches(selector)) nextEls.push(next);\n    } else nextEls.push(next);\n    el = next;\n  }\n  return nextEls;\n}\nfunction elementStyle(el, prop) {\n  const window = getWindow();\n  return window.getComputedStyle(el, null).getPropertyValue(prop);\n}\nfunction elementIndex(el) {\n  let child = el;\n  let i;\n  if (child) {\n    i = 0;\n    // eslint-disable-next-line\n    while ((child = child.previousSibling) !== null) {\n      if (child.nodeType === 1) i += 1;\n    }\n    return i;\n  }\n  return undefined;\n}\nfunction elementParents(el, selector) {\n  const parents = []; // eslint-disable-line\n  let parent = el.parentElement; // eslint-disable-line\n  while (parent) {\n    if (selector) {\n      if (parent.matches(selector)) parents.push(parent);\n    } else {\n      parents.push(parent);\n    }\n    parent = parent.parentElement;\n  }\n  return parents;\n}\nfunction elementTransitionEnd(el, callback) {\n  function fireCallBack(e) {\n    if (e.target !== el) return;\n    callback.call(el, e);\n    el.removeEventListener('transitionend', fireCallBack);\n  }\n  if (callback) {\n    el.addEventListener('transitionend', fireCallBack);\n  }\n}\nfunction elementOuterSize(el, size, includeMargins) {\n  const window = getWindow();\n  if (includeMargins) {\n    return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'));\n  }\n  return el.offsetWidth;\n}\nfunction makeElementsArray(el) {\n  return (Array.isArray(el) ? el : [el]).filter(e => !!e);\n}\nfunction getRotateFix(swiper) {\n  return v => {\n    if (Math.abs(v) > 0 && swiper.browser && swiper.browser.need3dFix && Math.abs(v) % 90 === 0) {\n      return v + 0.001;\n    }\n    return v;\n  };\n}\nfunction setInnerHTML(el, html = '') {\n  if (typeof trustedTypes !== 'undefined') {\n    el.innerHTML = trustedTypes.createPolicy('html', {\n      createHTML: s => s\n    }).createHTML(html);\n  } else {\n    el.innerHTML = html;\n  }\n}\n\nexport { getRotateFix as a, setCSSProperty as b, createElement as c, elementParents as d, elementChildren as e, elementOffset as f, getSlideTransformEl as g, now as h, elementOuterSize as i, elementIndex as j, classesToTokens as k, getTranslate as l, makeElementsArray as m, nextTick as n, elementTransitionEnd as o, isObject as p, elementStyle as q, elementNextAll as r, setInnerHTML as s, elementPrevAll as t, animateCSSModeScroll as u, showWarning as v, elementIsChildOf as w, extend as x, deleteProps as y };\n","import { a as getWindow, g as getDocument } from './ssr-window.esm.mjs';\nimport { d as elementParents, q as elementStyle, e as elementChildren, b as setCSSProperty, i as elementOuterSize, r as elementNextAll, t as elementPrevAll, l as getTranslate, u as animateCSSModeScroll, n as nextTick, v as showWarning, c as createElement, w as elementIsChildOf, h as now, x as extend, j as elementIndex, y as deleteProps } from './utils.mjs';\n\nlet support;\nfunction calcSupport() {\n  const window = getWindow();\n  const document = getDocument();\n  return {\n    smoothScroll: document.documentElement && document.documentElement.style && 'scrollBehavior' in document.documentElement.style,\n    touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch)\n  };\n}\nfunction getSupport() {\n  if (!support) {\n    support = calcSupport();\n  }\n  return support;\n}\n\nlet deviceCached;\nfunction calcDevice({\n  userAgent\n} = {}) {\n  const support = getSupport();\n  const window = getWindow();\n  const platform = window.navigator.platform;\n  const ua = userAgent || window.navigator.userAgent;\n  const device = {\n    ios: false,\n    android: false\n  };\n  const screenWidth = window.screen.width;\n  const screenHeight = window.screen.height;\n  const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n  let ipad = ua.match(/(iPad)(?!\\1).*OS\\s([\\d_]+)/);\n  const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n  const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n  const windows = platform === 'Win32';\n  let macos = platform === 'MacIntel';\n\n  // iPadOs 13 fix\n  const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];\n  if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {\n    ipad = ua.match(/(Version)\\/([\\d.]+)/);\n    if (!ipad) ipad = [0, 1, '13_0_0'];\n    macos = false;\n  }\n\n  // Android\n  if (android && !windows) {\n    device.os = 'android';\n    device.android = true;\n  }\n  if (ipad || iphone || ipod) {\n    device.os = 'ios';\n    device.ios = true;\n  }\n\n  // Export object\n  return device;\n}\nfunction getDevice(overrides = {}) {\n  if (!deviceCached) {\n    deviceCached = calcDevice(overrides);\n  }\n  return deviceCached;\n}\n\nlet browser;\nfunction calcBrowser() {\n  const window = getWindow();\n  const device = getDevice();\n  let needPerspectiveFix = false;\n  function isSafari() {\n    const ua = window.navigator.userAgent.toLowerCase();\n    return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n  }\n  if (isSafari()) {\n    const ua = String(window.navigator.userAgent);\n    if (ua.includes('Version/')) {\n      const [major, minor] = ua.split('Version/')[1].split(' ')[0].split('.').map(num => Number(num));\n      needPerspectiveFix = major < 16 || major === 16 && minor < 2;\n    }\n  }\n  const isWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent);\n  const isSafariBrowser = isSafari();\n  const need3dFix = isSafariBrowser || isWebView && device.ios;\n  return {\n    isSafari: needPerspectiveFix || isSafariBrowser,\n    needPerspectiveFix,\n    need3dFix,\n    isWebView\n  };\n}\nfunction getBrowser() {\n  if (!browser) {\n    browser = calcBrowser();\n  }\n  return browser;\n}\n\nfunction Resize({\n  swiper,\n  on,\n  emit\n}) {\n  const window = getWindow();\n  let observer = null;\n  let animationFrame = null;\n  const resizeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('beforeResize');\n    emit('resize');\n  };\n  const createObserver = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    observer = new ResizeObserver(entries => {\n      animationFrame = window.requestAnimationFrame(() => {\n        const {\n          width,\n          height\n        } = swiper;\n        let newWidth = width;\n        let newHeight = height;\n        entries.forEach(({\n          contentBoxSize,\n          contentRect,\n          target\n        }) => {\n          if (target && target !== swiper.el) return;\n          newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;\n          newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;\n        });\n        if (newWidth !== width || newHeight !== height) {\n          resizeHandler();\n        }\n      });\n    });\n    observer.observe(swiper.el);\n  };\n  const removeObserver = () => {\n    if (animationFrame) {\n      window.cancelAnimationFrame(animationFrame);\n    }\n    if (observer && observer.unobserve && swiper.el) {\n      observer.unobserve(swiper.el);\n      observer = null;\n    }\n  };\n  const orientationChangeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('orientationchange');\n  };\n  on('init', () => {\n    if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n      createObserver();\n      return;\n    }\n    window.addEventListener('resize', resizeHandler);\n    window.addEventListener('orientationchange', orientationChangeHandler);\n  });\n  on('destroy', () => {\n    removeObserver();\n    window.removeEventListener('resize', resizeHandler);\n    window.removeEventListener('orientationchange', orientationChangeHandler);\n  });\n}\n\nfunction Observer({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const observers = [];\n  const window = getWindow();\n  const attach = (target, options = {}) => {\n    const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n    const observer = new ObserverFunc(mutations => {\n      // The observerUpdate event should only be triggered\n      // once despite the number of mutations.  Additional\n      // triggers are redundant and are very costly\n      if (swiper.__preventObserver__) return;\n      if (mutations.length === 1) {\n        emit('observerUpdate', mutations[0]);\n        return;\n      }\n      const observerUpdate = function observerUpdate() {\n        emit('observerUpdate', mutations[0]);\n      };\n      if (window.requestAnimationFrame) {\n        window.requestAnimationFrame(observerUpdate);\n      } else {\n        window.setTimeout(observerUpdate, 0);\n      }\n    });\n    observer.observe(target, {\n      attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n      childList: swiper.isElement || (typeof options.childList === 'undefined' ? true : options).childList,\n      characterData: typeof options.characterData === 'undefined' ? true : options.characterData\n    });\n    observers.push(observer);\n  };\n  const init = () => {\n    if (!swiper.params.observer) return;\n    if (swiper.params.observeParents) {\n      const containerParents = elementParents(swiper.hostEl);\n      for (let i = 0; i < containerParents.length; i += 1) {\n        attach(containerParents[i]);\n      }\n    }\n    // Observe container\n    attach(swiper.hostEl, {\n      childList: swiper.params.observeSlideChildren\n    });\n\n    // Observe wrapper\n    attach(swiper.wrapperEl, {\n      attributes: false\n    });\n  };\n  const destroy = () => {\n    observers.forEach(observer => {\n      observer.disconnect();\n    });\n    observers.splice(0, observers.length);\n  };\n  extendParams({\n    observer: false,\n    observeParents: false,\n    observeSlideChildren: false\n  });\n  on('init', init);\n  on('destroy', destroy);\n}\n\n/* eslint-disable no-underscore-dangle */\n\nvar eventsEmitter = {\n  on(events, handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n    events.split(' ').forEach(event => {\n      if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n      self.eventsListeners[event][method](handler);\n    });\n    return self;\n  },\n  once(events, handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    function onceHandler(...args) {\n      self.off(events, onceHandler);\n      if (onceHandler.__emitterProxy) {\n        delete onceHandler.__emitterProxy;\n      }\n      handler.apply(self, args);\n    }\n    onceHandler.__emitterProxy = handler;\n    return self.on(events, onceHandler, priority);\n  },\n  onAny(handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n    if (self.eventsAnyListeners.indexOf(handler) < 0) {\n      self.eventsAnyListeners[method](handler);\n    }\n    return self;\n  },\n  offAny(handler) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsAnyListeners) return self;\n    const index = self.eventsAnyListeners.indexOf(handler);\n    if (index >= 0) {\n      self.eventsAnyListeners.splice(index, 1);\n    }\n    return self;\n  },\n  off(events, handler) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsListeners) return self;\n    events.split(' ').forEach(event => {\n      if (typeof handler === 'undefined') {\n        self.eventsListeners[event] = [];\n      } else if (self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach((eventHandler, index) => {\n          if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {\n            self.eventsListeners[event].splice(index, 1);\n          }\n        });\n      }\n    });\n    return self;\n  },\n  emit(...args) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsListeners) return self;\n    let events;\n    let data;\n    let context;\n    if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n      events = args[0];\n      data = args.slice(1, args.length);\n      context = self;\n    } else {\n      events = args[0].events;\n      data = args[0].data;\n      context = args[0].context || self;\n    }\n    data.unshift(context);\n    const eventsArray = Array.isArray(events) ? events : events.split(' ');\n    eventsArray.forEach(event => {\n      if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n        self.eventsAnyListeners.forEach(eventHandler => {\n          eventHandler.apply(context, [event, ...data]);\n        });\n      }\n      if (self.eventsListeners && self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach(eventHandler => {\n          eventHandler.apply(context, data);\n        });\n      }\n    });\n    return self;\n  }\n};\n\nfunction updateSize() {\n  const swiper = this;\n  let width;\n  let height;\n  const el = swiper.el;\n  if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n    width = swiper.params.width;\n  } else {\n    width = el.clientWidth;\n  }\n  if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n    height = swiper.params.height;\n  } else {\n    height = el.clientHeight;\n  }\n  if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {\n    return;\n  }\n\n  // Subtract paddings\n  width = width - parseInt(elementStyle(el, 'padding-left') || 0, 10) - parseInt(elementStyle(el, 'padding-right') || 0, 10);\n  height = height - parseInt(elementStyle(el, 'padding-top') || 0, 10) - parseInt(elementStyle(el, 'padding-bottom') || 0, 10);\n  if (Number.isNaN(width)) width = 0;\n  if (Number.isNaN(height)) height = 0;\n  Object.assign(swiper, {\n    width,\n    height,\n    size: swiper.isHorizontal() ? width : height\n  });\n}\n\nfunction updateSlides() {\n  const swiper = this;\n  function getDirectionPropertyValue(node, label) {\n    return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0);\n  }\n  const params = swiper.params;\n  const {\n    wrapperEl,\n    slidesEl,\n    rtlTranslate: rtl,\n    wrongRTL\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n  const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);\n  const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n  let snapGrid = [];\n  const slidesGrid = [];\n  const slidesSizesGrid = [];\n  let offsetBefore = params.slidesOffsetBefore;\n  if (typeof offsetBefore === 'function') {\n    offsetBefore = params.slidesOffsetBefore.call(swiper);\n  }\n  let offsetAfter = params.slidesOffsetAfter;\n  if (typeof offsetAfter === 'function') {\n    offsetAfter = params.slidesOffsetAfter.call(swiper);\n  }\n  const previousSnapGridLength = swiper.snapGrid.length;\n  const previousSlidesGridLength = swiper.slidesGrid.length;\n  const swiperSize = swiper.size - offsetBefore - offsetAfter;\n  let spaceBetween = params.spaceBetween;\n  let slidePosition = -offsetBefore;\n  let prevSlideSize = 0;\n  let index = 0;\n  if (typeof swiperSize === 'undefined') {\n    return;\n  }\n  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n    spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;\n  } else if (typeof spaceBetween === 'string') {\n    spaceBetween = parseFloat(spaceBetween);\n  }\n  swiper.virtualSize = -spaceBetween - offsetBefore - offsetAfter;\n\n  // reset margins\n  slides.forEach(slideEl => {\n    if (rtl) {\n      slideEl.style.marginLeft = '';\n    } else {\n      slideEl.style.marginRight = '';\n    }\n    slideEl.style.marginBottom = '';\n    slideEl.style.marginTop = '';\n  });\n\n  // reset cssMode offsets\n  if (params.centeredSlides && params.cssMode) {\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-before', '');\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-after', '');\n  }\n\n  // set cssMode offsets\n  if (params.cssMode) {\n    setCSSProperty(wrapperEl, '--swiper-slides-offset-before', `${offsetBefore}px`);\n    setCSSProperty(wrapperEl, '--swiper-slides-offset-after', `${offsetAfter}px`);\n  }\n  const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n  if (gridEnabled) {\n    swiper.grid.initSlides(slides);\n  } else if (swiper.grid) {\n    swiper.grid.unsetSlides();\n  }\n\n  // Calc slides\n  let slideSize;\n  const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {\n    return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n  }).length > 0;\n  for (let i = 0; i < slidesLength; i += 1) {\n    slideSize = 0;\n    const slide = slides[i];\n    if (slide) {\n      if (gridEnabled) {\n        swiper.grid.updateSlide(i, slide, slides);\n      }\n      if (elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line\n    }\n\n    if (isVirtual && params.slidesPerView === 'auto') {\n      if (params.virtual.slidesPerViewAutoSlideSize) {\n        slideSize = params.virtual.slidesPerViewAutoSlideSize;\n      }\n      if (slideSize && slide) {\n        if (params.roundLengths) slideSize = Math.floor(slideSize);\n        slide.style[swiper.getDirectionLabel('width')] = `${slideSize}px`;\n      }\n    } else if (params.slidesPerView === 'auto') {\n      if (shouldResetSlideSize) {\n        slide.style[swiper.getDirectionLabel('width')] = ``;\n      }\n      const slideStyles = getComputedStyle(slide);\n      const currentTransform = slide.style.transform;\n      const currentWebKitTransform = slide.style.webkitTransform;\n      if (currentTransform) {\n        slide.style.transform = 'none';\n      }\n      if (currentWebKitTransform) {\n        slide.style.webkitTransform = 'none';\n      }\n      if (params.roundLengths) {\n        slideSize = swiper.isHorizontal() ? elementOuterSize(slide, 'width', true) : elementOuterSize(slide, 'height', true);\n      } else {\n        // eslint-disable-next-line\n        const width = getDirectionPropertyValue(slideStyles, 'width');\n        const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n        const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n        const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n        const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n        const boxSizing = slideStyles.getPropertyValue('box-sizing');\n        if (boxSizing && boxSizing === 'border-box') {\n          slideSize = width + marginLeft + marginRight;\n        } else {\n          const {\n            clientWidth,\n            offsetWidth\n          } = slide;\n          slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);\n        }\n      }\n      if (currentTransform) {\n        slide.style.transform = currentTransform;\n      }\n      if (currentWebKitTransform) {\n        slide.style.webkitTransform = currentWebKitTransform;\n      }\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n    } else {\n      slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n      if (slide) {\n        slide.style[swiper.getDirectionLabel('width')] = `${slideSize}px`;\n      }\n    }\n    if (slide) {\n      slide.swiperSlideSize = slideSize;\n    }\n    slidesSizesGrid.push(slideSize);\n    if (params.centeredSlides) {\n      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n      if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n    } else {\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n      slidePosition = slidePosition + slideSize + spaceBetween;\n    }\n    swiper.virtualSize += slideSize + spaceBetween;\n    prevSlideSize = slideSize;\n    index += 1;\n  }\n  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n  if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n    wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;\n  }\n  if (params.setWrapperSize) {\n    wrapperEl.style[swiper.getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;\n  }\n  if (gridEnabled) {\n    swiper.grid.updateWrapperSize(slideSize, snapGrid);\n  }\n\n  // Remove last grid elements depending on width\n  if (!params.centeredSlides) {\n    // Check if snapToSlideEdge should be applied\n    const isFractionalSlidesPerView = params.slidesPerView !== 'auto' && params.slidesPerView % 1 !== 0;\n    const shouldSnapToSlideEdge = params.snapToSlideEdge && !params.loop && (params.slidesPerView === 'auto' || isFractionalSlidesPerView);\n\n    // Calculate the last allowed snap index when snapToSlideEdge is enabled\n    // This ensures minimum slides are visible at the end\n    let lastAllowedSnapIndex = snapGrid.length;\n    if (shouldSnapToSlideEdge) {\n      let minVisibleSlides;\n      if (params.slidesPerView === 'auto') {\n        // For 'auto' mode, calculate how many slides fit based on actual sizes\n        minVisibleSlides = 1;\n        let accumulatedSize = 0;\n        for (let i = slidesSizesGrid.length - 1; i >= 0; i -= 1) {\n          accumulatedSize += slidesSizesGrid[i] + (i < slidesSizesGrid.length - 1 ? spaceBetween : 0);\n          if (accumulatedSize <= swiperSize) {\n            minVisibleSlides = slidesSizesGrid.length - i;\n          } else {\n            break;\n          }\n        }\n      } else {\n        minVisibleSlides = Math.floor(params.slidesPerView);\n      }\n      lastAllowedSnapIndex = Math.max(slidesLength - minVisibleSlides, 0);\n    }\n    const newSlidesGrid = [];\n    for (let i = 0; i < snapGrid.length; i += 1) {\n      let slidesGridItem = snapGrid[i];\n      if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n      if (shouldSnapToSlideEdge) {\n        // When snapToSlideEdge is enabled, only keep snaps up to lastAllowedSnapIndex\n        if (i <= lastAllowedSnapIndex) {\n          newSlidesGrid.push(slidesGridItem);\n        }\n      } else if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n        // When snapToSlideEdge is disabled, keep snaps that fit within scrollable area\n        newSlidesGrid.push(slidesGridItem);\n      }\n    }\n    snapGrid = newSlidesGrid;\n    if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {\n      // Only add edge-aligned snap if snapToSlideEdge is not enabled\n      if (!shouldSnapToSlideEdge) {\n        snapGrid.push(swiper.virtualSize - swiperSize);\n      }\n    }\n  }\n  if (isVirtual && params.loop) {\n    const size = slidesSizesGrid[0] + spaceBetween;\n    if (params.slidesPerGroup > 1) {\n      const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);\n      const groupSize = size * params.slidesPerGroup;\n      for (let i = 0; i < groups; i += 1) {\n        snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);\n      }\n    }\n    for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {\n      if (params.slidesPerGroup === 1) {\n        snapGrid.push(snapGrid[snapGrid.length - 1] + size);\n      }\n      slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);\n      swiper.virtualSize += size;\n    }\n  }\n  if (snapGrid.length === 0) snapGrid = [0];\n  if (spaceBetween !== 0) {\n    const key = swiper.isHorizontal() && rtl ? 'marginLeft' : swiper.getDirectionLabel('marginRight');\n    slides.filter((_, slideIndex) => {\n      if (!params.cssMode || params.loop) return true;\n      if (slideIndex === slides.length - 1) {\n        return false;\n      }\n      return true;\n    }).forEach(slideEl => {\n      slideEl.style[key] = `${spaceBetween}px`;\n    });\n  }\n  if (params.centeredSlides && params.centeredSlidesBounds) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (spaceBetween || 0);\n    });\n    allSlidesSize -= spaceBetween;\n    const maxSnap = allSlidesSize > swiperSize ? allSlidesSize - swiperSize : 0;\n    snapGrid = snapGrid.map(snap => {\n      if (snap <= 0) return -offsetBefore;\n      if (snap > maxSnap) return maxSnap + offsetAfter;\n      return snap;\n    });\n  }\n  if (params.centerInsufficientSlides) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (spaceBetween || 0);\n    });\n    allSlidesSize -= spaceBetween;\n    if (allSlidesSize < swiperSize) {\n      const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n      snapGrid.forEach((snap, snapIndex) => {\n        snapGrid[snapIndex] = snap - allSlidesOffset;\n      });\n      slidesGrid.forEach((snap, snapIndex) => {\n        slidesGrid[snapIndex] = snap + allSlidesOffset;\n      });\n    }\n  }\n  Object.assign(swiper, {\n    slides,\n    snapGrid,\n    slidesGrid,\n    slidesSizesGrid\n  });\n  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);\n    const addToSnapGrid = -swiper.snapGrid[0];\n    const addToSlidesGrid = -swiper.slidesGrid[0];\n    swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);\n    swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);\n  }\n  if (slidesLength !== previousSlidesLength) {\n    swiper.emit('slidesLengthChange');\n  }\n  if (snapGrid.length !== previousSnapGridLength) {\n    if (swiper.params.watchOverflow) swiper.checkOverflow();\n    swiper.emit('snapGridLengthChange');\n  }\n  if (slidesGrid.length !== previousSlidesGridLength) {\n    swiper.emit('slidesGridLengthChange');\n  }\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n  swiper.emit('slidesUpdated');\n  if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {\n    const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;\n    const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);\n    if (slidesLength <= params.maxBackfaceHiddenSlides) {\n      if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);\n    } else if (hasClassBackfaceClassAdded) {\n      swiper.el.classList.remove(backFaceHiddenClass);\n    }\n  }\n}\n\nfunction updateAutoHeight(speed) {\n  const swiper = this;\n  const activeSlides = [];\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n  let newHeight = 0;\n  let i;\n  if (typeof speed === 'number') {\n    swiper.setTransition(speed);\n  } else if (speed === true) {\n    swiper.setTransition(swiper.params.speed);\n  }\n  const getSlideByIndex = index => {\n    if (isVirtual) {\n      return swiper.slides[swiper.getSlideIndexByData(index)];\n    }\n    return swiper.slides[index];\n  };\n  // Find slides currently in view\n  if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n    if (swiper.params.centeredSlides) {\n      (swiper.visibleSlides || []).forEach(slide => {\n        activeSlides.push(slide);\n      });\n    } else {\n      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n        const index = swiper.activeIndex + i;\n        if (index > swiper.slides.length && !isVirtual) break;\n        activeSlides.push(getSlideByIndex(index));\n      }\n    }\n  } else {\n    activeSlides.push(getSlideByIndex(swiper.activeIndex));\n  }\n\n  // Find new height from highest slide in view\n  for (i = 0; i < activeSlides.length; i += 1) {\n    if (typeof activeSlides[i] !== 'undefined') {\n      const height = activeSlides[i].offsetHeight;\n      newHeight = height > newHeight ? height : newHeight;\n    }\n  }\n\n  // Update Height\n  if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = `${newHeight}px`;\n}\n\nfunction updateSlidesOffset() {\n  const swiper = this;\n  const slides = swiper.slides;\n  // eslint-disable-next-line\n  const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;\n  for (let i = 0; i < slides.length; i += 1) {\n    slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment();\n  }\n}\n\nconst toggleSlideClasses$1 = (slideEl, condition, className) => {\n  if (condition && !slideEl.classList.contains(className)) {\n    slideEl.classList.add(className);\n  } else if (!condition && slideEl.classList.contains(className)) {\n    slideEl.classList.remove(className);\n  }\n};\nfunction updateSlidesProgress(translate = this && this.translate || 0) {\n  const swiper = this;\n  const params = swiper.params;\n  const {\n    slides,\n    rtlTranslate: rtl,\n    snapGrid\n  } = swiper;\n  if (slides.length === 0) return;\n  if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n  let offsetCenter = -translate;\n  if (rtl) offsetCenter = translate;\n  swiper.visibleSlidesIndexes = [];\n  swiper.visibleSlides = [];\n  let spaceBetween = params.spaceBetween;\n  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n    spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;\n  } else if (typeof spaceBetween === 'string') {\n    spaceBetween = parseFloat(spaceBetween);\n  }\n  for (let i = 0; i < slides.length; i += 1) {\n    const slide = slides[i];\n    let slideOffset = slide.swiperSlideOffset;\n    if (params.cssMode && params.centeredSlides) {\n      slideOffset -= slides[0].swiperSlideOffset;\n    }\n    const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);\n    const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);\n    const slideBefore = -(offsetCenter - slideOffset);\n    const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n    const isFullyVisible = slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i];\n    const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;\n    if (isVisible) {\n      swiper.visibleSlides.push(slide);\n      swiper.visibleSlidesIndexes.push(i);\n    }\n    toggleSlideClasses$1(slide, isVisible, params.slideVisibleClass);\n    toggleSlideClasses$1(slide, isFullyVisible, params.slideFullyVisibleClass);\n    slide.progress = rtl ? -slideProgress : slideProgress;\n    slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n  }\n}\n\nfunction updateProgress(translate) {\n  const swiper = this;\n  if (typeof translate === 'undefined') {\n    const multiplier = swiper.rtlTranslate ? -1 : 1;\n    // eslint-disable-next-line\n    translate = swiper && swiper.translate && swiper.translate * multiplier || 0;\n  }\n  const params = swiper.params;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  let {\n    progress,\n    isBeginning,\n    isEnd,\n    progressLoop\n  } = swiper;\n  const wasBeginning = isBeginning;\n  const wasEnd = isEnd;\n  if (translatesDiff === 0) {\n    progress = 0;\n    isBeginning = true;\n    isEnd = true;\n  } else {\n    progress = (translate - swiper.minTranslate()) / translatesDiff;\n    const isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1;\n    const isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1;\n    isBeginning = isBeginningRounded || progress <= 0;\n    isEnd = isEndRounded || progress >= 1;\n    if (isBeginningRounded) progress = 0;\n    if (isEndRounded) progress = 1;\n  }\n  if (params.loop) {\n    const firstSlideIndex = swiper.getSlideIndexByData(0);\n    const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);\n    const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];\n    const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];\n    const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];\n    const translateAbs = Math.abs(translate);\n    if (translateAbs >= firstSlideTranslate) {\n      progressLoop = (translateAbs - firstSlideTranslate) / translateMax;\n    } else {\n      progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;\n    }\n    if (progressLoop > 1) progressLoop -= 1;\n  }\n  Object.assign(swiper, {\n    progress,\n    progressLoop,\n    isBeginning,\n    isEnd\n  });\n  if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);\n  if (isBeginning && !wasBeginning) {\n    swiper.emit('reachBeginning toEdge');\n  }\n  if (isEnd && !wasEnd) {\n    swiper.emit('reachEnd toEdge');\n  }\n  if (wasBeginning && !isBeginning || wasEnd && !isEnd) {\n    swiper.emit('fromEdge');\n  }\n  swiper.emit('progress', progress);\n}\n\nconst toggleSlideClasses = (slideEl, condition, className) => {\n  if (condition && !slideEl.classList.contains(className)) {\n    slideEl.classList.add(className);\n  } else if (!condition && slideEl.classList.contains(className)) {\n    slideEl.classList.remove(className);\n  }\n};\nfunction updateSlidesClasses() {\n  const swiper = this;\n  const {\n    slides,\n    params,\n    slidesEl,\n    activeIndex\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n  const getFilteredSlide = selector => {\n    return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0];\n  };\n  let activeSlide;\n  let prevSlide;\n  let nextSlide;\n  if (isVirtual) {\n    if (params.loop) {\n      let slideIndex = activeIndex - swiper.virtual.slidesBefore;\n      if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;\n      if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;\n      activeSlide = getFilteredSlide(`[data-swiper-slide-index=\"${slideIndex}\"]`);\n    } else {\n      activeSlide = getFilteredSlide(`[data-swiper-slide-index=\"${activeIndex}\"]`);\n    }\n  } else {\n    if (gridEnabled) {\n      activeSlide = slides.find(slideEl => slideEl.column === activeIndex);\n      nextSlide = slides.find(slideEl => slideEl.column === activeIndex + 1);\n      prevSlide = slides.find(slideEl => slideEl.column === activeIndex - 1);\n    } else {\n      activeSlide = slides[activeIndex];\n    }\n  }\n  if (activeSlide) {\n    if (!gridEnabled) {\n      // Next Slide\n      nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];\n      if (params.loop && !nextSlide) {\n        nextSlide = slides[0];\n      }\n\n      // Prev Slide\n      prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];\n      if (params.loop && !prevSlide === 0) {\n        prevSlide = slides[slides.length - 1];\n      }\n    }\n  }\n  slides.forEach(slideEl => {\n    toggleSlideClasses(slideEl, slideEl === activeSlide, params.slideActiveClass);\n    toggleSlideClasses(slideEl, slideEl === nextSlide, params.slideNextClass);\n    toggleSlideClasses(slideEl, slideEl === prevSlide, params.slidePrevClass);\n  });\n  swiper.emitSlidesClasses();\n}\n\nconst processLazyPreloader = (swiper, imageEl) => {\n  if (!swiper || swiper.destroyed || !swiper.params) return;\n  const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;\n  const slideEl = imageEl.closest(slideSelector());\n  if (slideEl) {\n    let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n    if (!lazyEl && swiper.isElement) {\n      if (slideEl.shadowRoot) {\n        lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n      } else {\n        // init later\n        requestAnimationFrame(() => {\n          if (slideEl.shadowRoot) {\n            lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n            if (lazyEl && !lazyEl.lazyPreloaderManaged) lazyEl.remove();\n          }\n        });\n      }\n    }\n    // Skip removal if managed by React/Vue component\n    if (lazyEl && !lazyEl.lazyPreloaderManaged) lazyEl.remove();\n  }\n};\nconst unlazy = (swiper, index) => {\n  if (!swiper.slides[index]) return;\n  const imageEl = swiper.slides[index].querySelector('[loading=\"lazy\"]');\n  if (imageEl) imageEl.removeAttribute('loading');\n};\nconst preload = swiper => {\n  if (!swiper || swiper.destroyed || !swiper.params) return;\n  let amount = swiper.params.lazyPreloadPrevNext;\n  const len = swiper.slides.length;\n  if (!len || !amount || amount < 0) return;\n  amount = Math.min(amount, len);\n  const slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);\n  const activeIndex = swiper.activeIndex;\n  if (swiper.params.grid && swiper.params.grid.rows > 1) {\n    const activeColumn = activeIndex;\n    const preloadColumns = [activeColumn - amount];\n    preloadColumns.push(...Array.from({\n      length: amount\n    }).map((_, i) => {\n      return activeColumn + slidesPerView + i;\n    }));\n    swiper.slides.forEach((slideEl, i) => {\n      if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);\n    });\n    return;\n  }\n  const slideIndexLastInView = activeIndex + slidesPerView - 1;\n  if (swiper.params.rewind || swiper.params.loop) {\n    for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {\n      const realIndex = (i % len + len) % len;\n      if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);\n    }\n  } else {\n    for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {\n      if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {\n        unlazy(swiper, i);\n      }\n    }\n  }\n};\n\nfunction getActiveIndexByTranslate(swiper) {\n  const {\n    slidesGrid,\n    params\n  } = swiper;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  let activeIndex;\n  for (let i = 0; i < slidesGrid.length; i += 1) {\n    if (typeof slidesGrid[i + 1] !== 'undefined') {\n      if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {\n        activeIndex = i;\n      } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n        activeIndex = i + 1;\n      }\n    } else if (translate >= slidesGrid[i]) {\n      activeIndex = i;\n    }\n  }\n  // Normalize slideIndex\n  if (params.normalizeSlideIndex) {\n    if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n  }\n  return activeIndex;\n}\nfunction updateActiveIndex(newActiveIndex) {\n  const swiper = this;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  const {\n    snapGrid,\n    params,\n    activeIndex: previousIndex,\n    realIndex: previousRealIndex,\n    snapIndex: previousSnapIndex\n  } = swiper;\n  let activeIndex = newActiveIndex;\n  let snapIndex;\n  const getVirtualRealIndex = aIndex => {\n    let realIndex = aIndex - swiper.virtual.slidesBefore;\n    if (realIndex < 0) {\n      realIndex = swiper.virtual.slides.length + realIndex;\n    }\n    if (realIndex >= swiper.virtual.slides.length) {\n      realIndex -= swiper.virtual.slides.length;\n    }\n    return realIndex;\n  };\n  if (typeof activeIndex === 'undefined') {\n    activeIndex = getActiveIndexByTranslate(swiper);\n  }\n  if (snapGrid.indexOf(translate) >= 0) {\n    snapIndex = snapGrid.indexOf(translate);\n  } else {\n    const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n    snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n  }\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n  if (activeIndex === previousIndex && !swiper.params.loop) {\n    if (snapIndex !== previousSnapIndex) {\n      swiper.snapIndex = snapIndex;\n      swiper.emit('snapIndexChange');\n    }\n    return;\n  }\n  if (activeIndex === previousIndex && swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {\n    swiper.realIndex = getVirtualRealIndex(activeIndex);\n    return;\n  }\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n\n  // Get real index\n  let realIndex;\n  if (swiper.virtual && params.virtual.enabled) {\n    if (params.loop) {\n      realIndex = getVirtualRealIndex(activeIndex);\n    } else {\n      realIndex = activeIndex;\n    }\n  } else if (gridEnabled) {\n    const firstSlideInColumn = swiper.slides.find(slideEl => slideEl.column === activeIndex);\n    let activeSlideIndex = parseInt(firstSlideInColumn.getAttribute('data-swiper-slide-index'), 10);\n    if (Number.isNaN(activeSlideIndex)) {\n      activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0);\n    }\n    realIndex = Math.floor(activeSlideIndex / params.grid.rows);\n  } else if (swiper.slides[activeIndex]) {\n    const slideIndex = swiper.slides[activeIndex].getAttribute('data-swiper-slide-index');\n    if (slideIndex) {\n      realIndex = parseInt(slideIndex, 10);\n    } else {\n      realIndex = activeIndex;\n    }\n  } else {\n    realIndex = activeIndex;\n  }\n  Object.assign(swiper, {\n    previousSnapIndex,\n    snapIndex,\n    previousRealIndex,\n    realIndex,\n    previousIndex,\n    activeIndex\n  });\n  if (swiper.initialized) {\n    preload(swiper);\n  }\n  swiper.emit('activeIndexChange');\n  swiper.emit('snapIndexChange');\n  if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n    if (previousRealIndex !== realIndex) {\n      swiper.emit('realIndexChange');\n    }\n    swiper.emit('slideChange');\n  }\n}\n\nfunction updateClickedSlide(el, path) {\n  const swiper = this;\n  const params = swiper.params;\n  let slide = el.closest(`.${params.slideClass}, swiper-slide`);\n  if (!slide && swiper.isElement && path && path.length > 1 && path.includes(el)) {\n    [...path.slice(path.indexOf(el) + 1, path.length)].forEach(pathEl => {\n      if (!slide && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) {\n        slide = pathEl;\n      }\n    });\n  }\n  let slideFound = false;\n  let slideIndex;\n  if (slide) {\n    for (let i = 0; i < swiper.slides.length; i += 1) {\n      if (swiper.slides[i] === slide) {\n        slideFound = true;\n        slideIndex = i;\n        break;\n      }\n    }\n  }\n  if (slide && slideFound) {\n    swiper.clickedSlide = slide;\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);\n    } else {\n      swiper.clickedIndex = slideIndex;\n    }\n  } else {\n    swiper.clickedSlide = undefined;\n    swiper.clickedIndex = undefined;\n    return;\n  }\n  if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {\n    swiper.slideToClickedSlide();\n  }\n}\n\nvar update = {\n  updateSize,\n  updateSlides,\n  updateAutoHeight,\n  updateSlidesOffset,\n  updateSlidesProgress,\n  updateProgress,\n  updateSlidesClasses,\n  updateActiveIndex,\n  updateClickedSlide\n};\n\nfunction getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n  const swiper = this;\n  const {\n    params,\n    rtlTranslate: rtl,\n    translate,\n    wrapperEl\n  } = swiper;\n  if (params.virtualTranslate) {\n    return rtl ? -translate : translate;\n  }\n  if (params.cssMode) {\n    return translate;\n  }\n  let currentTranslate = getTranslate(wrapperEl, axis);\n  currentTranslate += swiper.cssOverflowAdjustment();\n  if (rtl) currentTranslate = -currentTranslate;\n  return currentTranslate || 0;\n}\n\nfunction setTranslate(translate, byController) {\n  const swiper = this;\n  const {\n    rtlTranslate: rtl,\n    params,\n    wrapperEl,\n    progress\n  } = swiper;\n  let x = 0;\n  let y = 0;\n  const z = 0;\n  if (swiper.isHorizontal()) {\n    x = rtl ? -translate : translate;\n  } else {\n    y = translate;\n  }\n  if (params.roundLengths) {\n    x = Math.floor(x);\n    y = Math.floor(y);\n  }\n  swiper.previousTranslate = swiper.translate;\n  swiper.translate = swiper.isHorizontal() ? x : y;\n  if (params.cssMode) {\n    wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n  } else if (!params.virtualTranslate) {\n    if (swiper.isHorizontal()) {\n      x -= swiper.cssOverflowAdjustment();\n    } else {\n      y -= swiper.cssOverflowAdjustment();\n    }\n    wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;\n  }\n\n  // Check if we need to update progress\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n  }\n  if (newProgress !== progress) {\n    swiper.updateProgress(translate);\n  }\n  swiper.emit('setTranslate', swiper.translate, byController);\n}\n\nfunction minTranslate() {\n  return -this.snapGrid[0];\n}\n\nfunction maxTranslate() {\n  return -this.snapGrid[this.snapGrid.length - 1];\n}\n\nfunction translateTo(translate = 0, speed = this.params.speed, runCallbacks = true, translateBounds = true, internal) {\n  const swiper = this;\n  const {\n    params,\n    wrapperEl\n  } = swiper;\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return false;\n  }\n  const minTranslate = swiper.minTranslate();\n  const maxTranslate = swiper.maxTranslate();\n  let newTranslate;\n  if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate;\n\n  // Update progress\n  swiper.updateProgress(newTranslate);\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n    if (speed === 0) {\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({\n          swiper,\n          targetPosition: -newTranslate,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: -newTranslate,\n        behavior: 'smooth'\n      });\n    }\n    return true;\n  }\n  if (speed === 0) {\n    swiper.setTransition(0);\n    swiper.setTranslate(newTranslate);\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionEnd');\n    }\n  } else {\n    swiper.setTransition(speed);\n    swiper.setTranslate(newTranslate);\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionStart');\n    }\n    if (!swiper.animating) {\n      swiper.animating = true;\n      if (!swiper.onTranslateToWrapperTransitionEnd) {\n        swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n          if (!swiper || swiper.destroyed) return;\n          if (e.target !== this) return;\n          swiper.wrapperEl.removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n          swiper.onTranslateToWrapperTransitionEnd = null;\n          delete swiper.onTranslateToWrapperTransitionEnd;\n          swiper.animating = false;\n          if (runCallbacks) {\n            swiper.emit('transitionEnd');\n          }\n        };\n      }\n      swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n    }\n  }\n  return true;\n}\n\nvar translate = {\n  getTranslate: getSwiperTranslate,\n  setTranslate,\n  minTranslate,\n  maxTranslate,\n  translateTo\n};\n\nfunction setTransition(duration, byController) {\n  const swiper = this;\n  if (!swiper.params.cssMode) {\n    swiper.wrapperEl.style.transitionDuration = `${duration}ms`;\n    swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : '';\n  }\n  swiper.emit('setTransition', duration, byController);\n}\n\nfunction transitionEmit({\n  swiper,\n  runCallbacks,\n  direction,\n  step\n}) {\n  const {\n    activeIndex,\n    previousIndex\n  } = swiper;\n  let dir = direction;\n  if (!dir) {\n    if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';\n  }\n  swiper.emit(`transition${step}`);\n  if (runCallbacks && dir === 'reset') {\n    swiper.emit(`slideResetTransition${step}`);\n  } else if (runCallbacks && activeIndex !== previousIndex) {\n    swiper.emit(`slideChangeTransition${step}`);\n    if (dir === 'next') {\n      swiper.emit(`slideNextTransition${step}`);\n    } else {\n      swiper.emit(`slidePrevTransition${step}`);\n    }\n  }\n}\n\nfunction transitionStart(runCallbacks = true, direction) {\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  if (params.cssMode) return;\n  if (params.autoHeight) {\n    swiper.updateAutoHeight();\n  }\n  transitionEmit({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'Start'\n  });\n}\n\nfunction transitionEnd(runCallbacks = true, direction) {\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  swiper.animating = false;\n  if (params.cssMode) return;\n  swiper.setTransition(0);\n  transitionEmit({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'End'\n  });\n}\n\nvar transition = {\n  setTransition,\n  transitionStart,\n  transitionEnd\n};\n\nfunction slideTo(index = 0, speed, runCallbacks = true, internal, initial) {\n  if (typeof index === 'string') {\n    index = parseInt(index, 10);\n  }\n  const swiper = this;\n  let slideIndex = index;\n  if (slideIndex < 0) slideIndex = 0;\n  const {\n    params,\n    snapGrid,\n    slidesGrid,\n    previousIndex,\n    activeIndex,\n    rtlTranslate: rtl,\n    wrapperEl,\n    enabled\n  } = swiper;\n  if (!enabled && !internal && !initial || swiper.destroyed || swiper.animating && params.preventInteractionOnTransition) {\n    return false;\n  }\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n  let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n  const translate = -snapGrid[snapIndex];\n  // Normalize slideIndex\n  if (params.normalizeSlideIndex) {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      const normalizedTranslate = -Math.floor(translate * 100);\n      const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n      const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {\n          slideIndex = i;\n        } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {\n          slideIndex = i + 1;\n        }\n      } else if (normalizedTranslate >= normalizedGrid) {\n        slideIndex = i;\n      }\n    }\n  }\n  // Directions locks\n  if (swiper.initialized && slideIndex !== activeIndex) {\n    if (!swiper.allowSlideNext && (rtl ? translate > swiper.translate && translate > swiper.minTranslate() : translate < swiper.translate && translate < swiper.minTranslate())) {\n      return false;\n    }\n    if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n      if ((activeIndex || 0) !== slideIndex) {\n        return false;\n      }\n    }\n  }\n  if (slideIndex !== (previousIndex || 0) && runCallbacks) {\n    swiper.emit('beforeSlideChangeStart');\n  }\n\n  // Update progress\n  swiper.updateProgress(translate);\n  let direction;\n  if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset';\n\n  // initial virtual\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n  const isInitialVirtual = isVirtual && initial;\n  // Update Index\n  if (!isInitialVirtual && (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate)) {\n    swiper.updateActiveIndex(slideIndex);\n    // Update Height\n    if (params.autoHeight) {\n      swiper.updateAutoHeight();\n    }\n    swiper.updateSlidesClasses();\n    if (params.effect !== 'slide') {\n      swiper.setTranslate(translate);\n    }\n    if (direction !== 'reset') {\n      swiper.transitionStart(runCallbacks, direction);\n      swiper.transitionEnd(runCallbacks, direction);\n    }\n    return false;\n  }\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n    const t = rtl ? translate : -translate;\n    if (speed === 0) {\n      if (isVirtual) {\n        swiper.wrapperEl.style.scrollSnapType = 'none';\n        swiper._immediateVirtual = true;\n      }\n      if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {\n        swiper._cssModeVirtualInitialSet = true;\n        requestAnimationFrame(() => {\n          wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n        });\n      } else {\n        wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n      }\n      if (isVirtual) {\n        requestAnimationFrame(() => {\n          swiper.wrapperEl.style.scrollSnapType = '';\n          swiper._immediateVirtual = false;\n        });\n      }\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({\n          swiper,\n          targetPosition: t,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: t,\n        behavior: 'smooth'\n      });\n    }\n    return true;\n  }\n  const browser = getBrowser();\n  const isSafari = browser.isSafari;\n  if (isVirtual && !initial && isSafari && swiper.isElement) {\n    swiper.virtual.update(false, false, slideIndex);\n  }\n  swiper.setTransition(speed);\n  swiper.setTranslate(translate);\n  swiper.updateActiveIndex(slideIndex);\n  swiper.updateSlidesClasses();\n  swiper.emit('beforeTransitionStart', speed, internal);\n  swiper.transitionStart(runCallbacks, direction);\n  if (speed === 0) {\n    swiper.transitionEnd(runCallbacks, direction);\n  } else if (!swiper.animating) {\n    swiper.animating = true;\n    if (!swiper.onSlideToWrapperTransitionEnd) {\n      swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n        if (!swiper || swiper.destroyed) return;\n        if (e.target !== this) return;\n        swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n        swiper.onSlideToWrapperTransitionEnd = null;\n        delete swiper.onSlideToWrapperTransitionEnd;\n        swiper.transitionEnd(runCallbacks, direction);\n      };\n    }\n    swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n  }\n  return true;\n}\n\nfunction slideToLoop(index = 0, speed, runCallbacks = true, internal) {\n  if (typeof index === 'string') {\n    const indexAsNumber = parseInt(index, 10);\n    index = indexAsNumber;\n  }\n  const swiper = this;\n  if (swiper.destroyed) return;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;\n  let newIndex = index;\n  if (swiper.params.loop) {\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      // eslint-disable-next-line\n      newIndex = newIndex + swiper.virtual.slidesBefore;\n    } else {\n      let targetSlideIndex;\n      if (gridEnabled) {\n        const slideIndex = newIndex * swiper.params.grid.rows;\n        targetSlideIndex = swiper.slides.find(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex).column;\n      } else {\n        targetSlideIndex = swiper.getSlideIndexByData(newIndex);\n      }\n      const cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length;\n      const {\n        centeredSlides,\n        slidesOffsetBefore,\n        slidesOffsetAfter\n      } = swiper.params;\n      const bothDirections = centeredSlides || !!slidesOffsetBefore || !!slidesOffsetAfter;\n      let slidesPerView = swiper.params.slidesPerView;\n      if (slidesPerView === 'auto') {\n        slidesPerView = swiper.slidesPerViewDynamic();\n      } else {\n        slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));\n        if (bothDirections && slidesPerView % 2 === 0) {\n          slidesPerView = slidesPerView + 1;\n        }\n      }\n      let needLoopFix = cols - targetSlideIndex < slidesPerView;\n      if (bothDirections) {\n        needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);\n      }\n      if (internal && bothDirections && swiper.params.slidesPerView !== 'auto' && !gridEnabled) {\n        needLoopFix = false;\n      }\n      if (needLoopFix) {\n        const direction = bothDirections ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev';\n        swiper.loopFix({\n          direction,\n          slideTo: true,\n          activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,\n          slideRealIndex: direction === 'next' ? swiper.realIndex : undefined\n        });\n      }\n      if (gridEnabled) {\n        const slideIndex = newIndex * swiper.params.grid.rows;\n        newIndex = swiper.slides.find(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex).column;\n      } else {\n        newIndex = swiper.getSlideIndexByData(newIndex);\n      }\n    }\n  }\n  requestAnimationFrame(() => {\n    swiper.slideTo(newIndex, speed, runCallbacks, internal);\n  });\n  return swiper;\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slideNext(speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const {\n    enabled,\n    params,\n    animating\n  } = swiper;\n  if (!enabled || swiper.destroyed) return swiper;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  let perGroup = params.slidesPerGroup;\n  if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n    perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n  }\n  const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  if (params.loop) {\n    if (animating && !isVirtual && params.loopPreventsSliding) return false;\n    swiper.loopFix({\n      direction: 'next'\n    });\n    // eslint-disable-next-line\n    swiper._clientLeft = swiper.wrapperEl.clientLeft;\n    if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) {\n      requestAnimationFrame(() => {\n        swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n      });\n      return true;\n    }\n  }\n  if (params.rewind && swiper.isEnd) {\n    return swiper.slideTo(0, speed, runCallbacks, internal);\n  }\n  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slidePrev(speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const {\n    params,\n    snapGrid,\n    slidesGrid,\n    rtlTranslate,\n    enabled,\n    animating\n  } = swiper;\n  if (!enabled || swiper.destroyed) return swiper;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  if (params.loop) {\n    if (animating && !isVirtual && params.loopPreventsSliding) return false;\n    swiper.loopFix({\n      direction: 'prev'\n    });\n    // eslint-disable-next-line\n    swiper._clientLeft = swiper.wrapperEl.clientLeft;\n  }\n  const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n  function normalize(val) {\n    if (val < 0) return -Math.floor(Math.abs(val));\n    return Math.floor(val);\n  }\n  const normalizedTranslate = normalize(translate);\n  const normalizedSnapGrid = snapGrid.map(val => normalize(val));\n  const isFreeMode = params.freeMode && params.freeMode.enabled;\n  let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n  if (typeof prevSnap === 'undefined' && (params.cssMode || isFreeMode)) {\n    let prevSnapIndex;\n    snapGrid.forEach((snap, snapIndex) => {\n      if (normalizedTranslate >= snap) {\n        // prevSnap = snap;\n        prevSnapIndex = snapIndex;\n      }\n    });\n    if (typeof prevSnapIndex !== 'undefined') {\n      prevSnap = isFreeMode ? snapGrid[prevSnapIndex] : snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n    }\n  }\n  let prevIndex = 0;\n  if (typeof prevSnap !== 'undefined') {\n    prevIndex = slidesGrid.indexOf(prevSnap);\n    if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n    if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n      prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n      prevIndex = Math.max(prevIndex, 0);\n    }\n  }\n  if (params.rewind && swiper.isBeginning) {\n    const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;\n    return swiper.slideTo(lastIndex, speed, runCallbacks, internal);\n  } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) {\n    requestAnimationFrame(() => {\n      swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n    });\n    return true;\n  }\n  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slideReset(speed, runCallbacks = true, internal) {\n  const swiper = this;\n  if (swiper.destroyed) return;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slideToClosest(speed, runCallbacks = true, internal, threshold = 0.5) {\n  const swiper = this;\n  if (swiper.destroyed) return;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  let index = swiper.activeIndex;\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n  const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  if (translate >= swiper.snapGrid[snapIndex]) {\n    // The current translate is on or after the current snap index, so the choice\n    // is between the current index and the one after it.\n    const currentSnap = swiper.snapGrid[snapIndex];\n    const nextSnap = swiper.snapGrid[snapIndex + 1];\n    if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n      index += swiper.params.slidesPerGroup;\n    }\n  } else {\n    // The current translate is before the current snap index, so the choice\n    // is between the current index and the one before it.\n    const prevSnap = swiper.snapGrid[snapIndex - 1];\n    const currentSnap = swiper.snapGrid[snapIndex];\n    if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n      index -= swiper.params.slidesPerGroup;\n    }\n  }\n  index = Math.max(index, 0);\n  index = Math.min(index, swiper.slidesGrid.length - 1);\n  return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n\nfunction slideToClickedSlide() {\n  const swiper = this;\n  if (swiper.destroyed) return;\n  const {\n    params,\n    slidesEl\n  } = swiper;\n  const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n  let slideToIndex = swiper.getSlideIndexWhenGrid(swiper.clickedIndex);\n  let realIndex;\n  const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;\n  const isGrid = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;\n  if (params.loop) {\n    if (swiper.animating) return;\n    realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);\n    if (params.centeredSlides) {\n      swiper.slideToLoop(realIndex);\n    } else if (slideToIndex > (isGrid ? (swiper.slides.length - slidesPerView) / 2 - (swiper.params.grid.rows - 1) : swiper.slides.length - slidesPerView)) {\n      swiper.loopFix();\n      slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index=\"${realIndex}\"]`)[0]);\n      nextTick(() => {\n        swiper.slideTo(slideToIndex);\n      });\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  } else {\n    swiper.slideTo(slideToIndex);\n  }\n}\n\nvar slide = {\n  slideTo,\n  slideToLoop,\n  slideNext,\n  slidePrev,\n  slideReset,\n  slideToClosest,\n  slideToClickedSlide\n};\n\nfunction loopCreate(slideRealIndex, initial) {\n  const swiper = this;\n  const {\n    params,\n    slidesEl\n  } = swiper;\n  if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;\n  const initSlides = () => {\n    const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n    slides.forEach((el, index) => {\n      el.setAttribute('data-swiper-slide-index', index);\n    });\n  };\n  const clearBlankSlides = () => {\n    const slides = elementChildren(slidesEl, `.${params.slideBlankClass}`);\n    slides.forEach(el => {\n      el.remove();\n    });\n    if (slides.length > 0) {\n      swiper.recalcSlides();\n      swiper.updateSlides();\n    }\n  };\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n  if (params.loopAddBlankSlides && (params.slidesPerGroup > 1 || gridEnabled)) {\n    clearBlankSlides();\n  }\n  const slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1);\n  const shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0;\n  const shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0;\n  const addBlankSlides = amountOfSlides => {\n    for (let i = 0; i < amountOfSlides; i += 1) {\n      const slideEl = swiper.isElement ? createElement('swiper-slide', [params.slideBlankClass]) : createElement('div', [params.slideClass, params.slideBlankClass]);\n      swiper.slidesEl.append(slideEl);\n    }\n  };\n  if (shouldFillGroup) {\n    if (params.loopAddBlankSlides) {\n      const slidesToAdd = slidesPerGroup - swiper.slides.length % slidesPerGroup;\n      addBlankSlides(slidesToAdd);\n      swiper.recalcSlides();\n      swiper.updateSlides();\n    } else {\n      showWarning('Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');\n    }\n    initSlides();\n  } else if (shouldFillGrid) {\n    if (params.loopAddBlankSlides) {\n      const slidesToAdd = params.grid.rows - swiper.slides.length % params.grid.rows;\n      addBlankSlides(slidesToAdd);\n      swiper.recalcSlides();\n      swiper.updateSlides();\n    } else {\n      showWarning('Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');\n    }\n    initSlides();\n  } else {\n    initSlides();\n  }\n  const bothDirections = params.centeredSlides || !!params.slidesOffsetBefore || !!params.slidesOffsetAfter;\n  swiper.loopFix({\n    slideRealIndex,\n    direction: bothDirections ? undefined : 'next',\n    initial\n  });\n}\n\nfunction loopFix({\n  slideRealIndex,\n  slideTo = true,\n  direction,\n  setTranslate,\n  activeSlideIndex,\n  initial,\n  byController,\n  byMousewheel\n} = {}) {\n  const swiper = this;\n  if (!swiper.params.loop) return;\n  swiper.emit('beforeLoopFix');\n  const {\n    slides,\n    allowSlidePrev,\n    allowSlideNext,\n    slidesEl,\n    params\n  } = swiper;\n  const {\n    centeredSlides,\n    slidesOffsetBefore,\n    slidesOffsetAfter,\n    initialSlide\n  } = params;\n  const bothDirections = centeredSlides || !!slidesOffsetBefore || !!slidesOffsetAfter;\n  swiper.allowSlidePrev = true;\n  swiper.allowSlideNext = true;\n  if (swiper.virtual && params.virtual.enabled) {\n    if (slideTo) {\n      if (!bothDirections && swiper.snapIndex === 0) {\n        swiper.slideTo(swiper.virtual.slides.length, 0, false, true);\n      } else if (bothDirections && swiper.snapIndex < params.slidesPerView) {\n        swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);\n      } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {\n        swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);\n      }\n    }\n    swiper.allowSlidePrev = allowSlidePrev;\n    swiper.allowSlideNext = allowSlideNext;\n    swiper.emit('loopFix');\n    return;\n  }\n  let slidesPerView = params.slidesPerView;\n  if (slidesPerView === 'auto') {\n    slidesPerView = swiper.slidesPerViewDynamic();\n  } else {\n    slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));\n    if (bothDirections && slidesPerView % 2 === 0) {\n      slidesPerView = slidesPerView + 1;\n    }\n  }\n  const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;\n  let loopedSlides = bothDirections ? Math.max(slidesPerGroup, Math.ceil(slidesPerView / 2)) : slidesPerGroup;\n  if (loopedSlides % slidesPerGroup !== 0) {\n    loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup;\n  }\n  loopedSlides += params.loopAdditionalSlides;\n  swiper.loopedSlides = loopedSlides;\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n  if (slides.length < slidesPerView + loopedSlides || swiper.params.effect === 'cards' && slides.length < slidesPerView + loopedSlides * 2) {\n    showWarning('Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled or not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters');\n  } else if (gridEnabled && params.grid.fill === 'row') {\n    showWarning('Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`');\n  }\n  const prependSlidesIndexes = [];\n  const appendSlidesIndexes = [];\n  const cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length;\n  const isInitialOverflow = initial && cols - initialSlide < slidesPerView && !bothDirections;\n  let activeIndex = isInitialOverflow ? initialSlide : swiper.activeIndex;\n  if (typeof activeSlideIndex === 'undefined') {\n    activeSlideIndex = swiper.getSlideIndex(slides.find(el => el.classList.contains(params.slideActiveClass)));\n  } else {\n    activeIndex = activeSlideIndex;\n  }\n  const isNext = direction === 'next' || !direction;\n  const isPrev = direction === 'prev' || !direction;\n  let slidesPrepended = 0;\n  let slidesAppended = 0;\n  const activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex;\n  const activeColIndexWithShift = activeColIndex + (bothDirections && typeof setTranslate === 'undefined' ? -slidesPerView / 2 + 0.5 : 0);\n  // prepend last slides before start\n  if (activeColIndexWithShift < loopedSlides) {\n    slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup);\n    for (let i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) {\n      const index = i - Math.floor(i / cols) * cols;\n      if (gridEnabled) {\n        const colIndexToPrepend = cols - index - 1;\n        for (let i = slides.length - 1; i >= 0; i -= 1) {\n          if (slides[i].column === colIndexToPrepend) prependSlidesIndexes.push(i);\n        }\n        // slides.forEach((slide, slideIndex) => {\n        //   if (slide.column === colIndexToPrepend) prependSlidesIndexes.push(slideIndex);\n        // });\n      } else {\n        prependSlidesIndexes.push(cols - index - 1);\n      }\n    }\n  } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) {\n    slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup);\n    if (isInitialOverflow) {\n      slidesAppended = Math.max(slidesAppended, slidesPerView - cols + initialSlide + 1);\n    }\n    for (let i = 0; i < slidesAppended; i += 1) {\n      const index = i - Math.floor(i / cols) * cols;\n      if (gridEnabled) {\n        slides.forEach((slide, slideIndex) => {\n          if (slide.column === index) appendSlidesIndexes.push(slideIndex);\n        });\n      } else {\n        appendSlidesIndexes.push(index);\n      }\n    }\n  }\n  swiper.__preventObserver__ = true;\n  requestAnimationFrame(() => {\n    swiper.__preventObserver__ = false;\n  });\n  if (swiper.params.effect === 'cards' && slides.length < slidesPerView + loopedSlides * 2) {\n    if (appendSlidesIndexes.includes(activeSlideIndex)) {\n      appendSlidesIndexes.splice(appendSlidesIndexes.indexOf(activeSlideIndex), 1);\n    }\n    if (prependSlidesIndexes.includes(activeSlideIndex)) {\n      prependSlidesIndexes.splice(prependSlidesIndexes.indexOf(activeSlideIndex), 1);\n    }\n  }\n  if (isPrev) {\n    prependSlidesIndexes.forEach(index => {\n      slides[index].swiperLoopMoveDOM = true;\n      slidesEl.prepend(slides[index]);\n      slides[index].swiperLoopMoveDOM = false;\n    });\n  }\n  if (isNext) {\n    appendSlidesIndexes.forEach(index => {\n      slides[index].swiperLoopMoveDOM = true;\n      slidesEl.append(slides[index]);\n      slides[index].swiperLoopMoveDOM = false;\n    });\n  }\n  swiper.recalcSlides();\n  if (params.slidesPerView === 'auto') {\n    swiper.updateSlides();\n  } else if (gridEnabled && (prependSlidesIndexes.length > 0 && isPrev || appendSlidesIndexes.length > 0 && isNext)) {\n    swiper.slides.forEach((slide, slideIndex) => {\n      swiper.grid.updateSlide(slideIndex, slide, swiper.slides);\n    });\n  }\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n  if (slideTo) {\n    if (prependSlidesIndexes.length > 0 && isPrev) {\n      if (typeof slideRealIndex === 'undefined') {\n        const currentSlideTranslate = swiper.slidesGrid[activeIndex];\n        const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];\n        const diff = newSlideTranslate - currentSlideTranslate;\n        if (byMousewheel) {\n          swiper.setTranslate(swiper.translate - diff);\n        } else {\n          swiper.slideTo(activeIndex + Math.ceil(slidesPrepended), 0, false, true);\n          if (setTranslate) {\n            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;\n            swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;\n          }\n        }\n      } else {\n        if (setTranslate) {\n          const shift = gridEnabled ? prependSlidesIndexes.length / params.grid.rows : prependSlidesIndexes.length;\n          swiper.slideTo(swiper.activeIndex + shift, 0, false, true);\n          swiper.touchEventsData.currentTranslate = swiper.translate;\n        }\n      }\n    } else if (appendSlidesIndexes.length > 0 && isNext) {\n      if (typeof slideRealIndex === 'undefined') {\n        const currentSlideTranslate = swiper.slidesGrid[activeIndex];\n        const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];\n        const diff = newSlideTranslate - currentSlideTranslate;\n        if (byMousewheel) {\n          swiper.setTranslate(swiper.translate - diff);\n        } else {\n          swiper.slideTo(activeIndex - slidesAppended, 0, false, true);\n          if (setTranslate) {\n            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;\n            swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;\n          }\n        }\n      } else {\n        const shift = gridEnabled ? appendSlidesIndexes.length / params.grid.rows : appendSlidesIndexes.length;\n        swiper.slideTo(swiper.activeIndex - shift, 0, false, true);\n      }\n    }\n  }\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n  if (swiper.controller && swiper.controller.control && !byController) {\n    const loopParams = {\n      slideRealIndex,\n      direction,\n      setTranslate,\n      activeSlideIndex,\n      byController: true\n    };\n    if (Array.isArray(swiper.controller.control)) {\n      swiper.controller.control.forEach(c => {\n        if (!c.destroyed && c.params.loop) c.loopFix({\n          ...loopParams,\n          slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo : false\n        });\n      });\n    } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {\n      swiper.controller.control.loopFix({\n        ...loopParams,\n        slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo : false\n      });\n    }\n  }\n  swiper.emit('loopFix');\n}\n\nfunction loopDestroy() {\n  const swiper = this;\n  const {\n    params,\n    slidesEl\n  } = swiper;\n  if (!params.loop || !slidesEl || swiper.virtual && swiper.params.virtual.enabled) return;\n  swiper.recalcSlides();\n  const newSlidesOrder = [];\n  swiper.slides.forEach(slideEl => {\n    const index = typeof slideEl.swiperSlideIndex === 'undefined' ? slideEl.getAttribute('data-swiper-slide-index') * 1 : slideEl.swiperSlideIndex;\n    newSlidesOrder[index] = slideEl;\n  });\n  swiper.slides.forEach(slideEl => {\n    slideEl.removeAttribute('data-swiper-slide-index');\n  });\n  newSlidesOrder.forEach(slideEl => {\n    slidesEl.append(slideEl);\n  });\n  swiper.recalcSlides();\n  swiper.slideTo(swiper.realIndex, 0);\n}\n\nvar loop = {\n  loopCreate,\n  loopFix,\n  loopDestroy\n};\n\nfunction setGrabCursor(moving) {\n  const swiper = this;\n  if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;\n  const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n  if (swiper.isElement) {\n    swiper.__preventObserver__ = true;\n  }\n  el.style.cursor = 'move';\n  el.style.cursor = moving ? 'grabbing' : 'grab';\n  if (swiper.isElement) {\n    requestAnimationFrame(() => {\n      swiper.__preventObserver__ = false;\n    });\n  }\n}\n\nfunction unsetGrabCursor() {\n  const swiper = this;\n  if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {\n    return;\n  }\n  if (swiper.isElement) {\n    swiper.__preventObserver__ = true;\n  }\n  swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n  if (swiper.isElement) {\n    requestAnimationFrame(() => {\n      swiper.__preventObserver__ = false;\n    });\n  }\n}\n\nvar grabCursor = {\n  setGrabCursor,\n  unsetGrabCursor\n};\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base = this) {\n  function __closestFrom(el) {\n    if (!el || el === getDocument() || el === getWindow()) return null;\n    if (el.assignedSlot) el = el.assignedSlot;\n    const found = el.closest(selector);\n    if (!found && !el.getRootNode) {\n      return null;\n    }\n    return found || __closestFrom(el.getRootNode().host);\n  }\n  return __closestFrom(base);\n}\nfunction preventEdgeSwipe(swiper, event, startX) {\n  const window = getWindow();\n  const {\n    params\n  } = swiper;\n  const edgeSwipeDetection = params.edgeSwipeDetection;\n  const edgeSwipeThreshold = params.edgeSwipeThreshold;\n  if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {\n    if (edgeSwipeDetection === 'prevent') {\n      event.preventDefault();\n      return true;\n    }\n    return false;\n  }\n  return true;\n}\nfunction onTouchStart(event) {\n  const swiper = this;\n  const document = getDocument();\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  const data = swiper.touchEventsData;\n  if (e.type === 'pointerdown') {\n    if (data.pointerId !== null && data.pointerId !== e.pointerId) {\n      return;\n    }\n    data.pointerId = e.pointerId;\n  } else if (e.type === 'touchstart' && e.targetTouches.length === 1) {\n    data.touchId = e.targetTouches[0].identifier;\n  }\n  if (e.type === 'touchstart') {\n    // don't proceed touch event\n    preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX);\n    return;\n  }\n  const {\n    params,\n    touches,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  if (!params.simulateTouch && e.pointerType === 'mouse') return;\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return;\n  }\n  if (!swiper.animating && params.cssMode && params.loop) {\n    swiper.loopFix();\n  }\n  let targetEl = e.target;\n  if (params.touchEventsTarget === 'wrapper') {\n    if (!elementIsChildOf(targetEl, swiper.wrapperEl)) return;\n  }\n  if ('which' in e && e.which === 3) return;\n  if ('button' in e && e.button > 0) return;\n  if (data.isTouched && data.isMoved) return;\n\n  // change target el for shadow root component\n  const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n  // eslint-disable-next-line\n  const eventPath = e.composedPath ? e.composedPath() : e.path;\n  if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {\n    targetEl = eventPath[0];\n  }\n  const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;\n  const isTargetShadow = !!(e.target && e.target.shadowRoot);\n\n  // use closestElement for shadow root element to get the actual closest for nested shadow root element\n  if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {\n    swiper.allowClick = true;\n    return;\n  }\n  if (params.swipeHandler) {\n    if (!targetEl.closest(params.swipeHandler)) return;\n  }\n  touches.currentX = e.pageX;\n  touches.currentY = e.pageY;\n  const startX = touches.currentX;\n  const startY = touches.currentY;\n\n  // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n  if (!preventEdgeSwipe(swiper, e, startX)) {\n    return;\n  }\n  Object.assign(data, {\n    isTouched: true,\n    isMoved: false,\n    allowTouchCallbacks: true,\n    isScrolling: undefined,\n    startMoving: undefined\n  });\n  touches.startX = startX;\n  touches.startY = startY;\n  data.touchStartTime = now();\n  swiper.allowClick = true;\n  swiper.updateSize();\n  swiper.swipeDirection = undefined;\n  if (params.threshold > 0) data.allowThresholdMove = false;\n  let preventDefault = true;\n  if (targetEl.matches(data.focusableElements)) {\n    preventDefault = false;\n    if (targetEl.nodeName === 'SELECT') {\n      data.isTouched = false;\n    }\n  }\n  if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== targetEl && (e.pointerType === 'mouse' || e.pointerType !== 'mouse' && !targetEl.matches(data.focusableElements))) {\n    document.activeElement.blur();\n  }\n  const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n  if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {\n    e.preventDefault();\n  }\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {\n    swiper.freeMode.onTouchStart();\n  }\n  swiper.emit('touchStart', e);\n}\n\nfunction onTouchMove(event) {\n  const document = getDocument();\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  if (!params.simulateTouch && event.pointerType === 'mouse') return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  if (e.type === 'pointermove') {\n    if (data.touchId !== null) return; // return from pointer if we use touch\n    const id = e.pointerId;\n    if (id !== data.pointerId) return;\n  }\n  let targetTouch;\n  if (e.type === 'touchmove') {\n    targetTouch = [...e.changedTouches].find(t => t.identifier === data.touchId);\n    if (!targetTouch || targetTouch.identifier !== data.touchId) return;\n  } else {\n    targetTouch = e;\n  }\n  if (!data.isTouched) {\n    if (data.startMoving && data.isScrolling) {\n      swiper.emit('touchMoveOpposite', e);\n    }\n    return;\n  }\n  const pageX = targetTouch.pageX;\n  const pageY = targetTouch.pageY;\n  if (e.preventedByNestedSwiper) {\n    touches.startX = pageX;\n    touches.startY = pageY;\n    return;\n  }\n  if (!swiper.allowTouchMove) {\n    if (!e.target.matches(data.focusableElements)) {\n      swiper.allowClick = false;\n    }\n    if (data.isTouched) {\n      Object.assign(touches, {\n        startX: pageX,\n        startY: pageY,\n        currentX: pageX,\n        currentY: pageY\n      });\n      data.touchStartTime = now();\n    }\n    return;\n  }\n  if (params.touchReleaseOnEdges && !params.loop) {\n    if (swiper.isVertical()) {\n      // Vertical\n      if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {\n        data.isTouched = false;\n        data.isMoved = false;\n        return;\n      }\n    } else if (rtl && (pageX > touches.startX && -swiper.translate <= swiper.maxTranslate() || pageX < touches.startX && -swiper.translate >= swiper.minTranslate())) {\n      return;\n    } else if (!rtl && (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate())) {\n      return;\n    }\n  }\n  if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== e.target && e.pointerType !== 'mouse') {\n    document.activeElement.blur();\n  }\n  if (document.activeElement) {\n    if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {\n      data.isMoved = true;\n      swiper.allowClick = false;\n      return;\n    }\n  }\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchMove', e);\n  }\n  touches.previousX = touches.currentX;\n  touches.previousY = touches.currentY;\n  touches.currentX = pageX;\n  touches.currentY = pageY;\n  const diffX = touches.currentX - touches.startX;\n  const diffY = touches.currentY - touches.startY;\n  if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;\n  if (typeof data.isScrolling === 'undefined') {\n    let touchAngle;\n    if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {\n      data.isScrolling = false;\n    } else {\n      // eslint-disable-next-line\n      if (diffX * diffX + diffY * diffY >= 25) {\n        touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;\n        data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;\n      }\n    }\n  }\n  if (data.isScrolling) {\n    swiper.emit('touchMoveOpposite', e);\n  }\n  if (typeof data.startMoving === 'undefined') {\n    if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n      data.startMoving = true;\n    }\n  }\n  if (data.isScrolling || e.type === 'touchmove' && data.preventTouchMoveFromPointerMove) {\n    data.isTouched = false;\n    return;\n  }\n  if (!data.startMoving) {\n    return;\n  }\n  swiper.allowClick = false;\n  if (!params.cssMode && e.cancelable) {\n    e.preventDefault();\n  }\n  if (params.touchMoveStopPropagation && !params.nested) {\n    e.stopPropagation();\n  }\n  let diff = swiper.isHorizontal() ? diffX : diffY;\n  let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;\n  if (params.oneWayMovement) {\n    diff = Math.abs(diff) * (rtl ? 1 : -1);\n    touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);\n  }\n  touches.diff = diff;\n  diff *= params.touchRatio;\n  if (rtl) {\n    diff = -diff;\n    touchesDiff = -touchesDiff;\n  }\n  const prevTouchesDirection = swiper.touchesDirection;\n  swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n  swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';\n  const isLoop = swiper.params.loop && !params.cssMode;\n  const allowLoopFix = swiper.touchesDirection === 'next' && swiper.allowSlideNext || swiper.touchesDirection === 'prev' && swiper.allowSlidePrev;\n  if (!data.isMoved) {\n    if (isLoop && allowLoopFix) {\n      swiper.loopFix({\n        direction: swiper.swipeDirection\n      });\n    }\n    data.startTranslate = swiper.getTranslate();\n    swiper.setTransition(0);\n    if (swiper.animating) {\n      const evt = new window.CustomEvent('transitionend', {\n        bubbles: true,\n        cancelable: true,\n        detail: {\n          bySwiperTouchMove: true\n        }\n      });\n      swiper.wrapperEl.dispatchEvent(evt);\n    }\n    data.allowMomentumBounce = false;\n    // Grab Cursor\n    if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n      swiper.setGrabCursor(true);\n    }\n    swiper.emit('sliderFirstMove', e);\n  }\n  let loopFixed;\n  new Date().getTime();\n  if (params._loopSwapReset !== false && data.isMoved && data.allowThresholdMove && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) {\n    Object.assign(touches, {\n      startX: pageX,\n      startY: pageY,\n      currentX: pageX,\n      currentY: pageY,\n      startTranslate: data.currentTranslate\n    });\n    data.loopSwapReset = true;\n    data.startTranslate = data.currentTranslate;\n    return;\n  }\n  swiper.emit('sliderMove', e);\n  data.isMoved = true;\n  data.currentTranslate = diff + data.startTranslate;\n  let disableParentSwiper = true;\n  let resistanceRatio = params.resistanceRatio;\n  if (params.touchReleaseOnEdges) {\n    resistanceRatio = 0;\n  }\n  if (diff > 0) {\n    if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.slidesSizesGrid[swiper.activeIndex + 1] - (params.slidesPerView !== 'auto' && swiper.slides.length - params.slidesPerView >= 2 ? swiper.slidesSizesGrid[swiper.activeIndex + 1] + swiper.params.spaceBetween : 0) - swiper.params.spaceBetween : swiper.minTranslate())) {\n      swiper.loopFix({\n        direction: 'prev',\n        setTranslate: true,\n        activeSlideIndex: 0\n      });\n    }\n    if (data.currentTranslate > swiper.minTranslate()) {\n      disableParentSwiper = false;\n      if (params.resistance) {\n        data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n      }\n    }\n  } else if (diff < 0) {\n    if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] + swiper.params.spaceBetween + (params.slidesPerView !== 'auto' && swiper.slides.length - params.slidesPerView >= 2 ? swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] + swiper.params.spaceBetween : 0) : swiper.maxTranslate())) {\n      swiper.loopFix({\n        direction: 'next',\n        setTranslate: true,\n        activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))\n      });\n    }\n    if (data.currentTranslate < swiper.maxTranslate()) {\n      disableParentSwiper = false;\n      if (params.resistance) {\n        data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n      }\n    }\n  }\n  if (disableParentSwiper) {\n    e.preventedByNestedSwiper = true;\n  }\n\n  // Directions locks\n  if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n  if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n  if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  // Threshold\n  if (params.threshold > 0) {\n    if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n      if (!data.allowThresholdMove) {\n        data.allowThresholdMove = true;\n        touches.startX = touches.currentX;\n        touches.startY = touches.currentY;\n        data.currentTranslate = data.startTranslate;\n        touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n        return;\n      }\n    } else {\n      data.currentTranslate = data.startTranslate;\n      return;\n    }\n  }\n  if (!params.followFinger || params.cssMode) return;\n\n  // Update active index in free mode\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n    swiper.freeMode.onTouchMove();\n  }\n  // Update progress\n  swiper.updateProgress(data.currentTranslate);\n  // Update translate\n  swiper.setTranslate(data.currentTranslate);\n}\n\nfunction onTouchEnd(event) {\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  let targetTouch;\n  const isTouchEvent = e.type === 'touchend' || e.type === 'touchcancel';\n  if (!isTouchEvent) {\n    if (data.touchId !== null) return; // return from pointer if we use touch\n    if (e.pointerId !== data.pointerId) return;\n    targetTouch = e;\n  } else {\n    targetTouch = [...e.changedTouches].find(t => t.identifier === data.touchId);\n    if (!targetTouch || targetTouch.identifier !== data.touchId) return;\n  }\n  if (['pointercancel', 'pointerout', 'pointerleave', 'contextmenu'].includes(e.type)) {\n    const proceed = ['pointercancel', 'contextmenu'].includes(e.type) && (swiper.browser.isSafari || swiper.browser.isWebView);\n    if (!proceed) {\n      return;\n    }\n  }\n  data.pointerId = null;\n  data.touchId = null;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    slidesGrid,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  if (!params.simulateTouch && e.pointerType === 'mouse') return;\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchEnd', e);\n  }\n  data.allowTouchCallbacks = false;\n  if (!data.isTouched) {\n    if (data.isMoved && params.grabCursor) {\n      swiper.setGrabCursor(false);\n    }\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  }\n\n  // Return Grab Cursor\n  if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n    swiper.setGrabCursor(false);\n  }\n\n  // Time diff\n  const touchEndTime = now();\n  const timeDiff = touchEndTime - data.touchStartTime;\n\n  // Tap, doubleTap, Click\n  if (swiper.allowClick) {\n    const pathTree = e.path || e.composedPath && e.composedPath();\n    swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree);\n    swiper.emit('tap click', e);\n    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n      swiper.emit('doubleTap doubleClick', e);\n    }\n  }\n  data.lastClickTime = now();\n  nextTick(() => {\n    if (!swiper.destroyed) swiper.allowClick = true;\n  });\n  if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 && !data.loopSwapReset || data.currentTranslate === data.startTranslate && !data.loopSwapReset) {\n    data.isTouched = false;\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  }\n  data.isTouched = false;\n  data.isMoved = false;\n  data.startMoving = false;\n  let currentPos;\n  if (params.followFinger) {\n    currentPos = rtl ? swiper.translate : -swiper.translate;\n  } else {\n    currentPos = -data.currentTranslate;\n  }\n  if (params.cssMode) {\n    return;\n  }\n  if (params.freeMode && params.freeMode.enabled) {\n    swiper.freeMode.onTouchEnd({\n      currentPos\n    });\n    return;\n  }\n\n  // Find current slide\n  const swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop;\n  let stopIndex = 0;\n  let groupSize = swiper.slidesSizesGrid[0];\n  for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {\n    const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n    if (typeof slidesGrid[i + increment] !== 'undefined') {\n      if (swipeToLast || currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n        stopIndex = i;\n        groupSize = slidesGrid[i + increment] - slidesGrid[i];\n      }\n    } else if (swipeToLast || currentPos >= slidesGrid[i]) {\n      stopIndex = i;\n      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n    }\n  }\n  let rewindFirstIndex = null;\n  let rewindLastIndex = null;\n  if (params.rewind) {\n    if (swiper.isBeginning) {\n      rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;\n    } else if (swiper.isEnd) {\n      rewindFirstIndex = 0;\n    }\n  }\n  // Find current slide size\n  const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n  const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n  if (timeDiff > params.longSwipesMs) {\n    // Long touches\n    if (!params.longSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n    if (swiper.swipeDirection === 'next') {\n      if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);\n    }\n    if (swiper.swipeDirection === 'prev') {\n      if (ratio > 1 - params.longSwipesRatio) {\n        swiper.slideTo(stopIndex + increment);\n      } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {\n        swiper.slideTo(rewindLastIndex);\n      } else {\n        swiper.slideTo(stopIndex);\n      }\n    }\n  } else {\n    // Short swipes\n    if (!params.shortSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n    const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n    if (!isNavButtonTarget) {\n      if (swiper.swipeDirection === 'next') {\n        swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);\n      }\n      if (swiper.swipeDirection === 'prev') {\n        swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);\n      }\n    } else if (e.target === swiper.navigation.nextEl) {\n      swiper.slideTo(stopIndex + increment);\n    } else {\n      swiper.slideTo(stopIndex);\n    }\n  }\n}\n\nfunction onResize() {\n  const swiper = this;\n  const {\n    params,\n    el\n  } = swiper;\n  if (el && el.offsetWidth === 0) return;\n\n  // Breakpoints\n  if (params.breakpoints) {\n    swiper.setBreakpoint();\n  }\n\n  // Save locks\n  const {\n    allowSlideNext,\n    allowSlidePrev,\n    snapGrid\n  } = swiper;\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n  // Disable locks on resize\n  swiper.allowSlideNext = true;\n  swiper.allowSlidePrev = true;\n  swiper.updateSize();\n  swiper.updateSlides();\n  swiper.updateSlidesClasses();\n  const isVirtualLoop = isVirtual && params.loop;\n  if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {\n    const slides = isVirtual ? swiper.virtual.slides : swiper.slides;\n    swiper.slideTo(slides.length - 1, 0, false, true);\n  } else {\n    if (swiper.params.loop && !isVirtual) {\n      swiper.slideToLoop(swiper.realIndex, 0, false, true);\n    } else {\n      swiper.slideTo(swiper.activeIndex, 0, false, true);\n    }\n  }\n  if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n    clearTimeout(swiper.autoplay.resizeTimeout);\n    swiper.autoplay.resizeTimeout = setTimeout(() => {\n      if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n        swiper.autoplay.resume();\n      }\n    }, 500);\n  }\n  // Return locks after resize\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n    swiper.checkOverflow();\n  }\n}\n\nfunction onClick(e) {\n  const swiper = this;\n  if (!swiper.enabled) return;\n  if (!swiper.allowClick) {\n    if (swiper.params.preventClicks) e.preventDefault();\n    if (swiper.params.preventClicksPropagation && swiper.animating) {\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  }\n}\n\nfunction onScroll() {\n  const swiper = this;\n  const {\n    wrapperEl,\n    rtlTranslate,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  swiper.previousTranslate = swiper.translate;\n  if (swiper.isHorizontal()) {\n    swiper.translate = -wrapperEl.scrollLeft;\n  } else {\n    swiper.translate = -wrapperEl.scrollTop;\n  }\n  // eslint-disable-next-line\n  if (swiper.translate === 0) swiper.translate = 0;\n  swiper.updateActiveIndex();\n  swiper.updateSlidesClasses();\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n  }\n  if (newProgress !== swiper.progress) {\n    swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n  }\n  swiper.emit('setTranslate', swiper.translate, false);\n}\n\nfunction onLoad(e) {\n  const swiper = this;\n  processLazyPreloader(swiper, e.target);\n  if (swiper.params.cssMode || swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight) {\n    return;\n  }\n  swiper.update();\n}\n\nfunction onDocumentTouchStart() {\n  const swiper = this;\n  if (swiper.documentTouchHandlerProceeded) return;\n  swiper.documentTouchHandlerProceeded = true;\n  if (swiper.params.touchReleaseOnEdges) {\n    swiper.el.style.touchAction = 'auto';\n  }\n}\n\nconst events = (swiper, method) => {\n  const document = getDocument();\n  const {\n    params,\n    el,\n    wrapperEl,\n    device\n  } = swiper;\n  const capture = !!params.nested;\n  const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n  const swiperMethod = method;\n  if (!el || typeof el === 'string') return;\n\n  // Touch Events\n  document[domMethod]('touchstart', swiper.onDocumentTouchStart, {\n    passive: false,\n    capture\n  });\n  el[domMethod]('touchstart', swiper.onTouchStart, {\n    passive: false\n  });\n  el[domMethod]('pointerdown', swiper.onTouchStart, {\n    passive: false\n  });\n  document[domMethod]('touchmove', swiper.onTouchMove, {\n    passive: false,\n    capture\n  });\n  document[domMethod]('pointermove', swiper.onTouchMove, {\n    passive: false,\n    capture\n  });\n  document[domMethod]('touchend', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('pointerup', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('pointercancel', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('touchcancel', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('pointerout', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('pointerleave', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('contextmenu', swiper.onTouchEnd, {\n    passive: true\n  });\n\n  // Prevent Links Clicks\n  if (params.preventClicks || params.preventClicksPropagation) {\n    el[domMethod]('click', swiper.onClick, true);\n  }\n  if (params.cssMode) {\n    wrapperEl[domMethod]('scroll', swiper.onScroll);\n  }\n\n  // Resize handler\n  if (params.updateOnWindowResize) {\n    swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);\n  } else {\n    swiper[swiperMethod]('observerUpdate', onResize, true);\n  }\n\n  // Images loader\n  el[domMethod]('load', swiper.onLoad, {\n    capture: true\n  });\n};\nfunction attachEvents() {\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  swiper.onTouchStart = onTouchStart.bind(swiper);\n  swiper.onTouchMove = onTouchMove.bind(swiper);\n  swiper.onTouchEnd = onTouchEnd.bind(swiper);\n  swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper);\n  if (params.cssMode) {\n    swiper.onScroll = onScroll.bind(swiper);\n  }\n  swiper.onClick = onClick.bind(swiper);\n  swiper.onLoad = onLoad.bind(swiper);\n  events(swiper, 'on');\n}\nfunction detachEvents() {\n  const swiper = this;\n  events(swiper, 'off');\n}\nvar events$1 = {\n  attachEvents,\n  detachEvents\n};\n\nconst isGridEnabled = (swiper, params) => {\n  return swiper.grid && params.grid && params.grid.rows > 1;\n};\nfunction setBreakpoint() {\n  const swiper = this;\n  const {\n    realIndex,\n    initialized,\n    params,\n    el\n  } = swiper;\n  const breakpoints = params.breakpoints;\n  if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return;\n  const document = getDocument();\n\n  // Get breakpoint for window/container width and update parameters\n  const breakpointsBase = params.breakpointsBase === 'window' || !params.breakpointsBase ? params.breakpointsBase : 'container';\n  const breakpointContainer = ['window', 'container'].includes(params.breakpointsBase) || !params.breakpointsBase ? swiper.el : document.querySelector(params.breakpointsBase);\n  const breakpoint = swiper.getBreakpoint(breakpoints, breakpointsBase, breakpointContainer);\n  if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n  const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n  const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n  const wasMultiRow = isGridEnabled(swiper, params);\n  const isMultiRow = isGridEnabled(swiper, breakpointParams);\n  const wasGrabCursor = swiper.params.grabCursor;\n  const isGrabCursor = breakpointParams.grabCursor;\n  const wasEnabled = params.enabled;\n  if (wasMultiRow && !isMultiRow) {\n    el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);\n    swiper.emitContainerClasses();\n  } else if (!wasMultiRow && isMultiRow) {\n    el.classList.add(`${params.containerModifierClass}grid`);\n    if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {\n      el.classList.add(`${params.containerModifierClass}grid-column`);\n    }\n    swiper.emitContainerClasses();\n  }\n  if (wasGrabCursor && !isGrabCursor) {\n    swiper.unsetGrabCursor();\n  } else if (!wasGrabCursor && isGrabCursor) {\n    swiper.setGrabCursor();\n  }\n\n  // Toggle navigation, pagination, scrollbar\n  ['navigation', 'pagination', 'scrollbar'].forEach(prop => {\n    if (typeof breakpointParams[prop] === 'undefined') return;\n    const wasModuleEnabled = params[prop] && params[prop].enabled;\n    const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;\n    if (wasModuleEnabled && !isModuleEnabled) {\n      swiper[prop].disable();\n    }\n    if (!wasModuleEnabled && isModuleEnabled) {\n      swiper[prop].enable();\n    }\n  });\n  const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;\n  const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n  const wasLoop = params.loop;\n  if (directionChanged && initialized) {\n    swiper.changeDirection();\n  }\n  extend(swiper.params, breakpointParams);\n  const isEnabled = swiper.params.enabled;\n  const hasLoop = swiper.params.loop;\n  Object.assign(swiper, {\n    allowTouchMove: swiper.params.allowTouchMove,\n    allowSlideNext: swiper.params.allowSlideNext,\n    allowSlidePrev: swiper.params.allowSlidePrev\n  });\n  if (wasEnabled && !isEnabled) {\n    swiper.disable();\n  } else if (!wasEnabled && isEnabled) {\n    swiper.enable();\n  }\n  swiper.currentBreakpoint = breakpoint;\n  swiper.emit('_beforeBreakpoint', breakpointParams);\n  if (initialized) {\n    if (needsReLoop) {\n      swiper.loopDestroy();\n      swiper.loopCreate(realIndex);\n      swiper.updateSlides();\n    } else if (!wasLoop && hasLoop) {\n      swiper.loopCreate(realIndex);\n      swiper.updateSlides();\n    } else if (wasLoop && !hasLoop) {\n      swiper.loopDestroy();\n    }\n  }\n  swiper.emit('breakpoint', breakpointParams);\n}\n\nfunction getBreakpoint(breakpoints, base = 'window', containerEl) {\n  if (!breakpoints || base === 'container' && !containerEl) return undefined;\n  let breakpoint = false;\n  const window = getWindow();\n  const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n  const points = Object.keys(breakpoints).map(point => {\n    if (typeof point === 'string' && point.indexOf('@') === 0) {\n      const minRatio = parseFloat(point.substr(1));\n      const value = currentHeight * minRatio;\n      return {\n        value,\n        point\n      };\n    }\n    return {\n      value: point,\n      point\n    };\n  });\n  points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n  for (let i = 0; i < points.length; i += 1) {\n    const {\n      point,\n      value\n    } = points[i];\n    if (base === 'window') {\n      if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n        breakpoint = point;\n      }\n    } else if (value <= containerEl.clientWidth) {\n      breakpoint = point;\n    }\n  }\n  return breakpoint || 'max';\n}\n\nvar breakpoints = {\n  setBreakpoint,\n  getBreakpoint\n};\n\nfunction prepareClasses(entries, prefix) {\n  const resultClasses = [];\n  entries.forEach(item => {\n    if (typeof item === 'object') {\n      Object.keys(item).forEach(classNames => {\n        if (item[classNames]) {\n          resultClasses.push(prefix + classNames);\n        }\n      });\n    } else if (typeof item === 'string') {\n      resultClasses.push(prefix + item);\n    }\n  });\n  return resultClasses;\n}\nfunction addClasses() {\n  const swiper = this;\n  const {\n    classNames,\n    params,\n    rtl,\n    el,\n    device\n  } = swiper;\n  // prettier-ignore\n  const suffixes = prepareClasses(['initialized', params.direction, {\n    'free-mode': swiper.params.freeMode && params.freeMode.enabled\n  }, {\n    'autoheight': params.autoHeight\n  }, {\n    'rtl': rtl\n  }, {\n    'grid': params.grid && params.grid.rows > 1\n  }, {\n    'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'\n  }, {\n    'android': device.android\n  }, {\n    'ios': device.ios\n  }, {\n    'css-mode': params.cssMode\n  }, {\n    'centered': params.cssMode && params.centeredSlides\n  }, {\n    'watch-progress': params.watchSlidesProgress\n  }], params.containerModifierClass);\n  classNames.push(...suffixes);\n  el.classList.add(...classNames);\n  swiper.emitContainerClasses();\n}\n\nfunction removeClasses() {\n  const swiper = this;\n  const {\n    el,\n    classNames\n  } = swiper;\n  if (!el || typeof el === 'string') return;\n  el.classList.remove(...classNames);\n  swiper.emitContainerClasses();\n}\n\nvar classes = {\n  addClasses,\n  removeClasses\n};\n\nfunction checkOverflow() {\n  const swiper = this;\n  const {\n    isLocked: wasLocked,\n    params\n  } = swiper;\n  const {\n    slidesOffsetBefore\n  } = params;\n  if (slidesOffsetBefore) {\n    const lastSlideIndex = swiper.slides.length - 1;\n    const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;\n    swiper.isLocked = swiper.size > lastSlideRightEdge;\n  } else {\n    swiper.isLocked = swiper.snapGrid.length === 1;\n  }\n  if (params.allowSlideNext === true) {\n    swiper.allowSlideNext = !swiper.isLocked;\n  }\n  if (params.allowSlidePrev === true) {\n    swiper.allowSlidePrev = !swiper.isLocked;\n  }\n  if (wasLocked && wasLocked !== swiper.isLocked) {\n    swiper.isEnd = false;\n  }\n  if (wasLocked !== swiper.isLocked) {\n    swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n  }\n}\nvar checkOverflow$1 = {\n  checkOverflow\n};\n\nvar defaults = {\n  init: true,\n  direction: 'horizontal',\n  oneWayMovement: false,\n  swiperElementNodeName: 'SWIPER-CONTAINER',\n  touchEventsTarget: 'wrapper',\n  initialSlide: 0,\n  speed: 300,\n  cssMode: false,\n  updateOnWindowResize: true,\n  resizeObserver: true,\n  nested: false,\n  createElements: false,\n  eventsPrefix: 'swiper',\n  enabled: true,\n  focusableElements: 'input, select, option, textarea, button, video, label',\n  // Overrides\n  width: null,\n  height: null,\n  //\n  preventInteractionOnTransition: false,\n  // ssr\n  userAgent: null,\n  url: null,\n  // To support iOS's swipe-to-go-back gesture (when being used in-app).\n  edgeSwipeDetection: false,\n  edgeSwipeThreshold: 20,\n  // Autoheight\n  autoHeight: false,\n  // Set wrapper width\n  setWrapperSize: false,\n  // Virtual Translate\n  virtualTranslate: false,\n  // Effects\n  effect: 'slide',\n  // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n  // Breakpoints\n  breakpoints: undefined,\n  breakpointsBase: 'window',\n  // Slides grid\n  spaceBetween: 0,\n  slidesPerView: 1,\n  slidesPerGroup: 1,\n  slidesPerGroupSkip: 0,\n  slidesPerGroupAuto: false,\n  centeredSlides: false,\n  centeredSlidesBounds: false,\n  slidesOffsetBefore: 0,\n  // in px\n  slidesOffsetAfter: 0,\n  // in px\n  normalizeSlideIndex: true,\n  centerInsufficientSlides: false,\n  snapToSlideEdge: false,\n  // Disable swiper and hide navigation when container not overflow\n  watchOverflow: true,\n  // Round length\n  roundLengths: false,\n  // Touches\n  touchRatio: 1,\n  touchAngle: 45,\n  simulateTouch: true,\n  shortSwipes: true,\n  longSwipes: true,\n  longSwipesRatio: 0.5,\n  longSwipesMs: 300,\n  followFinger: true,\n  allowTouchMove: true,\n  threshold: 5,\n  touchMoveStopPropagation: false,\n  touchStartPreventDefault: true,\n  touchStartForcePreventDefault: false,\n  touchReleaseOnEdges: false,\n  // Unique Navigation Elements\n  uniqueNavElements: true,\n  // Resistance\n  resistance: true,\n  resistanceRatio: 0.85,\n  // Progress\n  watchSlidesProgress: false,\n  // Cursor\n  grabCursor: false,\n  // Clicks\n  preventClicks: true,\n  preventClicksPropagation: true,\n  slideToClickedSlide: false,\n  // loop\n  loop: false,\n  loopAddBlankSlides: true,\n  loopAdditionalSlides: 0,\n  loopPreventsSliding: true,\n  // rewind\n  rewind: false,\n  // Swiping/no swiping\n  allowSlidePrev: true,\n  allowSlideNext: true,\n  swipeHandler: null,\n  // '.swipe-handler',\n  noSwiping: true,\n  noSwipingClass: 'swiper-no-swiping',\n  noSwipingSelector: null,\n  // Passive Listeners\n  passiveListeners: true,\n  maxBackfaceHiddenSlides: 10,\n  // NS\n  containerModifierClass: 'swiper-',\n  // NEW\n  slideClass: 'swiper-slide',\n  slideBlankClass: 'swiper-slide-blank',\n  slideActiveClass: 'swiper-slide-active',\n  slideVisibleClass: 'swiper-slide-visible',\n  slideFullyVisibleClass: 'swiper-slide-fully-visible',\n  slideNextClass: 'swiper-slide-next',\n  slidePrevClass: 'swiper-slide-prev',\n  wrapperClass: 'swiper-wrapper',\n  lazyPreloaderClass: 'swiper-lazy-preloader',\n  lazyPreloadPrevNext: 0,\n  // Callbacks\n  runCallbacksOnInit: true,\n  // Internals\n  _emitClasses: false\n};\n\nfunction moduleExtendParams(params, allModulesParams) {\n  return function extendParams(obj = {}) {\n    const moduleParamName = Object.keys(obj)[0];\n    const moduleParams = obj[moduleParamName];\n    if (typeof moduleParams !== 'object' || moduleParams === null) {\n      extend(allModulesParams, obj);\n      return;\n    }\n    if (params[moduleParamName] === true) {\n      params[moduleParamName] = {\n        enabled: true\n      };\n    }\n    if (moduleParamName === 'navigation' && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) {\n      params[moduleParamName].auto = true;\n    }\n    if (['pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) {\n      params[moduleParamName].auto = true;\n    }\n    if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n      extend(allModulesParams, obj);\n      return;\n    }\n    if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n      params[moduleParamName].enabled = true;\n    }\n    if (!params[moduleParamName]) params[moduleParamName] = {\n      enabled: false\n    };\n    extend(allModulesParams, obj);\n  };\n}\n\n/* eslint no-param-reassign: \"off\" */\nconst prototypes = {\n  eventsEmitter,\n  update,\n  translate,\n  transition,\n  slide,\n  loop,\n  grabCursor,\n  events: events$1,\n  breakpoints,\n  checkOverflow: checkOverflow$1,\n  classes\n};\nconst extendedDefaults = {};\nclass Swiper {\n  constructor(...args) {\n    let el;\n    let params;\n    if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {\n      params = args[0];\n    } else {\n      [el, params] = args;\n    }\n    if (!params) params = {};\n    params = extend({}, params);\n    if (el && !params.el) params.el = el;\n    const document = getDocument();\n    if (params.el && typeof params.el === 'string' && document.querySelectorAll(params.el).length > 1) {\n      const swipers = [];\n      document.querySelectorAll(params.el).forEach(containerEl => {\n        const newParams = extend({}, params, {\n          el: containerEl\n        });\n        swipers.push(new Swiper(newParams));\n      });\n      // eslint-disable-next-line no-constructor-return\n      return swipers;\n    }\n\n    // Swiper Instance\n    const swiper = this;\n    swiper.__swiper__ = true;\n    swiper.support = getSupport();\n    swiper.device = getDevice({\n      userAgent: params.userAgent\n    });\n    swiper.browser = getBrowser();\n    swiper.eventsListeners = {};\n    swiper.eventsAnyListeners = [];\n    swiper.modules = [...swiper.__modules__];\n    if (params.modules && Array.isArray(params.modules)) {\n      params.modules.forEach(mod => {\n        if (typeof mod === 'function' && swiper.modules.indexOf(mod) < 0) {\n          swiper.modules.push(mod);\n        }\n      });\n    }\n    const allModulesParams = {};\n    swiper.modules.forEach(mod => {\n      mod({\n        params,\n        swiper,\n        extendParams: moduleExtendParams(params, allModulesParams),\n        on: swiper.on.bind(swiper),\n        once: swiper.once.bind(swiper),\n        off: swiper.off.bind(swiper),\n        emit: swiper.emit.bind(swiper)\n      });\n    });\n\n    // Extend defaults with modules params\n    const swiperParams = extend({}, defaults, allModulesParams);\n\n    // Extend defaults with passed params\n    swiper.params = extend({}, swiperParams, extendedDefaults, params);\n    swiper.originalParams = extend({}, swiper.params);\n    swiper.passedParams = extend({}, params);\n\n    // add event listeners\n    if (swiper.params && swiper.params.on) {\n      Object.keys(swiper.params.on).forEach(eventName => {\n        swiper.on(eventName, swiper.params.on[eventName]);\n      });\n    }\n    if (swiper.params && swiper.params.onAny) {\n      swiper.onAny(swiper.params.onAny);\n    }\n\n    // Extend Swiper\n    Object.assign(swiper, {\n      enabled: swiper.params.enabled,\n      el,\n      // Classes\n      classNames: [],\n      // Slides\n      slides: [],\n      slidesGrid: [],\n      snapGrid: [],\n      slidesSizesGrid: [],\n      // isDirection\n      isHorizontal() {\n        return swiper.params.direction === 'horizontal';\n      },\n      isVertical() {\n        return swiper.params.direction === 'vertical';\n      },\n      // Indexes\n      activeIndex: 0,\n      realIndex: 0,\n      //\n      isBeginning: true,\n      isEnd: false,\n      // Props\n      translate: 0,\n      previousTranslate: 0,\n      progress: 0,\n      velocity: 0,\n      animating: false,\n      cssOverflowAdjustment() {\n        // Returns 0 unless `translate` is > 2**23\n        // Should be subtracted from css values to prevent overflow\n        return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;\n      },\n      // Locks\n      allowSlideNext: swiper.params.allowSlideNext,\n      allowSlidePrev: swiper.params.allowSlidePrev,\n      // Touch Events\n      touchEventsData: {\n        isTouched: undefined,\n        isMoved: undefined,\n        allowTouchCallbacks: undefined,\n        touchStartTime: undefined,\n        isScrolling: undefined,\n        currentTranslate: undefined,\n        startTranslate: undefined,\n        allowThresholdMove: undefined,\n        // Form elements to match\n        focusableElements: swiper.params.focusableElements,\n        // Last click time\n        lastClickTime: 0,\n        clickTimeout: undefined,\n        // Velocities\n        velocities: [],\n        allowMomentumBounce: undefined,\n        startMoving: undefined,\n        pointerId: null,\n        touchId: null\n      },\n      // Clicks\n      allowClick: true,\n      // Touches\n      allowTouchMove: swiper.params.allowTouchMove,\n      touches: {\n        startX: 0,\n        startY: 0,\n        currentX: 0,\n        currentY: 0,\n        diff: 0\n      },\n      // Images\n      imagesToLoad: [],\n      imagesLoaded: 0\n    });\n    swiper.emit('_swiper');\n\n    // Init\n    if (swiper.params.init) {\n      swiper.init();\n    }\n\n    // Return app instance\n    // eslint-disable-next-line no-constructor-return\n    return swiper;\n  }\n  getDirectionLabel(property) {\n    if (this.isHorizontal()) {\n      return property;\n    }\n    // prettier-ignore\n    return {\n      'width': 'height',\n      'margin-top': 'margin-left',\n      'margin-bottom ': 'margin-right',\n      'margin-left': 'margin-top',\n      'margin-right': 'margin-bottom',\n      'padding-left': 'padding-top',\n      'padding-right': 'padding-bottom',\n      'marginRight': 'marginBottom'\n    }[property];\n  }\n  getSlideIndex(slideEl) {\n    const {\n      slidesEl,\n      params\n    } = this;\n    const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n    const firstSlideIndex = elementIndex(slides[0]);\n    return elementIndex(slideEl) - firstSlideIndex;\n  }\n  getSlideIndexByData(index) {\n    return this.getSlideIndex(this.slides.find(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === index));\n  }\n  getSlideIndexWhenGrid(index) {\n    if (this.grid && this.params.grid && this.params.grid.rows > 1) {\n      if (this.params.grid.fill === 'column') {\n        index = Math.floor(index / this.params.grid.rows);\n      } else if (this.params.grid.fill === 'row') {\n        index = index % Math.ceil(this.slides.length / this.params.grid.rows);\n      }\n    }\n    return index;\n  }\n  recalcSlides() {\n    const swiper = this;\n    const {\n      slidesEl,\n      params\n    } = swiper;\n    swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n  }\n  enable() {\n    const swiper = this;\n    if (swiper.enabled) return;\n    swiper.enabled = true;\n    if (swiper.params.grabCursor) {\n      swiper.setGrabCursor();\n    }\n    swiper.emit('enable');\n  }\n  disable() {\n    const swiper = this;\n    if (!swiper.enabled) return;\n    swiper.enabled = false;\n    if (swiper.params.grabCursor) {\n      swiper.unsetGrabCursor();\n    }\n    swiper.emit('disable');\n  }\n  setProgress(progress, speed) {\n    const swiper = this;\n    progress = Math.min(Math.max(progress, 0), 1);\n    const min = swiper.minTranslate();\n    const max = swiper.maxTranslate();\n    const current = (max - min) * progress + min;\n    swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n  emitContainerClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const cls = swiper.el.className.split(' ').filter(className => {\n      return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;\n    });\n    swiper.emit('_containerClasses', cls.join(' '));\n  }\n  getSlideClasses(slideEl) {\n    const swiper = this;\n    if (swiper.destroyed) return '';\n    return slideEl.className.split(' ').filter(className => {\n      return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;\n    }).join(' ');\n  }\n  emitSlidesClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const updates = [];\n    swiper.slides.forEach(slideEl => {\n      const classNames = swiper.getSlideClasses(slideEl);\n      updates.push({\n        slideEl,\n        classNames\n      });\n      swiper.emit('_slideClass', slideEl, classNames);\n    });\n    swiper.emit('_slideClasses', updates);\n  }\n  slidesPerViewDynamic(view = 'current', exact = false) {\n    const swiper = this;\n    const {\n      params,\n      slides,\n      slidesGrid,\n      slidesSizesGrid,\n      size: swiperSize,\n      activeIndex\n    } = swiper;\n    let spv = 1;\n    if (typeof params.slidesPerView === 'number') return params.slidesPerView;\n    if (params.centeredSlides) {\n      let slideSize = slides[activeIndex] ? Math.ceil(slides[activeIndex].swiperSlideSize) : 0;\n      let breakLoop;\n      for (let i = activeIndex + 1; i < slides.length; i += 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += Math.ceil(slides[i].swiperSlideSize);\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n      for (let i = activeIndex - 1; i >= 0; i -= 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n    } else {\n      // eslint-disable-next-line\n      if (view === 'current') {\n        for (let i = activeIndex + 1; i < slides.length; i += 1) {\n          const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      } else {\n        // previous\n        for (let i = activeIndex - 1; i >= 0; i -= 1) {\n          const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      }\n    }\n    return spv;\n  }\n  update() {\n    const swiper = this;\n    if (!swiper || swiper.destroyed) return;\n    const {\n      snapGrid,\n      params\n    } = swiper;\n    // Breakpoints\n    if (params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n    [...swiper.el.querySelectorAll('[loading=\"lazy\"]')].forEach(imageEl => {\n      if (imageEl.complete) {\n        processLazyPreloader(swiper, imageEl);\n      }\n    });\n    swiper.updateSize();\n    swiper.updateSlides();\n    swiper.updateProgress();\n    swiper.updateSlidesClasses();\n    function setTranslate() {\n      const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n      const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());\n      swiper.setTranslate(newTranslate);\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n    let translated;\n    if (params.freeMode && params.freeMode.enabled && !params.cssMode) {\n      setTranslate();\n      if (params.autoHeight) {\n        swiper.updateAutoHeight();\n      }\n    } else {\n      if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {\n        const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;\n        translated = swiper.slideTo(slides.length - 1, 0, false, true);\n      } else {\n        translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n      }\n      if (!translated) {\n        setTranslate();\n      }\n    }\n    if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n      swiper.checkOverflow();\n    }\n    swiper.emit('update');\n  }\n  changeDirection(newDirection, needUpdate = true) {\n    const swiper = this;\n    const currentDirection = swiper.params.direction;\n    if (!newDirection) {\n      // eslint-disable-next-line\n      newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n    }\n    if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {\n      return swiper;\n    }\n    swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);\n    swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);\n    swiper.emitContainerClasses();\n    swiper.params.direction = newDirection;\n    swiper.slides.forEach(slideEl => {\n      if (newDirection === 'vertical') {\n        slideEl.style.width = '';\n      } else {\n        slideEl.style.height = '';\n      }\n    });\n    swiper.emit('changeDirection');\n    if (needUpdate) swiper.update();\n    return swiper;\n  }\n  changeLanguageDirection(direction) {\n    const swiper = this;\n    if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return;\n    swiper.rtl = direction === 'rtl';\n    swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;\n    if (swiper.rtl) {\n      swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);\n      swiper.el.dir = 'rtl';\n    } else {\n      swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);\n      swiper.el.dir = 'ltr';\n    }\n    swiper.update();\n  }\n  mount(element) {\n    const swiper = this;\n    if (swiper.mounted) return true;\n\n    // Find el\n    let el = element || swiper.params.el;\n    if (typeof el === 'string') {\n      el = document.querySelector(el);\n    }\n    if (!el) {\n      return false;\n    }\n    el.swiper = swiper;\n    if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === swiper.params.swiperElementNodeName.toUpperCase()) {\n      swiper.isElement = true;\n    }\n    const getWrapperSelector = () => {\n      return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n    };\n    const getWrapper = () => {\n      if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n        const res = el.shadowRoot.querySelector(getWrapperSelector());\n        // Children needs to return slot items\n        return res;\n      }\n      return elementChildren(el, getWrapperSelector())[0];\n    };\n    // Find Wrapper\n    let wrapperEl = getWrapper();\n    if (!wrapperEl && swiper.params.createElements) {\n      wrapperEl = createElement('div', swiper.params.wrapperClass);\n      el.append(wrapperEl);\n      elementChildren(el, `.${swiper.params.slideClass}`).forEach(slideEl => {\n        wrapperEl.append(slideEl);\n      });\n    }\n    Object.assign(swiper, {\n      el,\n      wrapperEl,\n      slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl,\n      hostEl: swiper.isElement ? el.parentNode.host : el,\n      mounted: true,\n      // RTL\n      rtl: el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl',\n      rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl'),\n      wrongRTL: elementStyle(wrapperEl, 'display') === '-webkit-box'\n    });\n    return true;\n  }\n  init(el) {\n    const swiper = this;\n    if (swiper.initialized) return swiper;\n    const mounted = swiper.mount(el);\n    if (mounted === false) return swiper;\n    swiper.emit('beforeInit');\n\n    // Set breakpoint\n    if (swiper.params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n\n    // Add Classes\n    swiper.addClasses();\n\n    // Update size\n    swiper.updateSize();\n\n    // Update slides\n    swiper.updateSlides();\n    if (swiper.params.watchOverflow) {\n      swiper.checkOverflow();\n    }\n\n    // Set Grab Cursor\n    if (swiper.params.grabCursor && swiper.enabled) {\n      swiper.setGrabCursor();\n    }\n\n    // Slide To Initial Slide\n    if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);\n    } else {\n      swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n    }\n\n    // Create loop\n    if (swiper.params.loop) {\n      swiper.loopCreate(undefined, true);\n    }\n\n    // Attach events\n    swiper.attachEvents();\n    const lazyElements = [...swiper.el.querySelectorAll('[loading=\"lazy\"]')];\n    if (swiper.isElement) {\n      lazyElements.push(...swiper.hostEl.querySelectorAll('[loading=\"lazy\"]'));\n    }\n    lazyElements.forEach(imageEl => {\n      if (imageEl.complete) {\n        processLazyPreloader(swiper, imageEl);\n      } else {\n        imageEl.addEventListener('load', e => {\n          processLazyPreloader(swiper, e.target);\n        });\n      }\n    });\n    preload(swiper);\n\n    // Init Flag\n    swiper.initialized = true;\n    preload(swiper);\n\n    // Emit\n    swiper.emit('init');\n    swiper.emit('afterInit');\n    return swiper;\n  }\n  destroy(deleteInstance = true, cleanStyles = true) {\n    const swiper = this;\n    const {\n      params,\n      el,\n      wrapperEl,\n      slides\n    } = swiper;\n    if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n      return null;\n    }\n    swiper.emit('beforeDestroy');\n\n    // Init Flag\n    swiper.initialized = false;\n\n    // Detach events\n    swiper.detachEvents();\n\n    // Destroy loop\n    if (params.loop) {\n      swiper.loopDestroy();\n    }\n\n    // Cleanup styles\n    if (cleanStyles) {\n      swiper.removeClasses();\n      if (el && typeof el !== 'string') {\n        el.removeAttribute('style');\n      }\n      if (wrapperEl) {\n        wrapperEl.removeAttribute('style');\n      }\n      if (slides && slides.length) {\n        slides.forEach(slideEl => {\n          slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);\n          slideEl.removeAttribute('style');\n          slideEl.removeAttribute('data-swiper-slide-index');\n        });\n      }\n    }\n    swiper.emit('destroy');\n\n    // Detach emitter events\n    Object.keys(swiper.eventsListeners).forEach(eventName => {\n      swiper.off(eventName);\n    });\n    if (deleteInstance !== false) {\n      if (swiper.el && typeof swiper.el !== 'string') {\n        swiper.el.swiper = null;\n      }\n      deleteProps(swiper);\n    }\n    swiper.destroyed = true;\n    return null;\n  }\n  static extendDefaults(newDefaults) {\n    extend(extendedDefaults, newDefaults);\n  }\n  static get extendedDefaults() {\n    return extendedDefaults;\n  }\n  static get defaults() {\n    return defaults;\n  }\n  static installModule(mod) {\n    if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n    const modules = Swiper.prototype.__modules__;\n    if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n      modules.push(mod);\n    }\n  }\n  static use(module) {\n    if (Array.isArray(module)) {\n      module.forEach(m => Swiper.installModule(m));\n      return Swiper;\n    }\n    Swiper.installModule(module);\n    return Swiper;\n  }\n}\nObject.keys(prototypes).forEach(prototypeGroup => {\n  Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {\n    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n  });\n});\nSwiper.use([Resize, Observer]);\n\nexport { Swiper as S, defaults as d };\n"],"mappings":"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A,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KACA,KAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,KACA,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KACA,IACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAE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MAANA,GACM,MAANA,GACCA,GAAK,KAAUA,GAAK,KACf,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACM,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,KACf,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,KAC7B,CGvvCA,SAASsH,GAAcC,GACnBA,EAAIC,QAAQ,SAAUhiB,GAElB,UADOA,EAAGsc,SACN3b,EAAgBX,IAAOa,EAAgBb,GACvC,IAAK,IAAI+Z,KAAK/Z,EAAG9B,eACN8B,EAAG9B,QAAQ6b,GAAGuC,SACrBwF,GAAc9hB,EAAG9B,QAAQ6b,GAAGpb;KAG3B0B,EAAgBL,IAAOmB,EAAiBnB,EAAGmG,SAG1C5F,EAAcP,IAAOS,EAAc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","ignoreList":[]}