mirror of
https://github.com/flarum/framework.git
synced 2024-12-12 22:53:37 +08:00
1 line
1.4 MiB
1 line
1.4 MiB
{"version":3,"sources":["webpack://@flarum/core/webpack/bootstrap","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/core/./src/common/Model.js","webpack://@flarum/core/./src/common/components/Button.js","webpack://@flarum/core/./src/common/Component.js","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@flarum/core/./src/common/utils/ItemList.js","webpack://@flarum/core/./src/common/helpers/icon.js","webpack://@flarum/core/./src/common/helpers/listItems.js","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://@flarum/core/./src/common/utils/extractText.js","webpack://@flarum/core/./src/common/utils/extract.js","webpack://@flarum/core/./src/common/models/Group.js","webpack://@flarum/core/./src/common/components/Modal.js","webpack://@flarum/core/./src/common/components/Dropdown.js","webpack://@flarum/core/./node_modules/spin.js/spin.js","webpack://@flarum/core/./src/common/components/LoadingIndicator.js","webpack://@flarum/core/./src/common/helpers/avatar.js","webpack://@flarum/core/./src/common/components/Alert.js","webpack://@flarum/core/./src/common/helpers/username.js","webpack://@flarum/core/./src/common/utils/computed.js","webpack://@flarum/core/./src/common/components/Page.js","webpack://@flarum/core/./src/common/components/LinkButton.js","webpack://@flarum/core/./src/common/components/FieldSet.js","webpack://@flarum/core/./src/common/components/Separator.js","webpack://@flarum/core/./src/common/utils/humanTime.js","webpack://@flarum/core/./src/common/components/Badge.js","webpack://@flarum/core/./src/common/utils/classList.js","webpack://@flarum/core/(webpack)/buildin/global.js","webpack://@flarum/core/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://@flarum/core/./src/common/utils/string.js","webpack://@flarum/core/./src/common/components/SelectDropdown.js","webpack://@flarum/core/./src/common/components/GroupBadge.js","webpack://@flarum/core/./src/common/helpers/highlight.js","webpack://@flarum/core/./src/common/components/Switch.js","webpack://@flarum/core/./src/common/utils/ScrollListener.js","webpack://@flarum/core/./src/common/extend.js","webpack://@flarum/core/./src/common/models/User.js","webpack://@flarum/core/./src/common/utils/SubtreeRetainer.js","webpack://@flarum/core/./src/common/helpers/humanTime.js","webpack://@flarum/core/./src/common/models/Discussion.js","webpack://@flarum/core/./src/common/components/Checkbox.js","webpack://@flarum/core/./src/common/utils/RequestError.js","webpack://@flarum/core/./src/common/components/Navigation.js","webpack://@flarum/core/./src/common/components/Select.js","webpack://@flarum/core/./src/common/states/PageState.js","webpack://@flarum/core/./src/common/utils/subclassOf.js","webpack://@flarum/core/./src/common/utils/patchMithril.js","webpack://@flarum/core/./src/common/components/Placeholder.js","webpack://@flarum/core/./src/common/components/ModalManager.js","webpack://@flarum/core/./src/common/components/AlertManager.js","webpack://@flarum/core/./src/common/components/RequestErrorModal.js","webpack://@flarum/core/./src/common/Translator.js","webpack://@flarum/core/./src/common/utils/stringToColor.js","webpack://@flarum/core/./src/common/Store.js","webpack://@flarum/core/./src/common/Session.js","webpack://@flarum/core/./src/common/utils/Drawer.js","webpack://@flarum/core/./src/common/utils/mapRoutes.js","webpack://@flarum/core/./src/common/utils/liveHumanTimes.js","webpack://@flarum/core/./src/common/models/Forum.js","webpack://@flarum/core/./src/common/models/Post.js","webpack://@flarum/core/./src/common/models/Notification.js","webpack://@flarum/core/./node_modules/lodash-es/_arrayPush.js","webpack://@flarum/core/./node_modules/lodash-es/_root.js","webpack://@flarum/core/./node_modules/lodash-es/_Symbol.js","webpack://@flarum/core/./node_modules/lodash-es/_getRawTag.js","webpack://@flarum/core/./node_modules/lodash-es/_objectToString.js","webpack://@flarum/core/./node_modules/lodash-es/_baseGetTag.js","webpack://@flarum/core/./node_modules/lodash-es/isObjectLike.js","webpack://@flarum/core/./node_modules/lodash-es/_baseIsArguments.js","webpack://@flarum/core/./node_modules/lodash-es/isArguments.js","webpack://@flarum/core/./node_modules/lodash-es/isArray.js","webpack://@flarum/core/./node_modules/lodash-es/_isFlattenable.js","webpack://@flarum/core/./node_modules/lodash-es/_baseFlatten.js","webpack://@flarum/core/./node_modules/lodash-es/flattenDeep.js","webpack://@flarum/core/./src/common/Application.js","webpack://@flarum/core/./src/common/utils/formatNumber.js","webpack://@flarum/core/./src/common/utils/anchorScroll.js","webpack://@flarum/core/./src/common/utils/evented.js","webpack://@flarum/core/./src/common/components/SplitDropdown.js","webpack://@flarum/core/./src/common/utils/abbreviateNumber.js","webpack://@flarum/core/./src/common/helpers/userOnline.js","webpack://@flarum/core/./src/common/helpers/fullTime.js","webpack://@flarum/core/(webpack)/buildin/module.js","webpack://@flarum/core/./node_modules/mithril/mithril.js","webpack://@flarum/core/./src/common/extend/Model.js","webpack://@flarum/core/./src/common/extend/PostTypes.js","webpack://@flarum/core/./src/common/extend/Routes.js","webpack://@flarum/core/./src/common/index.js","webpack://@flarum/core/./node_modules/lodash-es/_freeGlobal.js","webpack://@flarum/core/./src/common/compat.js","webpack://@flarum/core/./src/common/utils/mixin.js","webpack://@flarum/core/./src/common/helpers/punctuateSeries.js","webpack://@flarum/core/./node_modules/jquery/dist/jquery.js-exposed?28a1","webpack://@flarum/core/./node_modules/jquery/dist/jquery.js-exposed","webpack://@flarum/core/./node_modules/jquery/dist/jquery.js","webpack://@flarum/core/./node_modules/mithril/mithril.js-exposed","webpack://@flarum/core/./node_modules/moment/moment.js-exposed","webpack://@flarum/core/./node_modules/moment/moment.js","webpack://@flarum/core/./node_modules/m.attrs.bidi/bidi.js-exposed","webpack://@flarum/core/./node_modules/m.attrs.bidi/bidi.js","webpack://@flarum/core/./node_modules/bootstrap/js/affix.js","webpack://@flarum/core/./node_modules/bootstrap/js/dropdown.js","webpack://@flarum/core/./node_modules/bootstrap/js/modal.js","webpack://@flarum/core/./node_modules/bootstrap/js/tooltip.js","webpack://@flarum/core/./node_modules/bootstrap/js/transition.js","webpack://@flarum/core/./node_modules/jquery.hotkeys/jquery.hotkeys.js","webpack://@flarum/core/./node_modules/node-libs-browser/node_modules/punycode/punycode.js-exposed","webpack://@flarum/core/./node_modules/node-libs-browser/node_modules/punycode/punycode.js","webpack://@flarum/core/./node_modules/color-thief-browser/dist/color-thief.min.js-exposed","webpack://@flarum/core/./node_modules/color-thief-browser/dist/color-thief.min.js","webpack://@flarum/core/./src/forum/utils/History.js","webpack://@flarum/core/./src/forum/utils/Pane.js","webpack://@flarum/core/./src/forum/components/TextEditor.js","webpack://@flarum/core/./src/forum/components/ComposerBody.js","webpack://@flarum/core/./src/forum/components/ReplyComposer.js","webpack://@flarum/core/./src/forum/components/DiscussionHero.js","webpack://@flarum/core/./src/forum/components/LoadingPost.js","webpack://@flarum/core/./src/forum/components/ForgotPasswordModal.js","webpack://@flarum/core/./src/forum/components/LogInButtons.js","webpack://@flarum/core/./src/forum/components/SignUpModal.js","webpack://@flarum/core/./src/forum/components/LogInModal.js","webpack://@flarum/core/./src/forum/components/RenameDiscussionModal.js","webpack://@flarum/core/./src/forum/utils/DiscussionControls.js","webpack://@flarum/core/./src/forum/components/ReplyPlaceholder.js","webpack://@flarum/core/./src/forum/components/PostStream.js","webpack://@flarum/core/./src/forum/components/PostStreamScrubber.js","webpack://@flarum/core/./src/forum/components/TerminalPost.js","webpack://@flarum/core/./src/forum/components/PostPreview.js","webpack://@flarum/core/./src/forum/utils/slidable.js","webpack://@flarum/core/./src/forum/components/DiscussionListItem.js","webpack://@flarum/core/./src/forum/components/DiscussionList.js","webpack://@flarum/core/./src/forum/components/DiscussionPage.js","webpack://@flarum/core/./src/forum/components/HeaderPrimary.js","webpack://@flarum/core/./src/forum/components/SessionDropdown.js","webpack://@flarum/core/./src/forum/components/NotificationList.js","webpack://@flarum/core/./src/forum/components/NotificationsDropdown.js","webpack://@flarum/core/./src/forum/utils/KeyboardNavigatable.js","webpack://@flarum/core/./src/forum/components/DiscussionsSearchSource.js","webpack://@flarum/core/./src/forum/components/UsersSearchSource.js","webpack://@flarum/core/./src/forum/components/Search.js","webpack://@flarum/core/./src/forum/components/HeaderSecondary.js","webpack://@flarum/core/./src/forum/components/ComposerButton.js","webpack://@flarum/core/./src/forum/components/Composer.js","webpack://@flarum/core/./src/forum/components/Notification.js","webpack://@flarum/core/./src/forum/components/DiscussionRenamedNotification.js","webpack://@flarum/core/./src/forum/components/EditPostComposer.js","webpack://@flarum/core/./src/forum/utils/PostControls.js","webpack://@flarum/core/./src/forum/components/Post.js","webpack://@flarum/core/./src/forum/components/EditUserModal.js","webpack://@flarum/core/./src/forum/utils/affixSidebar.js","webpack://@flarum/core/./src/forum/components/UserPage.js","webpack://@flarum/core/./src/forum/utils/UserControls.js","webpack://@flarum/core/./src/forum/components/AvatarEditor.js","webpack://@flarum/core/./src/forum/components/UserCard.js","webpack://@flarum/core/./src/forum/components/PostUser.js","webpack://@flarum/core/./src/forum/components/PostMeta.js","webpack://@flarum/core/./src/forum/components/PostEdited.js","webpack://@flarum/core/./src/forum/components/CommentPost.js","webpack://@flarum/core/./src/forum/components/EventPost.js","webpack://@flarum/core/./src/forum/components/DiscussionRenamedPost.js","webpack://@flarum/core/./src/forum/components/WelcomeHero.js","webpack://@flarum/core/./src/forum/components/DiscussionComposer.js","webpack://@flarum/core/./src/forum/components/IndexPage.js","webpack://@flarum/core/./src/forum/components/PostsUserPage.js","webpack://@flarum/core/./src/forum/components/DiscussionsUserPage.js","webpack://@flarum/core/./src/forum/components/NotificationGrid.js","webpack://@flarum/core/./src/forum/components/ChangePasswordModal.js","webpack://@flarum/core/./src/forum/components/ChangeEmailModal.js","webpack://@flarum/core/./src/forum/components/SettingsPage.js","webpack://@flarum/core/./src/forum/components/NotificationsPage.js","webpack://@flarum/core/./src/forum/routes.js","webpack://@flarum/core/./src/forum/utils/alertEmailConfirmation.js","webpack://@flarum/core/./src/forum/states/NotificationListState.js","webpack://@flarum/core/./src/forum/states/GlobalSearchState.js","webpack://@flarum/core/./src/forum/states/SearchState.js","webpack://@flarum/core/./src/forum/state/DiscussionListState.js","webpack://@flarum/core/./src/forum/ForumApplication.js","webpack://@flarum/core/./src/forum/components/LogInButton.js","webpack://@flarum/core/./src/forum/components/TextEditorButton.js","webpack://@flarum/core/./src/forum/components/SearchSource.js","webpack://@flarum/core/./src/forum/compat.js","webpack://@flarum/core/./src/forum/index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","_inheritsLoose","subClass","superClass","constructor","__proto__","Model","data","store","this","freshness","Date","exists","id","attribute","attributes","pushData","innerKey","getIdentifier","pushAttributes","save","options","type","relationships","model","Array","map","oldData","copyData","request","meta","app","method","url","forum","apiEndpoint","then","payload","pushPayload","response","lazyRedraw","delete","remove","deferred","resolve","promise","JSON","parse","stringify","transform","hasOne","relationship","getById","hasMany","transformDate","Button","view","attrs","props","children","className","title","extractText","extract","loading","disabled","onclick","getButtonContent","iconName","icon","LoadingIndicator","component","size","Component","initProps","element","retain","init","onunload","render","vdom","subtree","originalConfig","config","args","apply","slice","$","selector","$element","find","Error","componentProps","$original","output","controller","undefined","_extends","assign","target","arguments","length","source","Item","content","priority","ItemList","items","isEmpty","has","add","replace","merge","toArray","itemName","push","sort","a","b","item","fontClass","isSeparator","Separator","listItems","prevItem","newItems","forEach","withoutUnnecessarySeparators","isListItem","active","isActive","itemClassName","classList","_defineProperty","obj","configurable","writable","join","Group","nameSingular","namePlural","color","isHidden","ADMINISTRATOR_ID","GUEST_ID","MEMBER_ID","Modal","alert","dismissible","isDismissible","hide","onsubmit","onready","first","focus","select","onhide","modal","close","loaded","redraw","onerror","error","status","errors","pointer","Dropdown","buttonClassName","menuClassName","label","caretIcon","showing","getButton","getMenu","isInitialized","on","onshow","$menu","isRight","hasClass","removeClass","toggleClass","offset","top","height","window","scrollTop","left","width","scrollLeft","data-toggle","__assign","defaults","lines","radius","scale","corners","fadeColor","opacity","rotate","direction","speed","trail","fps","zIndex","shadow","position","Spinner","opts","spin","animator","getNow","lastFrameTime","_this","stop","el","document","createElement","setAttribute","css","insertBefore","firstChild","requestAnimationFrame","performance","now","callback","setTimeout","state","animate","msSinceLastFrame","roundsPerSecond","time","Math","floor","childNodes","line","getLineOpacity","style","toString","animateId","borderRadius","round","shadows","boxShadow","regex","_i","_a","split","matches","match","x","y","xUnits","yUnits","prefix","end","parseBoxShadow","degrees","backgroundLine","background","getColor","transformOrigin","normalizeShadow","appendChild","drawLines","cancelAnimationFrame","clearTimeout","parentNode","removeChild","diff","opacityPercent","vendor","prop","prefixed","charAt","toUpperCase","idx","normalized","shadows_1","xy","convertOffset","radians","PI","sin","cos","trust","avatar","user","hasTitle","username","displayName","avatarUrl","src","Alert","controls","ondismiss","dismissControl","concat","translator","trans","computed","dependentKeys","computedValue","keys","compute","dependentValues","recompute","Page","previous","current","PageState","drawer","bodyClass","context","addClass","LinkButton","route","tag","href","FieldSet","humanTime","moment","isAfter","year","format","fromNow","Badge","tooltip","classes","classNames","filter","g","Function","e","_assertThisInitialized","self","ReferenceError","truncate","string","start","substring","slug","toLowerCase","getPlainContent","html","dom","removeSelectors","text","trim","ucfirst","substr","SelectDropdown","activeChild","child","defaultLabel","GroupBadge","group","backgroundColor","highlight","phrase","regexp","RegExp","highlighted","max","search","Switch","getDisplay","Checkbox","later","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","ScrollListener","ticking","loop","update","pageYOffset","addEventListener","removeEventListener","extend","original","override","newMethod","User","email","isEmailConfirmed","password","preferences","groups","joinTime","lastSeenAt","markedAllAsReadAt","unreadNotificationCount","newNotificationCount","discussionCount","commentCount","canEdit","canDelete","avatarColor","calculateAvatarColor","stringToColor","isOnline","subtract","toDate","badges","image","Image","onload","colorThief","ColorThief","crossOrigin","savePreferences","newPreferences","SubtreeRetainer","callbacks","needsRebuild","result","check","invalidate","mo","datetime","full","ago","humanTimeUtil","pubdate","data-humantime","Discussion","createdAt","firstPost","lastPostedAt","lastPostedUser","lastPost","lastPostNumber","replyCount","posts","mostRelevantPost","lastReadAt","lastReadPostNumber","isUnread","unreadCount","isRead","session","hiddenAt","hiddenUser","canReply","canRename","canHide","removePost","some","splice","min","postIds","link","checked","onchange","withAttr","RequestError","responseText","xhr","Navigation","history","pane","onmouseenter","show","onmouseleave","canGoBack","getBackButton","getPaneButton","getDrawerButton","getPrevious","backUrl","shiftKey","ctrlKey","metaKey","which","preventDefault","back","pinned","togglePinned","stopPropagation","Select","A","B","every","set","patchMithril","global","comp","isArray","node","bidi","startComputation","endComputation","Placeholder","ModalManager","clear","hideTimeout","backdrop","keyboard","AlertManager","components","dismiss","index","indexOf","RequestErrorModal","statusText","formattedError","json","Translator","translations","locale","addTranslations","parameters","translation","transChoice","number","parseInt","pluralize","input","hydrated","open","part","shift","unshift","sPluralRegex","cPluralRegex","iPluralRegex","standardRules","explicitRules","test","rule","leftNumber","convertNumber","rightNumber","pluralPosition","Number","NEGATIVE_INFINITY","POSITIVE_INFINITY","num","charCodeAt","rgb","h","v","f","q","hsvToRgb","Store","models","included","pushObject","createRecord","query","getBy","all","records","Session","csrfToken","login","logout","location","Drawer","click","isOpen","$backdrop","appendTo","mapRoutes","routes","basePath","routeName","path","updateHumanTimes","each","$this","attr","setInterval","Forum","Post","discussion","contentType","contentHtml","contentPlain","editedAt","editedUser","isEdited","Notification","fromUser","subject","array","values","freeSelf","objectProto","nativeObjectToString","symToStringTag","isOwn","unmasked","propertyIsEnumerable","spreadableSymbol","isConcatSpreadable","baseFlatten","depth","predicate","isStrict","Application","forums","users","discussions","notifications","load","boot","initializers","initializer","resources","userId","mount","bootExtensions","extensions","extension","flattenDeep","getElementById","alerts","$app","liveHumanTimes","preloadedApiDocument","apiDocument","results","setTitle","updateTitle","setTitleCount","count","titleCount","originalOptions","setRequestHeader","deserialize","errorHandler","getResponseHeader","requestError","detail","reduce","isDebug","decodeURI","showDebug","console","groupEnd","reject","params","queryString","buildQueryString","formatNumber","anchorScroll","$window","relativeScroll","handlers","getHandlers","event","trigger","handler","one","wrapper","off","SplitDropdown","getFirstChild","buttonProps","abbreviateNumber","userOnline","fullTime","webpackPolyfill","deprecate","paths","factory","version","hasOwn","isFunction","isObject","isString","noop","$document","$location","$requestAnimationFrame","$cancelAnimationFrame","voidElements","AREA","BASE","BR","COL","COMMAND","EMBED","HR","IMG","INPUT","KEYGEN","LINK","META","PARAM","SOURCE","TRACK","WBR","parseTagAttrs","cell","parser","exec","attrValue","getVirtualChildren","hasAttrs","assignAttrs","classAttr","attrName","pairs","parameterize","list","forKeys","insertNode","parentElement","deps","mock","initialize","diffKeys","cached","existing","keysDiffer","cachedCell","action","from","nodes","actions","changes","sortChanges","newCached","change","dummy","changeElement","maybeChanged","handleKeysDiffer","maybeRecreateObject","dataAttrKeys","strategy","configContext","isDifferentEnough","controllers","pendingRequests","reattachNodes","editable","parentTag","activeElement","$trusted","injectHTML","innerHTML","nodeType","nodeValue","createTextNode","injectTextNode","handleTextNode","shouldReattach","valueOf","intact","nodeName","handleNonexistentNodes","getSubArrayCount","buildArray","namespace","configs","flatten","subArrayCount","shouldMaintainIdentities","guid","buildArrayKeys","cacheCount","len","build","_","diffArray","reconstructCached","views","$old","unloadCachedControllers","unloaders","forcing","checkView","cachedControllers","controllerIndex","getController","u","updateLists","buildObject","markViews","hasKeys","isNew","xmlns","getObjectNamespace","setAttributes","constructAttrs","is","createElementNS","constructNode","contenteditable","constructChildren","buildUpdatedNode","scheduleConfigsToBeCalled","parentCache","parentIndex","dataToString","makeCache","shouldUseSetAttribute","form","setSingleAttr","dataAttr","cachedAttr","endFirstComputation","copyStyleAttrs","setAttributeNS","isContentEditable","trySetAttr","cachedAttrs","message","dataAttrs","unload","appendTextFragment","createRange","createContextualFragment","insertAdjacentHTML","replaceScriptNodes","tagName","replaceChild","scriptEl","buildExecutableNode","nextSibling","isElement","placeholder","documentNode","documentElement","nodeCache","cellCache","getCellCacheKey","root","forceRecreation","isDocumentRoot","reset","String","Promise","propify","toJSON","gettersetter","topComponent","currentRoute","previousRoute","roots","lastRedrawId","lastRedrawCallTime","computePreRedrawHook","computePostRedrawHook","ctrl","currentArgs","removeRootElement","isPrevented","unloader","currentComponent","checkPrevented","redrawing","force","withAttrCallback","callbackThis","currentTarget","getAttribute","routeParams","modes","pathname","hash","redirect","isDefaultRoute","normalizeRoute","routeByValue","router","queryStart","parseQueryString","matcher","decodeURIComponent","routeUnobtrusive","returnValue","srcElement","setScroll","scrollTo","duplicates","str","encodeURIComponent","pair","cacheKey","initialValue","arg1","arg2","listener","attachEvent","base","detachEvent","queryIndex","currentPath","querystring","replaceHistory","pushState","err","param","Deferred","onSuccess","onFailure","promiseValue","next","finish","thennable","success","failure","notThennable","fire","TypeError","identity","sync","outstanding","synchronizer","pos","resolved","arg","serialize","dataType","jsonp","token","parameterizeUrl","bindData","ev","unwrapSuccess","res","unwrapError","callbackKey","callbackName","getTime","random","script","resp","body","handleJsonp","XMLHttpRequest","onreadystatechange","readyState","headers","header","maybeXhr","FormData","send","createXhr","ajax","Routes","hasOnes","hasManys","PostTypes","postComponents","freeGlobal","evented","Parent","Mixed","mixins","humanTimeHelper","second","third","w","noGlobal","arr","getProto","getPrototypeOf","class2type","fnToString","ObjectFunctionString","support","isWindow","preservedScriptAttributes","nonce","noModule","DOMEval","code","doc","val","head","toType","jQuery","fn","rtrim","isArrayLike","jquery","pushStack","elems","ret","prevObject","elem","eq","last","j","copy","copyIsArray","clone","deep","isPlainObject","expando","isReady","msg","proto","Ctor","isEmptyObject","globalEval","makeArray","inArray","grep","invert","callbackExpect","iterator","Sizzle","Expr","getText","isXML","tokenize","compile","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","pop","push_native","booleans","whitespace","identifier","pseudos","rwhitespace","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escaped","escapedWhitespace","high","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","unloadHandler","inDisabledFieldset","addCombinator","dir","els","seed","nid","newSelector","newContext","ownerDocument","getElementsByTagName","getElementsByClassName","qsa","toSelector","testContext","querySelectorAll","qsaError","removeAttribute","cache","cacheLength","markFunction","assert","addHandle","attrHandle","siblingCheck","cur","sourceIndex","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespaceURI","hasCompare","subWindow","defaultView","createComment","getElementsByName","attrId","getAttributeNode","tmp","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","expr","elements","specified","escape","sel","uniqueSort","detectDuplicates","sortStable","textContent","selectors","createPseudo","relative","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","what","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","parent","useCache","lastChild","uniqueID","pseudo","setFilters","matched","unmatched","lang","elemLang","hasFocus","tabIndex","selected","selectedIndex","radio","checkbox","file","submit","tokens","combinator","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","setMatchers","elementMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","matcherFromGroupMatchers","compiled","defaultValue","unique","isXMLDoc","escapeSelector","until","siblings","rneedsContext","needsContext","rsingleTag","winnow","qualifier","not","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","contents","prev","sibling","targets","closest","prevAll","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","reverse","rnothtmlwhite","Identity","Thrower","ex","adoptValue","noValue","fail","Callbacks","flag","createOptions","firing","memory","fired","locked","queue","firingIndex","once","stopOnFalse","empty","disable","lock","fireWith","func","tuples","always","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","special","that","mightThrow","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","warn","readyException","readyList","completed","catch","readyWait","wait","doScroll","access","chainable","emptyGet","raw","bulk","rmsPrefix","rdashAlpha","fcamelCase","letter","camelCase","acceptData","owner","Data","uid","hasData","dataPriv","dataUser","rbrace","rmultiDash","getData","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","setter","clearQueue","defer","pnum","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","display","swap","old","adjustCSS","valueParts","tween","adjusted","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","showHide","toggle","rcheckableType","rtagName","rscriptType","wrapMap","option","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","optgroup","tbody","tfoot","colgroup","caption","th","div","buildFragment","scripts","selection","ignored","wrap","attached","fragment","createDocumentFragment","htmlPrefilter","checkClone","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","safeActiveElement","types","origFn","leverageNative","notAsync","saved","isTrigger","delegateType","stopImmediatePropagation","Event","handleObjIn","eventHandle","events","handleObj","namespaces","origType","elemData","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","button","addProp","hook","originalEvent","noBubble","beforeunload","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","isSimulated","altKey","bubbles","cancelable","changedTouches","eventPhase","pageX","pageY","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rxhtmlTag","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","pdataOld","pdataCur","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","valueIsFunction","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","before","after","replaceWith","prependTo","insertAfter","replaceAll","insert","rnumnonpx","getStyles","opener","getComputedStyle","rboxStyle","curCSS","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","scrollboxSizeVal","offsetWidth","measure","parseFloat","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","margin","padding","border","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","step","fx","linear","swing","fxNow","inProgress","rfxtypes","rrun","schedule","hidden","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","specialEasing","originalProperties","gotoEnd","propFilter","complete","timer","anim","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","opt","speeds","fadeTo","to","optall","doAnimation","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","timeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","bool","attrNames","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","curValue","clazz","finalValue","stateVal","isValidValue","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","valueOrFunction","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","lastModified","etag","isLocal","protocol","processData","async","accepts","responseFields","converters","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","overrideMimeType","mimeType","abort","finalText","crossDomain","host","hasContent","ifModified","beforeSend","nativeStatusText","responses","isSuccess","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","xhrFields","onabort","ontimeout","responseType","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonpCallback","originalSettings","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","animated","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageXOffset","offsetParent","parentOffset","Height","Width","defaultExtra","funcName","hover","fnOver","fnOut","unbind","delegate","undelegate","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","_jQuery","_$","noConflict","hookCallback","isUndefined","isNumber","isDate","hasOwnProp","createUTC","strict","createLocalOrUTC","utc","getParsingFlags","_pf","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","meridiem","rfc2822","weekdayMismatch","isValid","_isValid","flags","parsedParts","isNowValid","_d","invalidWeekday","_strict","bigHour","isFrozen","createInvalid","NaN","fun","momentProperties","copyConfig","_isAMomentObject","_f","_l","_tzm","_isUTC","_offset","_locale","updateInProgress","Moment","updateOffset","isMoment","absFloor","toInt","argumentForCoercion","coercedNumber","compareArrays","array1","array2","dontConvert","lengthDiff","abs","diffs","suppressDeprecationWarnings","firstTime","deprecationHandler","deprecations","deprecateSimple","mergeConfigs","parentConfig","childConfig","Locale","aliases","addUnitAlias","shorthand","lowerCase","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","priorities","addUnitPriority","zeroFill","targetLength","forceSign","absNumber","zerosToFill","pow","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","padded","ordinal","localeData","formatMoment","expandFormat","mom","makeFormatFunction","invalidDate","replaceLongDateFormatTokens","longDateFormat","lastIndex","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchWord","regexes","addRegexToken","strictRegex","getParseRegexForToken","regexEscape","p1","p2","p3","p4","addParseToken","addWeekParseToken","_w","addTimeToArrayFromToken","daysInYear","isLeapYear","parseTwoDigitYear","getSetYear","makeGetSet","keepTime","set$1","month","date","daysInMonth","modMonth","monthsShort","months","monthsShortRegex","monthsRegex","monthsParse","MONTHS_IN_FORMAT","defaultLocaleMonths","defaultLocaleMonthsShort","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","setMonth","dayOfMonth","getSetMonth","defaultMonthsShortRegex","defaultMonthsRegex","computeMonthsParse","cmpLenRev","shortPieces","longPieces","mixedPieces","_monthsRegex","_monthsShortRegex","_monthsStrictRegex","_monthsShortStrictRegex","createDate","M","ms","getFullYear","setFullYear","createUTCDate","UTC","getUTCFullYear","setUTCFullYear","firstWeekOffset","dow","doy","fwd","getUTCDay","dayOfYearFromWeeks","week","weekday","resYear","resDayOfYear","dayOfYear","weekOfYear","resWeek","weekOffset","weeksInYear","weekOffsetNext","weekdaysMin","weekdaysShort","weekdays","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","weekdaysParse","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","day","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","computeWeekdaysParse","minp","shortp","longp","minPieces","_weekdaysRegex","_weekdaysShortRegex","_weekdaysMinRegex","_weekdaysStrictRegex","_weekdaysShortStrictRegex","_weekdaysMinStrictRegex","hFormat","hours","lowercase","minutes","matchMeridiem","_meridiemParse","seconds","kInput","_isPm","isPM","_meridiem","pos1","pos2","globalLocale","getSetHour","baseConfig","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","LTS","LT","L","LL","LLL","LLLL","dayOfMonthOrdinalParse","relativeTime","future","past","ss","mm","hh","dd","MM","yy","meridiemParse","locales","localeFamilies","normalizeLocale","loadLocale","oldLocale","_abbr","getSetGlobalLocale","getLocale","defineLocale","abbr","_config","parentLocale","names","chooseLocale","checkOverflow","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","configFromArray","currentDate","expectedWeekday","yearToUse","nowValue","_useUTC","getUTCMonth","getUTCDate","getMonth","getDate","currentDateArray","weekYear","weekdayOverflow","GG","W","E","createLocal","_week","curWeek","gg","_dayOfYear","dayOfYearFromWeekInfo","_nextDay","getDay","setUTCMinutes","getUTCMinutes","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","configFromISO","allowTime","dateFormat","timeFormat","tzFormat","configFromStringAndFormat","untruncateYear","yearStr","obsOffsets","UT","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","configFromRFC2822","monthStr","dayStr","hourStr","minuteStr","secondStr","parsedArray","weekdayStr","parsedInput","checkWeekday","obsOffset","militaryOffset","numOffset","hm","calculateOffset","ISO_8601","RFC_2822","skipped","stringLength","totalParsedInputLength","hour","isPm","meridiemHour","meridiemFixWrap","prepareConfig","preparse","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromStringAndArray","createFromInputFallback","configFromString","minute","millisecond","configFromObject","configFromInput","isUTC","getOwnPropertyNames","k","isObjectEmpty","prototypeMin","other","prototypeMax","pickBy","moments","ordering","Duration","years","quarters","quarter","weeks","days","milliseconds","unitHasDecimal","isDurationValid","_milliseconds","_days","_months","_bubble","isDuration","absRound","separator","utcOffset","sign","offsetFromString","chunkOffset","cloneWithOffset","setTime","local","getDateOffset","getTimezoneOffset","isUtc","aspNetRegex","isoRegex","createDuration","diffRes","parseIso","isBefore","positiveMomentsDifference","inp","createAdder","period","addSubtract","isAdding","invalid","monthDiff","wholeMonthDiff","anchor","newLocaleData","defaultFormat","defaultFormatUtc","addWeekYearFormatToken","getSetWeekYearHelper","weeksTarget","setWeekAll","dayOfYearData","isoWeekYear","_dayOfMonthOrdinalParse","_ordinalParse","_dayOfMonthOrdinalParseLenient","getSetDayOfMonth","getSetMinute","getSetSecond","parseMs","getSetMillisecond","preParsePostFormat","formats","sod","startOf","calendarFormat","asFloat","zoneDelta","endOf","inputString","postformat","withoutSuffix","humanize","toNow","invalidAt","localInput","isBetween","inclusivity","isSame","inputMs","isSameOrAfter","isSameOrBefore","parsingFlags","prioritized","unitsObj","getPrioritizedUnits","isoWeekday","toObject","toISOString","keepOffset","zone","unix","creationData","isoWeek","isoWeeks","weekInfo","isoWeeksInYear","parseWeekday","parseIsoWeekday","keepLocalTime","keepMinutes","localAdjust","_changeInProgress","parseZone","tZone","hasAlignedHourOffset","isDST","isUtcOffset","zoneAbbr","zoneName","dates","isDSTShifted","_isDSTShifted","proto$1","get$1","field","listMonthsImpl","out","listWeekdaysImpl","localeSorted","_calendar","_longDateFormat","formatUpper","_invalidDate","_ordinal","isFuture","_relativeTime","pastFuture","isFormat","_monthsShort","_monthsParseExact","firstDayOfYear","firstDayOfWeek","_weekdays","_weekdaysMin","_weekdaysShort","_weekdaysParseExact","_fullWeekdaysParse","isLower","langData","mathAbs","addSubtract$1","absCeil","daysToMonths","monthsToDays","makeAs","alias","as","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","makeGetter","thresholds","substituteTimeAgo","abs$1","toISOString$1","Y","D","toFixed","total","totalSign","ymSign","daysSign","hmsSign","proto$2","monthsFromDays","withSuffix","posNegDuration","relativeTime$1","toIsoString","updateLocale","tmpLocale","relativeTimeRounding","roundingFunction","relativeTimeThreshold","threshold","limit","myMoment","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","DATE","TIME","TIME_SECONDS","TIME_MS","WEEK","MONTH","multi","selectedOptions","oninput","Affix","DEFAULTS","$target","checkPosition","checkPositionWithEventLoop","affixed","unpin","pinnedOffset","Plugin","VERSION","RESET","getState","scrollHeight","offsetTop","offsetBottom","targetHeight","initializing","colliderTop","getPinnedOffset","bottom","affix","affixType","Constructor","$spy","getParent","$parent","clearMenus","keydown","$items","dropdown","$body","$dialog","isShown","originalBodyPad","scrollbarWidth","ignoreBackdropClick","fixedContent","remote","_relatedTarget","TRANSITION_DURATION","BACKDROP_TRANSITION_DURATION","checkScrollbar","setScrollbar","resize","transition","adjustDialog","enforceFocus","emulateTransitionEnd","hideModal","handleUpdate","resetAdjustments","resetScrollbar","removeBackdrop","doAnimate","callbackRemove","modalIsOverflowing","clientHeight","paddingLeft","bodyIsOverflowing","paddingRight","fullWindowWidth","innerWidth","documentElementRect","clientWidth","measureScrollbar","bodyPad","actualPadding","calculatedPadding","scrollDiv","showEvent","DISALLOWED_ATTRIBUTES","uriAttrs","DefaultWhitelist","area","br","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","pre","small","span","sub","sup","strong","ul","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","allowedAttributeList","Boolean","regExp","sanitizeHtml","unsafeHtml","whiteList","sanitizeFn","createdDocument","whitelistKeys","elName","attributeList","whitelistedAttributes","len2","Tooltip","enabled","hoverState","inState","placement","template","viewport","sanitize","getOptions","$viewport","triggers","eventIn","eventOut","enter","leave","_options","fixTitle","getDefaults","dataAttributes","getDelegateOptions","tip","isInStateTrue","inDom","$tip","tipId","getUID","setContent","autoToken","autoPlace","getPosition","actualWidth","actualHeight","orgPlacement","viewportDim","calculatedOffset","getCalculatedOffset","applyPlacement","prevHoverState","marginTop","getViewportAdjustedDelta","isVertical","arrowDelta","arrowOffsetPosition","replaceArrow","arrow","getTitle","$e","isBody","elRect","isSvg","SVGElement","elOffset","scroll","outerDims","viewportPadding","viewportDimensions","topEdgeOffset","bottomEdgeOffset","leftEdgeOffset","rightEdgeOffset","$arrow","enable","toggleEnabled","destroy","called","$el","transEndEventNames","WebkitTransition","MozTransition","OTransition","transitionEnd","bsTransitionEnd","keyHandler","origHandler","hotkeys","filterInputAcceptingElements","textInputTypes","filterContentEditable","filterTextInputs","textAcceptingInputTypes","specialKeys","character","modif","possible","specialKey","shiftNums","8","9","10","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","45","46","59","61","96","97","98","99","100","101","102","103","104","105","106","107","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","144","145","173","186","187","188","189","190","191","192","219","220","221","222","punycode","maxInt","regexPunycode","regexNonASCII","regexSeparators","stringFromCharCode","RangeError","mapDomain","ucs2decode","counter","ucs2encode","digitToBasic","digit","adapt","numPoints","baseMinusTMin","decode","basic","oldi","baseMinusT","codePoint","inputLength","bias","lastIndexOf","encode","handledCPCount","basicLength","handledCPCountPlusOne","qMinusT","CanvasImage","canvas","getContext","drawImage","clearRect","putImageData","getPixelCount","getImageData","removeCanvas","getPalette","MMCQ","quantize","palette","pv","naturalOrder","sum","peek","debug","r1","r2","g1","g2","b1","b2","histo","vboxes","vbox","volume","_volume","_count_set","_count","avg","_avg","gval","bval","nearest","sqrt","forcebw","History","defaultRoute","getCurrent","secondTop","home","Pane","pinnedKey","localStorage","getItem","setItem","TextEditor","configTextarea","controlItems","toolbarItems","submitLabel","preview","elm","setValue","setSelectionRange","$textarea","getSelectionRange","selectionStart","selectionEnd","insertAtCursor","textarea","dispatchEvent","CustomEvent","ComposerBody","originalContent","editor","headerItems","preventExit","confirmExit","minimizeComposerIfFullScreen","composer","isFullScreen","minimize","ReplyComposer","post","viewingDiscussion","stream","goToNumber","viewButton","DiscussionHero","LoadingPost","ForgotPasswordModal","LogInButtons","SignUpModal","footer","isProvided","provided","fields","logIn","identification","LogInModal","submitData","reload","remember","forgotPassword","signUp","RenameDiscussionModal","currentTitle","newTitle","section","userControls","DiscussionPage","replyAction","moderationControls","renameAction","destructiveControls","restoreAction","deleteAction","hideAction","goToLast","forceRefresh","composingReplyTo","confirm","removeDiscussion","ReplyPlaceholder","configPreview","DiscussionControls","updateInterval","anchorToBottom","s9e","TextFormatter","clearInterval","PostStream","paused","scrollListener","onscroll","loadPageTimeouts","pagesLoading","includedPosts","noAnimation","flashItem","loadNearNumber","scrollToNumber","unpause","goToIndex","backwards","loadNearIndex","scrollToIndex","goToFirst","viewingEnd","visibleEnd","loadRange","visibleStart","sanitizeIndex","loadCount","lastTime","fadedIn","PostComponent","dt","PostLoading","loadNext","calculatePositionTimeout","getMarginTop","viewportHeight","viewportTop","$item","loadPrevious","outerHeight","calculatePosition","twoPagesAway","loadPage","anchorIndex","loadIds","page","near","startNumber","endNumber","scrollToItem","$container","itemTop","itemBottom","scrollBottom","computedHeight","PostStreamScrubber","description","streamWasUnpaused","unreadPercent","viewing","newStyle","oldStyle","renderScrollbar","visibleTop","visiblePost","ondestroy","onresize","cursor","dragging","mouseStart","indexStart","onmousedown","onmousemove","onmouseup","percentPerPost","$scrubber","heights","$part","minPercentVisible","percentPerVisiblePost","scrubber","scrollbar","deltaIndex","newIndex","intIndex","$scrollbar","offsetPercent","offsetIndex","TerminalPost","PostPreview","excerpt","slidable","$underneathLeft","$underneathRight","startX","startY","couldBeSliding","isSliding","animatePos","newPos","newX","newY","$underneath","side","activate","DiscussionListItem","showUnread","showRepliesCount","jumpTo","highlightRegExp","markAsRead","infoItems","slidableInstance","idParam","showFirstPost","DiscussionList","getParams","isLoading","moreResults","loadMore","isSearchResults","data-id","refresh","hasDiscussions","configPane","sidebarItems","preloadedDiscussion","requestParams","discussionId","record","positionChanged","$list","hotEdge","$discussion","listTop","listBottom","discussionTop","discussionBottom","replaceState","HeaderPrimary","SessionDropdown","NotificationList","pages","getNotificationPages","markAllAsRead","notification","NotificationComponent","notificationComponents","$notifications","$scrollParent","scrollHandler","contentTop","contentHeight","hasMoreResults","NotificationsDropdown","newNotifications","getNewCount","unread","getUnreadCount","menuClick","goToRoute","KeyboardNavigatable","whenCallback","onUp","onDown","onSelect","onCancel","onRemove","bindTo","navigate","keyCallback","DiscussionsSearchSource","include","data-index","UsersSearchResults","localeCompare","Search","sources","loadingSources","currentSearch","getInitialSearch","sourceItems","getValue","focused","onfocus","onblur","setIndex","getCurrentNumericIndex","selectableItems","$input","navigator","selectResult","searchTimeout","isCached","UsersSearchSource","$dropdown","fixedIndex","dropdownScroll","dropdownTop","dropdownBottom","HeaderSecondary","cookie","ComposerButton","Composer","PositionEnum","HIDDEN","normal","NORMAL","minimized","MINIMIZED","fullScreen","FULLSCREEN","showIfMinimized","configHandle","updateHeight","initializeHeight","onbeforeunload","mousedown","heightStart","deltaPixels","changeHeight","updateBodyPadding","$flexible","headerHeight","paddingBottom","footerHeight","animateToPosition","oldPosition","$composer","oldHeight","newHeight","showBackdrop","hideBackdrop","exitFullScreen","defaultHeight","minimumHeight","maximumHeight","DiscussionRenamedNotification","postNumber","EditPostComposer","editedContent","editAction","controlsOpen","PostControls","actionItems","footerItems","$actions","$controls","EditUserModal","setPassword","affixSidebar","$sidebar","$header","$footer","$affixElement","UserPage","UserCard","controlsButtonClassName","loadUser","lowercaseUsername","navItems","showDeletionAlert","AvatarEditor","isDraggedOver","quickUpload","ondragover","enableDragover","ondragenter","ondragleave","disableDragover","ondragend","ondrop","dropUpload","openPicker","upload","dataTransfer","files","UserControls","online","PostUser","card","showCard","hideCard","PostMeta","permalink","getPermalink","touch","ipAddress","origin","PostEdited","shouldUpdateTooltip","oldEditedInfo","editedInfo","CommentPost","revealContent","isEditing","eval","editing","updatePreview","toggleContent","EventPost","usernameHelper","descriptionData","class","descriptionKey","DiscussionRenamedPost","renamed","oldName","oldTitle","new","WelcomeHero","DiscussionComposer","titlePlaceholder","onkeydown","IndexPage","lastDiscussion","refreshParams","hero","viewItems","oldHeroHeight","heroHeight","indexTop","indexBottom","canStartDiscussion","newDiscussionAction","stickyParams","sortMap","sortOptions","changeSort","PostsUserPage","loadLimit","loadResults","parseResults","DiscussionsUserPage","NotificationGrid","methods","notificationMethods","notificationTypes","toggleMethod","toggleType","preferenceKey","ChangePasswordModal","ChangeEmailModal","SettingsPage","settingsItems","accountItems","notificationsItems","privacyItems","preferenceSaver","discloseOnline","discloseOnlineLoading","NotificationsPage","alertEmailConfirmation","resendButton","ContainedAlert","NotificationListState","notificationPages","links","GlobalSearchState","cachedSearches","searchRoute","clearInitialSearch","providesInitialSearch","DiscussionListState","forumApp","relevance","latest","newest","oldest","newParams","preloadedDiscussions","addDiscussion","ForumApplication","discussionRenamed","comment","discussionList","defaultAction","authenticationComplete","loggedIn","LogInButton","TextEditorButton","SearchSource","compat"],"mappings":"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","file":"forum.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 91);\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","/**\n * The `Model` class represents a local data resource. It provides methods to\n * persist changes via the API.\n *\n * @abstract\n */\nexport default class Model {\n /**\n * @param {Object} data A resource object from the API.\n * @param {Store} store The data store that this model should be persisted to.\n * @public\n */\n constructor(data = {}, store = null) {\n /**\n * The resource object from the API.\n *\n * @type {Object}\n * @public\n */\n this.data = data;\n\n /**\n * The time at which the model's data was last updated. Watching the value\n * of this property is a fast way to retain/cache a subtree if data hasn't\n * changed.\n *\n * @type {Date}\n * @public\n */\n this.freshness = new Date();\n\n /**\n * Whether or not the resource exists on the server.\n *\n * @type {Boolean}\n * @public\n */\n this.exists = false;\n\n /**\n * The data store that this resource should be persisted to.\n *\n * @type {Store}\n * @protected\n */\n this.store = store;\n }\n\n /**\n * Get the model's ID.\n *\n * @return {Integer}\n * @public\n * @final\n */\n id() {\n return this.data.id;\n }\n\n /**\n * Get one of the model's attributes.\n *\n * @param {String} attribute\n * @return {*}\n * @public\n * @final\n */\n attribute(attribute) {\n return this.data.attributes[attribute];\n }\n\n /**\n * Merge new data into this model locally.\n *\n * @param {Object} data A resource object to merge into this model\n * @public\n */\n pushData(data) {\n // Since most of the top-level items in a resource object are objects\n // (e.g. relationships, attributes), we'll need to check and perform the\n // merge at the second level if that's the case.\n for (const key in data) {\n if (typeof data[key] === 'object') {\n this.data[key] = this.data[key] || {};\n\n // For every item in a second-level object, we want to check if we've\n // been handed a Model instance. If so, we will convert it to a\n // relationship data object.\n for (const innerKey in data[key]) {\n if (data[key][innerKey] instanceof Model) {\n data[key][innerKey] = { data: Model.getIdentifier(data[key][innerKey]) };\n }\n this.data[key][innerKey] = data[key][innerKey];\n }\n } else {\n this.data[key] = data[key];\n }\n }\n\n // Now that we've updated the data, we can say that the model is fresh.\n // This is an easy way to invalidate retained subtrees etc.\n this.freshness = new Date();\n }\n\n /**\n * Merge new attributes into this model locally.\n *\n * @param {Object} attributes The attributes to merge.\n * @public\n */\n pushAttributes(attributes) {\n this.pushData({ attributes });\n }\n\n /**\n * Merge new attributes into this model, both locally and with persistence.\n *\n * @param {Object} attributes The attributes to save. If a 'relationships' key\n * exists, it will be extracted and relationships will also be saved.\n * @param {Object} [options]\n * @return {Promise}\n * @public\n */\n save(attributes, options = {}) {\n const data = {\n type: this.data.type,\n id: this.data.id,\n attributes,\n };\n\n // If a 'relationships' key exists, extract it from the attributes hash and\n // set it on the top-level data object instead. We will be sending this data\n // object to the API for persistence.\n if (attributes.relationships) {\n data.relationships = {};\n\n for (const key in attributes.relationships) {\n const model = attributes.relationships[key];\n\n data.relationships[key] = {\n data: model instanceof Array ? model.map(Model.getIdentifier) : Model.getIdentifier(model),\n };\n }\n\n delete attributes.relationships;\n }\n\n // Before we update the model's data, we should make a copy of the model's\n // old data so that we can revert back to it if something goes awry during\n // persistence.\n const oldData = this.copyData();\n\n this.pushData(data);\n\n const request = { data };\n if (options.meta) request.meta = options.meta;\n\n return app\n .request(\n Object.assign(\n {\n method: this.exists ? 'PATCH' : 'POST',\n url: app.forum.attribute('apiUrl') + this.apiEndpoint(),\n data: request,\n },\n options\n )\n )\n .then(\n // If everything went well, we'll make sure the store knows that this\n // model exists now (if it didn't already), and we'll push the data that\n // the API returned into the store.\n (payload) => {\n this.store.data[payload.data.type] = this.store.data[payload.data.type] || {};\n this.store.data[payload.data.type][payload.data.id] = this;\n return this.store.pushPayload(payload);\n },\n\n // If something went wrong, though... good thing we backed up our model's\n // old data! We'll revert to that and let others handle the error.\n (response) => {\n this.pushData(oldData);\n m.lazyRedraw();\n throw response;\n }\n );\n }\n\n /**\n * Send a request to delete the resource.\n *\n * @param {Object} data Data to send along with the DELETE request.\n * @param {Object} [options]\n * @return {Promise}\n * @public\n */\n delete(data, options = {}) {\n if (!this.exists) return m.deferred().resolve().promise;\n\n return app\n .request(\n Object.assign(\n {\n method: 'DELETE',\n url: app.forum.attribute('apiUrl') + this.apiEndpoint(),\n data,\n },\n options\n )\n )\n .then(() => {\n this.exists = false;\n this.store.remove(this);\n });\n }\n\n /**\n * Construct a path to the API endpoint for this resource.\n *\n * @return {String}\n * @protected\n */\n apiEndpoint() {\n return '/' + this.data.type + (this.exists ? '/' + this.data.id : '');\n }\n\n copyData() {\n return JSON.parse(JSON.stringify(this.data));\n }\n\n /**\n * Generate a function which returns the value of the given attribute.\n *\n * @param {String} name\n * @param {function} [transform] A function to transform the attribute value\n * @return {*}\n * @public\n */\n static attribute(name, transform) {\n return function () {\n const value = this.data.attributes && this.data.attributes[name];\n\n return transform ? transform(value) : value;\n };\n }\n\n /**\n * Generate a function which returns the value of the given has-one\n * relationship.\n *\n * @param {String} name\n * @return {Model|Boolean|undefined} false if no information about the\n * relationship exists; undefined if the relationship exists but the model\n * has not been loaded; or the model if it has been loaded.\n * @public\n */\n static hasOne(name) {\n return function () {\n if (this.data.relationships) {\n const relationship = this.data.relationships[name];\n\n if (relationship) {\n return app.store.getById(relationship.data.type, relationship.data.id);\n }\n }\n\n return false;\n };\n }\n\n /**\n * Generate a function which returns the value of the given has-many\n * relationship.\n *\n * @param {String} name\n * @return {Array|Boolean} false if no information about the relationship\n * exists; an array if it does, containing models if they have been\n * loaded, and undefined for those that have not.\n * @public\n */\n static hasMany(name) {\n return function () {\n if (this.data.relationships) {\n const relationship = this.data.relationships[name];\n\n if (relationship) {\n return relationship.data.map((data) => app.store.getById(data.type, data.id));\n }\n }\n\n return false;\n };\n }\n\n /**\n * Transform the given value into a Date object.\n *\n * @param {String} value\n * @return {Date|null}\n * @public\n */\n static transformDate(value) {\n return value ? new Date(value) : null;\n }\n\n /**\n * Get a resource identifier object for the given model.\n *\n * @param {Model} model\n * @return {Object}\n * @protected\n */\n static getIdentifier(model) {\n return {\n type: model.data.type,\n id: model.data.id,\n };\n }\n}\n","import Component from '../Component';\nimport icon from '../helpers/icon';\nimport extract from '../utils/extract';\nimport extractText from '../utils/extractText';\nimport LoadingIndicator from './LoadingIndicator';\n\n/**\n * The `Button` component defines an element which, when clicked, performs an\n * action. The button may have the following special props:\n *\n * - `icon` The name of the icon class. If specified, the button will be given a\n * 'has-icon' class name.\n * - `disabled` Whether or not the button is disabled. If truthy, the button\n * will be given a 'disabled' class name, and any `onclick` handler will be\n * removed.\n * - `loading` Whether or not the button should be in a disabled loading state.\n *\n * All other props will be assigned as attributes on the button element.\n *\n * Note that a Button has no default class names. This is because a Button can\n * be used to represent any generic clickable control, like a menu item.\n */\nexport default class Button extends Component {\n view() {\n const attrs = Object.assign({}, this.props);\n\n delete attrs.children;\n\n attrs.className = attrs.className || '';\n attrs.type = attrs.type || 'button';\n\n // If a tooltip was provided for buttons without additional content, we also\n // use this tooltip as text for screen readers\n if (attrs.title && !this.props.children) {\n attrs['aria-label'] = attrs.title;\n }\n\n // If nothing else is provided, we use the textual button content as tooltip\n if (!attrs.title && this.props.children) {\n attrs.title = extractText(this.props.children);\n }\n\n const iconName = extract(attrs, 'icon');\n if (iconName) attrs.className += ' hasIcon';\n\n const loading = extract(attrs, 'loading');\n if (attrs.disabled || loading) {\n attrs.className += ' disabled' + (loading ? ' loading' : '');\n delete attrs.onclick;\n }\n\n return <button {...attrs}>{this.getButtonContent()}</button>;\n }\n\n /**\n * Get the template for the button's content.\n *\n * @return {*}\n * @protected\n */\n getButtonContent() {\n const iconName = this.props.icon;\n\n return [\n iconName && iconName !== true ? icon(iconName, { className: 'Button-icon' }) : '',\n this.props.children ? <span className=\"Button-label\">{this.props.children}</span> : '',\n this.props.loading ? LoadingIndicator.component({ size: 'tiny', className: 'LoadingIndicator--inline' }) : '',\n ];\n }\n}\n","/*\n * This file is part of Flarum.\n *\n * (c) Toby Zerner <toby.zerner@gmail.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\n/**\n * The `Component` class defines a user interface 'building block'. A component\n * can generate a virtual DOM to be rendered on each redraw.\n *\n * An instance's virtual DOM can be retrieved directly using the {@link\n * Component#render} method.\n *\n * @example\n * this.myComponentInstance = new MyComponent({foo: 'bar'});\n * return m('div', this.myComponentInstance.render());\n *\n * Alternatively, components can be nested, letting Mithril take care of\n * instance persistence. For this, the static {@link Component.component} method\n * can be used.\n *\n * @example\n * return m('div', MyComponent.component({foo: 'bar'));\n *\n * @see https://lhorie.github.io/mithril/mithril.component.html\n * @abstract\n */\nexport default class Component {\n /**\n * @param {Object} props\n * @param {Array|Object} children\n * @public\n */\n constructor(props = {}, children = null) {\n if (children) props.children = children;\n\n this.constructor.initProps(props);\n\n /**\n * The properties passed into the component.\n *\n * @type {Object}\n */\n this.props = props;\n\n /**\n * The root DOM element for the component.\n *\n * @type DOMElement\n * @public\n */\n this.element = null;\n\n /**\n * Whether or not to retain the component's subtree on redraw.\n *\n * @type {boolean}\n * @public\n */\n this.retain = false;\n\n this.init();\n }\n\n /**\n * Called when the component is constructed.\n *\n * @protected\n */\n init() {}\n\n /**\n * Called when the component is destroyed, i.e. after a redraw where it is no\n * longer a part of the view.\n *\n * @see https://lhorie.github.io/mithril/mithril.component.html#unloading-components\n * @param {Object} e\n * @public\n */\n onunload() {}\n\n /**\n * Get the renderable virtual DOM that represents the component's view.\n *\n * This should NOT be overridden by subclasses. Subclasses wishing to define\n * their virtual DOM should override Component#view instead.\n *\n * @example\n * this.myComponentInstance = new MyComponent({foo: 'bar'});\n * return m('div', this.myComponentInstance.render());\n *\n * @returns {Object}\n * @final\n * @public\n */\n render() {\n const vdom = this.retain ? { subtree: 'retain' } : this.view();\n\n // Override the root element's config attribute with our own function, which\n // will set the component instance's element property to the root DOM\n // element, and then run the component class' config method.\n vdom.attrs = vdom.attrs || {};\n\n const originalConfig = vdom.attrs.config;\n\n vdom.attrs.config = (...args) => {\n this.element = args[0];\n this.config.apply(this, args.slice(1));\n if (originalConfig) originalConfig.apply(this, args);\n };\n\n return vdom;\n }\n\n /**\n * Returns a jQuery object for this component's element. If you pass in a\n * selector string, this method will return a jQuery object, using the current\n * element as its buffer.\n *\n * For example, calling `component.$('li')` will return a jQuery object\n * containing all of the `li` elements inside the DOM element of this\n * component.\n *\n * @param {String} [selector] a jQuery-compatible selector string\n * @returns {jQuery} the jQuery object for the DOM node\n * @final\n * @public\n */\n $(selector) {\n const $element = $(this.element);\n\n return selector ? $element.find(selector) : $element;\n }\n\n /**\n * Called after the component's root element is redrawn. This hook can be used\n * to perform any actions on the DOM, both on the initial draw and any\n * subsequent redraws. See Mithril's documentation for more information.\n *\n * @see https://lhorie.github.io/mithril/mithril.html#the-config-attribute\n * @param {Boolean} isInitialized\n * @param {Object} context\n * @param {Object} vdom\n * @public\n */\n config() {}\n\n /**\n * Get the virtual DOM that represents the component's view.\n *\n * @return {Object} The virtual DOM\n * @protected\n */\n view() {\n throw new Error('Component#view must be implemented by subclass');\n }\n\n /**\n * Get a Mithril component object for this component, preloaded with props.\n *\n * @see https://lhorie.github.io/mithril/mithril.component.html\n * @param {Object} [props] Properties to set on the component\n * @param children\n * @return {Object} The Mithril component object\n * @property {function} controller\n * @property {function} view\n * @property {Object} component The class of this component\n * @property {Object} props The props that were passed to the component\n * @public\n */\n static component(props = {}, children = null) {\n const componentProps = Object.assign({}, props);\n\n if (children) componentProps.children = children;\n\n this.initProps(componentProps);\n\n // Set up a function for Mithril to get the component's view. It will accept\n // the component's controller (which happens to be the component itself, in\n // our case), update its props with the ones supplied, and then render the view.\n const view = (component) => {\n component.props = componentProps;\n return component.render();\n };\n\n // Mithril uses this property on the view function to cache component\n // controllers between redraws, thus persisting component state.\n view.$original = this.prototype.view;\n\n // Our output object consists of a controller constructor + a view function\n // which Mithril will use to instantiate and render the component. We also\n // attach a reference to the props that were passed through and the\n // component's class for reference.\n const output = {\n controller: this.bind(undefined, componentProps),\n view: view,\n props: componentProps,\n component: this,\n };\n\n // If a `key` prop was set, then we'll assume that we want that to actually\n // show up as an attribute on the component object so that Mithril's key\n // algorithm can be applied.\n if (componentProps.key) {\n output.attrs = { key: componentProps.key };\n }\n\n return output;\n }\n\n /**\n * Initialize the component's props.\n *\n * @param {Object} props\n * @public\n */\n static initProps(props) {}\n}\n","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","class Item {\n constructor(content, priority) {\n this.content = content;\n this.priority = priority;\n }\n}\n\n/**\n * The `ItemList` class collects items and then arranges them into an array\n * by priority.\n */\nexport default class ItemList {\n constructor() {\n /**\n * The items in the list.\n *\n * @type {Object}\n * @public\n */\n this.items = {};\n }\n\n /**\n * Check whether the list is empty.\n *\n * @returns {boolean}\n * @public\n */\n isEmpty() {\n for (const i in this.items) {\n if (this.items.hasOwnProperty(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Check whether an item is present in the list.\n *\n * @param key\n * @returns {boolean}\n */\n has(key) {\n return !!this.items[key];\n }\n\n /**\n * Get the content of an item.\n *\n * @param {String} key\n * @return {*}\n * @public\n */\n get(key) {\n return this.items[key].content;\n }\n\n /**\n * Add an item to the list.\n *\n * @param {String} key A unique key for the item.\n * @param {*} content The item's content.\n * @param {Integer} [priority] The priority of the item. Items with a higher\n * priority will be positioned before items with a lower priority.\n * @return {ItemList}\n * @public\n */\n add(key, content, priority = 0) {\n this.items[key] = new Item(content, priority);\n\n return this;\n }\n\n /**\n * Replace an item in the list, only if it is already present.\n *\n * @param {String} key\n * @param {*} [content]\n * @param {Integer} [priority]\n * @return {ItemList}\n * @public\n */\n replace(key, content = null, priority = null) {\n if (this.items[key]) {\n if (content !== null) {\n this.items[key].content = content;\n }\n\n if (priority !== null) {\n this.items[key].priority = priority;\n }\n }\n\n return this;\n }\n\n /**\n * Remove an item from the list.\n *\n * @param {String} key\n * @return {ItemList}\n * @public\n */\n remove(key) {\n delete this.items[key];\n\n return this;\n }\n\n /**\n * Merge another list's items into this one.\n *\n * @param {ItemList} items\n * @return {ItemList}\n * @public\n */\n merge(items) {\n for (const i in items.items) {\n if (items.items.hasOwnProperty(i) && items.items[i] instanceof Item) {\n this.items[i] = items.items[i];\n }\n }\n\n return this;\n }\n\n /**\n * Convert the list into an array of item content arranged by priority. Each\n * item's content will be assigned an `itemName` property equal to the item's\n * unique key.\n *\n * @return {Array}\n * @public\n */\n toArray() {\n const items = [];\n\n for (const i in this.items) {\n if (this.items.hasOwnProperty(i) && this.items[i] instanceof Item) {\n this.items[i].content = Object(this.items[i].content);\n\n this.items[i].content.itemName = i;\n items.push(this.items[i]);\n this.items[i].key = items.length;\n }\n }\n\n return items\n .sort((a, b) => {\n if (a.priority === b.priority) {\n return a.key - b.key;\n } else if (a.priority > b.priority) {\n return -1;\n }\n return 1;\n })\n .map((item) => item.content);\n }\n}\n","/**\n * The `icon` helper displays an icon.\n *\n * @param {String} fontClass The full icon class, prefix and the icon’s name.\n * @param {Object} attrs Any other attributes to apply.\n * @return {Object}\n */\nexport default function icon(fontClass, attrs = {}) {\n attrs.className = 'icon ' + fontClass + ' ' + (attrs.className || '');\n\n return <i {...attrs} />;\n}\n","import Separator from '../components/Separator';\nimport classList from '../utils/classList';\n\nfunction isSeparator(item) {\n return item && item.component === Separator;\n}\n\nfunction withoutUnnecessarySeparators(items) {\n const newItems = [];\n let prevItem;\n\n items.forEach((item, i) => {\n if (!isSeparator(item) || (prevItem && !isSeparator(prevItem) && i !== items.length - 1)) {\n prevItem = item;\n newItems.push(item);\n }\n });\n\n return newItems;\n}\n\n/**\n * The `listItems` helper wraps a collection of components in <li> tags,\n * stripping out any unnecessary `Separator` components.\n *\n * @param {*} items\n * @return {Array}\n */\nexport default function listItems(items) {\n if (!(items instanceof Array)) items = [items];\n\n return withoutUnnecessarySeparators(items).map((item) => {\n const isListItem = item.component && item.component.isListItem;\n const active = item.component && item.component.isActive && item.component.isActive(item.props);\n const className = item.props ? item.props.itemClassName : item.itemClassName;\n\n if (isListItem) {\n item.attrs = item.attrs || {};\n item.attrs.key = item.attrs.key || item.itemName;\n }\n\n return isListItem ? (\n item\n ) : (\n <li className={classList([item.itemName ? 'item-' + item.itemName : '', className, active ? 'active' : ''])} key={item.itemName}>\n {item}\n </li>\n );\n });\n}\n","export default 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 * Extract the text nodes from a virtual element.\n *\n * @param {VirtualElement} vdom\n * @return {String}\n */\nexport default function extractText(vdom) {\n if (vdom instanceof Array) {\n return vdom.map((element) => extractText(element)).join('');\n } else if (typeof vdom === 'object' && vdom !== null) {\n return extractText(vdom.children);\n } else {\n return vdom;\n }\n}\n","/**\n * The `extract` utility deletes a property from an object and returns its\n * value.\n *\n * @param {Object} object The object that owns the property\n * @param {String} property The name of the property to extract\n * @return {*} The value of the property\n */\nexport default function extract(object, property) {\n const value = object[property];\n\n delete object[property];\n\n return value;\n}\n","import Model from '../Model';\n\nclass Group extends Model {}\n\nObject.assign(Group.prototype, {\n nameSingular: Model.attribute('nameSingular'),\n namePlural: Model.attribute('namePlural'),\n color: Model.attribute('color'),\n icon: Model.attribute('icon'),\n isHidden: Model.attribute('isHidden'),\n});\n\nGroup.ADMINISTRATOR_ID = '1';\nGroup.GUEST_ID = '2';\nGroup.MEMBER_ID = '3';\n\nexport default Group;\n","import Component from '../Component';\nimport Alert from './Alert';\nimport Button from './Button';\n\n/**\n * The `Modal` component displays a modal dialog, wrapped in a form. Subclasses\n * should implement the `className`, `title`, and `content` methods.\n *\n * @abstract\n */\nexport default class Modal extends Component {\n init() {\n /**\n * An alert component to show below the header.\n *\n * @type {Alert}\n */\n this.alert = null;\n }\n\n view() {\n if (this.alert) {\n this.alert.props.dismissible = false;\n }\n\n return (\n <div className={'Modal modal-dialog ' + this.className()}>\n <div className=\"Modal-content\">\n {this.isDismissible() ? (\n <div className=\"Modal-close App-backControl\">\n {Button.component({\n icon: 'fas fa-times',\n onclick: this.hide.bind(this),\n className: 'Button Button--icon Button--link',\n })}\n </div>\n ) : (\n ''\n )}\n\n <form onsubmit={this.onsubmit.bind(this)}>\n <div className=\"Modal-header\">\n <h3 className=\"App-titleControl App-titleControl--text\">{this.title()}</h3>\n </div>\n\n {alert ? <div className=\"Modal-alert\">{this.alert}</div> : ''}\n\n {this.content()}\n </form>\n </div>\n </div>\n );\n }\n\n /**\n * Determine whether or not the modal should be dismissible via an 'x' button.\n *\n * @return {Boolean}\n */\n isDismissible() {\n return true;\n }\n\n /**\n * Get the class name to apply to the modal.\n *\n * @return {String}\n * @abstract\n */\n className() {}\n\n /**\n * Get the title of the modal dialog.\n *\n * @return {String}\n * @abstract\n */\n title() {}\n\n /**\n * Get the content of the modal.\n *\n * @return {VirtualElement}\n * @abstract\n */\n content() {}\n\n /**\n * Handle the modal form's submit event.\n *\n * @param {Event} e\n */\n onsubmit() {}\n\n /**\n * Focus on the first input when the modal is ready to be used.\n */\n onready() {\n this.$('form').find('input, select, textarea').first().focus().select();\n }\n\n onhide() {}\n\n /**\n * Hide the modal.\n */\n hide() {\n app.modal.close();\n }\n\n /**\n * Stop loading.\n */\n loaded() {\n this.loading = false;\n m.redraw();\n }\n\n /**\n * Show an alert describing an error returned from the API, and give focus to\n * the first relevant field.\n *\n * @param {RequestError} error\n */\n onerror(error) {\n this.alert = error.alert;\n\n m.redraw();\n\n if (error.status === 422 && error.response.errors) {\n this.$('form [name=' + error.response.errors[0].source.pointer.replace('/data/attributes/', '') + ']').select();\n } else {\n this.onready();\n }\n }\n}\n","import Component from '../Component';\nimport icon from '../helpers/icon';\nimport listItems from '../helpers/listItems';\n\n/**\n * The `Dropdown` component displays a button which, when clicked, shows a\n * dropdown menu beneath it.\n *\n * ### Props\n *\n * - `buttonClassName` A class name to apply to the dropdown toggle button.\n * - `menuClassName` A class name to apply to the dropdown menu.\n * - `icon` The name of an icon to show in the dropdown toggle button.\n * - `caretIcon` The name of an icon to show on the right of the button.\n * - `label` The label of the dropdown toggle button. Defaults to 'Controls'.\n * - `onhide`\n * - `onshow`\n *\n * The children will be displayed as a list inside of the dropdown menu.\n */\nexport default class Dropdown extends Component {\n static initProps(props) {\n super.initProps(props);\n\n props.className = props.className || '';\n props.buttonClassName = props.buttonClassName || '';\n props.menuClassName = props.menuClassName || '';\n props.label = props.label || '';\n props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-caret-down';\n }\n\n init() {\n this.showing = false;\n }\n\n view() {\n const items = this.props.children ? listItems(this.props.children) : [];\n\n return (\n <div className={'ButtonGroup Dropdown dropdown ' + this.props.className + ' itemCount' + items.length + (this.showing ? ' open' : '')}>\n {this.getButton()}\n {this.getMenu(items)}\n </div>\n );\n }\n\n config(isInitialized) {\n if (isInitialized) return;\n\n // When opening the dropdown menu, work out if the menu goes beyond the\n // bottom of the viewport. If it does, we will apply class to make it show\n // above the toggle button instead of below it.\n this.$().on('shown.bs.dropdown', () => {\n this.showing = true;\n\n if (this.props.onshow) {\n this.props.onshow();\n }\n\n m.redraw();\n\n const $menu = this.$('.Dropdown-menu');\n const isRight = $menu.hasClass('Dropdown-menu--right');\n\n $menu.removeClass('Dropdown-menu--top Dropdown-menu--right');\n\n $menu.toggleClass('Dropdown-menu--top', $menu.offset().top + $menu.height() > $(window).scrollTop() + $(window).height());\n\n if ($menu.offset().top < 0) {\n $menu.removeClass('Dropdown-menu--top');\n }\n\n $menu.toggleClass('Dropdown-menu--right', isRight || $menu.offset().left + $menu.width() > $(window).scrollLeft() + $(window).width());\n });\n\n this.$().on('hidden.bs.dropdown', () => {\n this.showing = false;\n\n if (this.props.onhide) {\n this.props.onhide();\n }\n\n m.redraw();\n });\n }\n\n /**\n * Get the template for the button.\n *\n * @return {*}\n * @protected\n */\n getButton() {\n return (\n <button className={'Dropdown-toggle ' + this.props.buttonClassName} data-toggle=\"dropdown\" onclick={this.props.onclick}>\n {this.getButtonContent()}\n </button>\n );\n }\n\n /**\n * Get the template for the button's content.\n *\n * @return {*}\n * @protected\n */\n getButtonContent() {\n return [\n this.props.icon ? icon(this.props.icon, { className: 'Button-icon' }) : '',\n <span className=\"Button-label\">{this.props.label}</span>,\n this.props.caretIcon ? icon(this.props.caretIcon, { className: 'Button-caret' }) : '',\n ];\n }\n\n getMenu(items) {\n return <ul className={'Dropdown-menu dropdown-menu ' + this.props.menuClassName}>{items}</ul>;\n }\n}\n","var __assign = (this && this.__assign) || Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n};\r\nvar defaults = {\r\n lines: 12,\r\n length: 7,\r\n width: 5,\r\n radius: 10,\r\n scale: 1.0,\r\n corners: 1,\r\n color: '#000',\r\n fadeColor: 'transparent',\r\n opacity: 0.25,\r\n rotate: 0,\r\n direction: 1,\r\n speed: 1,\r\n trail: 100,\r\n fps: 20,\r\n zIndex: 2e9,\r\n className: 'spinner',\r\n top: '50%',\r\n left: '50%',\r\n shadow: 'none',\r\n position: 'absolute',\r\n};\r\nvar Spinner = /** @class */ (function () {\r\n function Spinner(opts) {\r\n if (opts === void 0) { opts = {}; }\r\n this.opts = __assign({}, defaults, opts);\r\n }\r\n /**\r\n * Adds the spinner to the given target element. If this instance is already\r\n * spinning, it is automatically removed from its previous target by calling\r\n * stop() internally.\r\n */\r\n Spinner.prototype.spin = function (target) {\r\n var _this = this;\r\n this.stop();\r\n this.el = document.createElement('div');\r\n this.el.className = this.opts.className;\r\n this.el.setAttribute('role', 'progressbar');\r\n css(this.el, {\r\n position: this.opts.position,\r\n width: 0,\r\n zIndex: this.opts.zIndex,\r\n left: this.opts.left,\r\n top: this.opts.top,\r\n transform: \"scale(\" + this.opts.scale + \")\",\r\n });\r\n if (target) {\r\n target.insertBefore(this.el, target.firstChild || null);\r\n }\r\n var animator;\r\n var getNow;\r\n if (typeof requestAnimationFrame !== 'undefined') {\r\n animator = requestAnimationFrame;\r\n getNow = function () { return performance.now(); };\r\n }\r\n else {\r\n // fallback for IE 9\r\n animator = function (callback) { return setTimeout(callback, 1000 / _this.opts.fps); };\r\n getNow = function () { return Date.now(); };\r\n }\r\n var lastFrameTime;\r\n var state = 0; // state is rotation percentage (between 0 and 1)\r\n var animate = function () {\r\n var time = getNow();\r\n if (lastFrameTime === undefined) {\r\n lastFrameTime = time - 1;\r\n }\r\n state += getAdvancePercentage(time - lastFrameTime, _this.opts.speed);\r\n lastFrameTime = time;\r\n if (state > 1) {\r\n state -= Math.floor(state);\r\n }\r\n if (_this.el.childNodes.length === _this.opts.lines) {\r\n for (var line = 0; line < _this.opts.lines; line++) {\r\n var opacity = getLineOpacity(line, state, _this.opts);\r\n _this.el.childNodes[line].childNodes[0].style.opacity = opacity.toString();\r\n }\r\n }\r\n _this.animateId = _this.el ? animator(animate) : undefined;\r\n };\r\n drawLines(this.el, this.opts);\r\n animate();\r\n return this;\r\n };\r\n /**\r\n * Stops and removes the Spinner.\r\n * Stopped spinners may be reused by calling spin() again.\r\n */\r\n Spinner.prototype.stop = function () {\r\n if (this.el) {\r\n if (typeof requestAnimationFrame !== 'undefined') {\r\n cancelAnimationFrame(this.animateId);\r\n }\r\n else {\r\n clearTimeout(this.animateId);\r\n }\r\n if (this.el.parentNode) {\r\n this.el.parentNode.removeChild(this.el);\r\n }\r\n this.el = undefined;\r\n }\r\n return this;\r\n };\r\n return Spinner;\r\n}());\r\nexport { Spinner };\r\nfunction getAdvancePercentage(msSinceLastFrame, roundsPerSecond) {\r\n return msSinceLastFrame / 1000 * roundsPerSecond;\r\n}\r\nfunction getLineOpacity(line, state, opts) {\r\n var linePercent = (line + 1) / opts.lines;\r\n var diff = state - (linePercent * opts.direction);\r\n if (diff < 0 || diff > 1) {\r\n diff += opts.direction;\r\n }\r\n // opacity should start at 1, and approach opacity option as diff reaches trail percentage\r\n var trailPercent = opts.trail / 100;\r\n var opacityPercent = 1 - diff / trailPercent;\r\n if (opacityPercent < 0) {\r\n return opts.opacity;\r\n }\r\n var opacityDiff = 1 - opts.opacity;\r\n return opacityPercent * opacityDiff + opts.opacity;\r\n}\r\n/**\r\n * Tries various vendor prefixes and returns the first supported property.\r\n */\r\nfunction vendor(el, prop) {\r\n if (el.style[prop] !== undefined) {\r\n return prop;\r\n }\r\n // needed for transform properties in IE 9\r\n var prefixed = 'ms' + prop.charAt(0).toUpperCase() + prop.slice(1);\r\n if (el.style[prefixed] !== undefined) {\r\n return prefixed;\r\n }\r\n return '';\r\n}\r\n/**\r\n * Sets multiple style properties at once.\r\n */\r\nfunction css(el, props) {\r\n for (var prop in props) {\r\n el.style[vendor(el, prop) || prop] = props[prop];\r\n }\r\n return el;\r\n}\r\n/**\r\n * Returns the line color from the given string or array.\r\n */\r\nfunction getColor(color, idx) {\r\n return typeof color == 'string' ? color : color[idx % color.length];\r\n}\r\n/**\r\n * Internal method that draws the individual lines.\r\n */\r\nfunction drawLines(el, opts) {\r\n var borderRadius = (Math.round(opts.corners * opts.width * 500) / 1000) + 'px';\r\n var shadow = 'none';\r\n if (opts.shadow === true) {\r\n shadow = '0 2px 4px #000'; // default shadow\r\n }\r\n else if (typeof opts.shadow === 'string') {\r\n shadow = opts.shadow;\r\n }\r\n var shadows = parseBoxShadow(shadow);\r\n for (var i = 0; i < opts.lines; i++) {\r\n var degrees = ~~(360 / opts.lines * i + opts.rotate);\r\n var backgroundLine = css(document.createElement('div'), {\r\n position: 'absolute',\r\n top: -opts.width / 2 + \"px\",\r\n width: (opts.length + opts.width) + 'px',\r\n height: opts.width + 'px',\r\n background: getColor(opts.fadeColor, i),\r\n borderRadius: borderRadius,\r\n transformOrigin: 'left',\r\n transform: \"rotate(\" + degrees + \"deg) translateX(\" + opts.radius + \"px)\",\r\n });\r\n var line = css(document.createElement('div'), {\r\n width: '100%',\r\n height: '100%',\r\n background: getColor(opts.color, i),\r\n borderRadius: borderRadius,\r\n boxShadow: normalizeShadow(shadows, degrees),\r\n opacity: opts.opacity,\r\n });\r\n backgroundLine.appendChild(line);\r\n el.appendChild(backgroundLine);\r\n }\r\n}\r\nfunction parseBoxShadow(boxShadow) {\r\n var regex = /^\\s*([a-zA-Z]+\\s+)?(-?\\d+(\\.\\d+)?)([a-zA-Z]*)\\s+(-?\\d+(\\.\\d+)?)([a-zA-Z]*)(.*)$/;\r\n var shadows = [];\r\n for (var _i = 0, _a = boxShadow.split(','); _i < _a.length; _i++) {\r\n var shadow = _a[_i];\r\n var matches = shadow.match(regex);\r\n if (matches === null) {\r\n continue; // invalid syntax\r\n }\r\n var x = +matches[2];\r\n var y = +matches[5];\r\n var xUnits = matches[4];\r\n var yUnits = matches[7];\r\n if (x === 0 && !xUnits) {\r\n xUnits = yUnits;\r\n }\r\n if (y === 0 && !yUnits) {\r\n yUnits = xUnits;\r\n }\r\n if (xUnits !== yUnits) {\r\n continue; // units must match to use as coordinates\r\n }\r\n shadows.push({\r\n prefix: matches[1] || '',\r\n x: x,\r\n y: y,\r\n xUnits: xUnits,\r\n yUnits: yUnits,\r\n end: matches[8],\r\n });\r\n }\r\n return shadows;\r\n}\r\n/**\r\n * Modify box-shadow x/y offsets to counteract rotation\r\n */\r\nfunction normalizeShadow(shadows, degrees) {\r\n var normalized = [];\r\n for (var _i = 0, shadows_1 = shadows; _i < shadows_1.length; _i++) {\r\n var shadow = shadows_1[_i];\r\n var xy = convertOffset(shadow.x, shadow.y, degrees);\r\n normalized.push(shadow.prefix + xy[0] + shadow.xUnits + ' ' + xy[1] + shadow.yUnits + shadow.end);\r\n }\r\n return normalized.join(', ');\r\n}\r\nfunction convertOffset(x, y, degrees) {\r\n var radians = degrees * Math.PI / 180;\r\n var sin = Math.sin(radians);\r\n var cos = Math.cos(radians);\r\n return [\r\n Math.round((x * cos + y * sin) * 1000) / 1000,\r\n Math.round((-x * sin + y * cos) * 1000) / 1000,\r\n ];\r\n}\r\n","import Component from '../Component';\nimport { Spinner } from 'spin.js';\n\n/**\n * The `LoadingIndicator` component displays a loading spinner with spin.js. It\n * may have the following special props:\n *\n * - `size` The spin.js size preset to use. Defaults to 'small'.\n *\n * All other props will be assigned as attributes on the element.\n */\nexport default class LoadingIndicator extends Component {\n view() {\n const attrs = Object.assign({}, this.props);\n\n attrs.className = 'LoadingIndicator ' + (attrs.className || '');\n delete attrs.size;\n\n return <div {...attrs}>{m.trust(' ')}</div>;\n }\n\n config(isInitialized) {\n if (isInitialized) return;\n\n const options = { zIndex: 'auto', color: this.$().css('color') };\n\n switch (this.props.size) {\n case 'large':\n Object.assign(options, { lines: 10, length: 8, width: 4, radius: 8 });\n break;\n\n case 'tiny':\n Object.assign(options, { lines: 8, length: 2, width: 2, radius: 3 });\n break;\n\n default:\n Object.assign(options, { lines: 8, length: 4, width: 3, radius: 5 });\n }\n\n new Spinner(options).spin(this.element);\n }\n}\n","/**\n * The `avatar` helper displays a user's avatar.\n *\n * @param {User} user\n * @param {Object} attrs Attributes to apply to the avatar element\n * @return {Object}\n */\nexport default function avatar(user, attrs = {}) {\n attrs.className = 'Avatar ' + (attrs.className || '');\n let content = '';\n\n // If the `title` attribute is set to null or false, we don't want to give the\n // avatar a title. On the other hand, if it hasn't been given at all, we can\n // safely default it to the user's username.\n const hasTitle = attrs.title === 'undefined' || attrs.title;\n if (!hasTitle) delete attrs.title;\n\n // If a user has been passed, then we will set up an avatar using their\n // uploaded image, or the first letter of their username if they haven't\n // uploaded one.\n if (user) {\n const username = user.displayName() || '?';\n const avatarUrl = user.avatarUrl();\n\n if (hasTitle) attrs.title = attrs.title || username;\n\n if (avatarUrl) {\n return <img {...attrs} src={avatarUrl} />;\n }\n\n content = username.charAt(0).toUpperCase();\n attrs.style = { background: user.color() };\n }\n\n return <span {...attrs}>{content}</span>;\n}\n","import Component from '../Component';\nimport Button from './Button';\nimport listItems from '../helpers/listItems';\nimport extract from '../utils/extract';\n\n/**\n * The `Alert` component represents an alert box, which contains a message,\n * some controls, and may be dismissible.\n *\n * The alert may have the following special props:\n *\n * - `type` The type of alert this is. Will be used to give the alert a class\n * name of `Alert--{type}`.\n * - `controls` An array of controls to show in the alert.\n * - `dismissible` Whether or not the alert can be dismissed.\n * - `ondismiss` A callback to run when the alert is dismissed.\n *\n * All other props will be assigned as attributes on the alert element.\n */\nexport default class Alert extends Component {\n view() {\n const attrs = Object.assign({}, this.props);\n\n const type = extract(attrs, 'type');\n attrs.className = 'Alert Alert--' + type + ' ' + (attrs.className || '');\n\n const children = extract(attrs, 'children');\n const controls = extract(attrs, 'controls') || [];\n\n // If the alert is meant to be dismissible (which is the case by default),\n // then we will create a dismiss button to append as the final control in\n // the alert.\n const dismissible = extract(attrs, 'dismissible');\n const ondismiss = extract(attrs, 'ondismiss');\n const dismissControl = [];\n\n if (dismissible || dismissible === undefined) {\n dismissControl.push(<Button icon=\"fas fa-times\" className=\"Button Button--link Button--icon Alert-dismiss\" onclick={ondismiss} />);\n }\n\n return (\n <div {...attrs}>\n <span className=\"Alert-body\">{children}</span>\n <ul className=\"Alert-controls\">{listItems(controls.concat(dismissControl))}</ul>\n </div>\n );\n }\n}\n","/**\n * The `username` helper displays a user's username in a <span class=\"username\">\n * tag. If the user doesn't exist, the username will be displayed as [deleted].\n *\n * @param {User} user\n * @return {Object}\n */\nexport default function username(user) {\n const name = (user && user.displayName()) || app.translator.trans('core.lib.username.deleted_text');\n\n return <span className=\"username\">{name}</span>;\n}\n","/**\n * The `computed` utility creates a function that will cache its output until\n * any of the dependent values are dirty.\n *\n * @param {...String} dependentKeys The keys of the dependent values.\n * @param {function} compute The function which computes the value using the\n * dependent values.\n * @return {Function}\n */\nexport default function computed(...dependentKeys) {\n const keys = dependentKeys.slice(0, -1);\n const compute = dependentKeys.slice(-1)[0];\n\n const dependentValues = {};\n let computedValue;\n\n return function () {\n let recompute = false;\n\n // Read all of the dependent values. If any of them have changed since last\n // time, then we'll want to recompute our output.\n keys.forEach((key) => {\n const value = typeof this[key] === 'function' ? this[key]() : this[key];\n\n if (dependentValues[key] !== value) {\n recompute = true;\n dependentValues[key] = value;\n }\n });\n\n if (recompute) {\n computedValue = compute.apply(\n this,\n keys.map((key) => dependentValues[key])\n );\n }\n\n return computedValue;\n };\n}\n","import Component from '../Component';\nimport PageState from '../states/PageState';\n\n/**\n * The `Page` component\n *\n * @abstract\n */\nexport default class Page extends Component {\n init() {\n app.previous = app.current;\n app.current = new PageState(this.constructor);\n\n app.drawer.hide();\n app.modal.close();\n\n /**\n * A class name to apply to the body while the route is active.\n *\n * @type {String}\n */\n this.bodyClass = '';\n }\n\n config(isInitialized, context) {\n if (isInitialized) return;\n\n if (this.bodyClass) {\n $('#app').addClass(this.bodyClass);\n\n context.onunload = () => $('#app').removeClass(this.bodyClass);\n }\n }\n}\n","import Button from './Button';\n\n/**\n * The `LinkButton` component defines a `Button` which links to a route.\n *\n * ### Props\n *\n * All of the props accepted by `Button`, plus:\n *\n * - `active` Whether or not the page that this button links to is currently\n * active.\n * - `href` The URL to link to. If the current URL `m.route()` matches this,\n * the `active` prop will automatically be set to true.\n */\nexport default class LinkButton extends Button {\n static initProps(props) {\n props.active = this.isActive(props);\n props.config = props.config || m.route;\n }\n\n view() {\n const vdom = super.view();\n\n vdom.tag = 'a';\n\n return vdom;\n }\n\n /**\n * Determine whether a component with the given props is 'active'.\n *\n * @param {Object} props\n * @return {Boolean}\n */\n static isActive(props) {\n return typeof props.active !== 'undefined' ? props.active : m.route() === props.href;\n }\n}\n","import Component from '../Component';\nimport listItems from '../helpers/listItems';\n\n/**\n * The `FieldSet` component defines a collection of fields, displayed in a list\n * underneath a title. Accepted properties are:\n *\n * - `className` The class name for the fieldset.\n * - `label` The title of this group of fields.\n *\n * The children should be an array of items to show in the fieldset.\n */\nexport default class FieldSet extends Component {\n view() {\n return (\n <fieldset className={this.props.className}>\n <legend>{this.props.label}</legend>\n <ul>{listItems(this.props.children)}</ul>\n </fieldset>\n );\n }\n}\n","import Component from '../Component';\n\n/**\n * The `Separator` component defines a menu separator item.\n */\nclass Separator extends Component {\n view() {\n return <li className=\"Dropdown-separator\" />;\n }\n}\n\nSeparator.isListItem = true;\n\nexport default Separator;\n","/**\n * The `humanTime` utility converts a date to a localized, human-readable time-\n * ago string.\n *\n * @param {Date} time\n * @return {String}\n */\nexport default function humanTime(time) {\n let m = moment(time);\n const now = moment();\n\n // To prevent showing things like \"in a few seconds\" due to small offsets\n // between client and server time, we always reset future dates to the\n // current time. This will result in \"just now\" being shown instead.\n if (m.isAfter(now)) {\n m = now;\n }\n\n const day = 864e5;\n const diff = m.diff(moment());\n let ago = null;\n\n // If this date was more than a month ago, we'll show the name of the month\n // in the string. If it wasn't this year, we'll show the year as well.\n if (diff < -30 * day) {\n if (m.year() === moment().year()) {\n ago = m.format('D MMM');\n } else {\n ago = m.format('ll');\n }\n } else {\n ago = m.fromNow();\n }\n\n return ago;\n}\n","import Component from '../Component';\nimport icon from '../helpers/icon';\nimport extract from '../utils/extract';\n\n/**\n * The `Badge` component represents a user/discussion badge, indicating some\n * status (e.g. a discussion is stickied, a user is an admin).\n *\n * A badge may have the following special props:\n *\n * - `type` The type of badge this is. This will be used to give the badge a\n * class name of `Badge--{type}`.\n * - `icon` The name of an icon to show inside the badge.\n * - `label`\n *\n * All other props will be assigned as attributes on the badge element.\n */\nexport default class Badge extends Component {\n view() {\n const attrs = Object.assign({}, this.props);\n const type = extract(attrs, 'type');\n const iconName = extract(attrs, 'icon');\n\n attrs.className = 'Badge ' + (type ? 'Badge--' + type : '') + ' ' + (attrs.className || '');\n attrs.title = extract(attrs, 'label') || '';\n\n return <span {...attrs}>{iconName ? icon(iconName, { className: 'Badge-icon' }) : m.trust(' ')}</span>;\n }\n\n config(isInitialized) {\n if (isInitialized) return;\n\n if (this.props.label) this.$().tooltip();\n }\n}\n","/**\n * The `classList` utility creates a list of class names by joining an object's\n * keys, but only for values which are truthy.\n *\n * @example\n * classList({ foo: true, bar: false, qux: 'qaz' });\n * // \"foo qux\"\n *\n * @param {Object} classes\n * @return {String}\n */\nexport default function classList(classes) {\n let classNames;\n\n if (classes instanceof Array) {\n classNames = classes.filter((name) => name);\n } else {\n classNames = [];\n\n for (const i in classes) {\n if (classes[i]) classNames.push(i);\n }\n }\n\n return classNames.join(' ');\n}\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}","/**\n * Truncate a string to the given length, appending ellipses if necessary.\n *\n * @param {String} string\n * @param {Number} length\n * @param {Number} [start=0]\n * @return {String}\n */\nexport function truncate(string, length, start = 0) {\n return (start > 0 ? '...' : '') + string.substring(start, start + length) + (string.length > start + length ? '...' : '');\n}\n\n/**\n * Create a slug out of the given string. Non-alphanumeric characters are\n * converted to hyphens.\n *\n * NOTE: This method does not use the comparably sophisticated transliteration\n * mechanism that is employed in the backend. Therefore, it should only be used\n * to *suggest* slugs that can be overridden by the user.\n *\n * @param {String} string\n * @return {String}\n */\nexport function slug(string) {\n return string\n .toLowerCase()\n .replace(/[^a-z0-9]/gi, '-')\n .replace(/-+/g, '-')\n .replace(/-$|^-/g, '');\n}\n\n/**\n * Strip HTML tags and quotes out of the given string, replacing them with\n * meaningful punctuation.\n *\n * @param {String} string\n * @return {String}\n */\nexport function getPlainContent(string) {\n const html = string.replace(/(<\\/p>|<br>)/g, '$1 ').replace(/<img\\b[^>]*>/gi, ' ');\n\n const dom = $('<div/>').html(html);\n\n dom.find(getPlainContent.removeSelectors.join(',')).remove();\n\n return dom.text().replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * An array of DOM selectors to remove when getting plain content.\n *\n * @type {Array}\n */\ngetPlainContent.removeSelectors = ['blockquote', 'script'];\n\n/**\n * Make a string's first character uppercase.\n *\n * @param {String} string\n * @return {String}\n */\nexport function ucfirst(string) {\n return string.substr(0, 1).toUpperCase() + string.substr(1);\n}\n","import Dropdown from './Dropdown';\nimport icon from '../helpers/icon';\n\n/**\n * The `SelectDropdown` component is the same as a `Dropdown`, except the toggle\n * button's label is set as the label of the first child which has a truthy\n * `active` prop.\n *\n * ### Props\n *\n * - `caretIcon`\n * - `defaultLabel`\n */\nexport default class SelectDropdown extends Dropdown {\n static initProps(props) {\n props.caretIcon = typeof props.caretIcon !== 'undefined' ? props.caretIcon : 'fas fa-sort';\n\n super.initProps(props);\n\n props.className += ' Dropdown--select';\n }\n\n getButtonContent() {\n const activeChild = this.props.children.filter((child) => child.props.active)[0];\n let label = (activeChild && activeChild.props.children) || this.props.defaultLabel;\n\n if (label instanceof Array) label = label[0];\n\n return [<span className=\"Button-label\">{label}</span>, icon(this.props.caretIcon, { className: 'Button-caret' })];\n }\n}\n","import Badge from './Badge';\n\nexport default class GroupBadge extends Badge {\n static initProps(props) {\n super.initProps(props);\n\n if (props.group) {\n props.icon = props.group.icon();\n props.style = { backgroundColor: props.group.color() };\n props.label = typeof props.label === 'undefined' ? props.group.nameSingular() : props.label;\n props.type = 'group--' + props.group.id();\n\n delete props.group;\n }\n }\n}\n","import { truncate } from '../utils/string';\n\n/**\n * The `highlight` helper searches for a word phrase in a string, and wraps\n * matches with the <mark> tag.\n *\n * @param {String} string The string to highlight.\n * @param {String|RegExp} phrase The word or words to highlight.\n * @param {Integer} [length] The number of characters to truncate the string to.\n * The string will be truncated surrounding the first match.\n * @return {Object}\n */\nexport default function highlight(string, phrase, length) {\n if (!phrase && !length) return string;\n\n // Convert the word phrase into a global regular expression (if it isn't\n // already) so we can search the string for matched.\n const regexp = phrase instanceof RegExp ? phrase : new RegExp(phrase, 'gi');\n\n let highlighted = string;\n let start = 0;\n\n // If a length was given, the truncate the string surrounding the first match.\n if (length) {\n if (phrase) start = Math.max(0, string.search(regexp) - length / 2);\n\n highlighted = truncate(highlighted, length, start);\n }\n\n // Convert the string into HTML entities, then highlight all matches with\n // <mark> tags. Then we will return the result as a trusted HTML string.\n highlighted = $('<div/>').text(highlighted).html();\n\n if (phrase) highlighted = highlighted.replace(regexp, '<mark>$&</mark>');\n\n return m.trust(highlighted);\n}\n","import Checkbox from './Checkbox';\n\n/**\n * The `Switch` component is a `Checkbox`, but with a switch display instead of\n * a tick/cross one.\n */\nexport default class Switch extends Checkbox {\n static initProps(props) {\n super.initProps(props);\n\n props.className = (props.className || '') + ' Checkbox--switch';\n }\n\n getDisplay() {\n return this.props.loading ? super.getDisplay() : '';\n }\n}\n","const later =\n window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n ((callback) => window.setTimeout(callback, 1000 / 60));\n\n/**\n * The `ScrollListener` class sets up a listener that handles window scroll\n * events.\n */\nexport default class ScrollListener {\n /**\n * @param {Function} callback The callback to run when the scroll position\n * changes.\n * @public\n */\n constructor(callback) {\n this.callback = callback;\n this.ticking = false;\n }\n\n /**\n * On each animation frame, as long as the listener is active, run the\n * `update` method.\n *\n * @protected\n */\n loop() {\n // THROTTLE: If the callback is still running (or hasn't yet run), we ignore\n // further scroll events.\n if (this.ticking) return;\n\n // Schedule the callback to be executed soon (TM), and stop throttling once\n // the callback is done.\n later(() => {\n this.update();\n this.ticking = false;\n });\n\n this.ticking = true;\n }\n\n /**\n * Run the callback, whether there was a scroll event or not.\n *\n * @public\n */\n update() {\n this.callback(window.pageYOffset);\n }\n\n /**\n * Start listening to and handling the window's scroll position.\n *\n * @public\n */\n start() {\n if (!this.active) {\n window.addEventListener('scroll', (this.active = this.loop.bind(this)));\n }\n }\n\n /**\n * Stop listening to and handling the window's scroll position.\n *\n * @public\n */\n stop() {\n window.removeEventListener('scroll', this.active);\n\n this.active = null;\n }\n}\n","/**\n * Extend an object's method by running its output through a mutating callback\n * every time it is called.\n *\n * The callback accepts the method's return value and should perform any\n * mutations directly on this value. For this reason, this function will not be\n * effective on methods which return scalar values (numbers, strings, booleans).\n *\n * Care should be taken to extend the correct object – in most cases, a class'\n * prototype will be the desired target of extension, not the class itself.\n *\n * @example\n * extend(Discussion.prototype, 'badges', function(badges) {\n * // do something with `badges`\n * });\n *\n * @param {Object} object The object that owns the method\n * @param {String} method The name of the method to extend\n * @param {function} callback A callback which mutates the method's output\n */\nexport function extend(object, method, callback) {\n const original = object[method];\n\n object[method] = function (...args) {\n const value = original ? original.apply(this, args) : undefined;\n\n callback.apply(this, [value].concat(args));\n\n return value;\n };\n\n Object.assign(object[method], original);\n}\n\n/**\n * Override an object's method by replacing it with a new function, so that the\n * new function will be run every time the object's method is called.\n *\n * The replacement function accepts the original method as its first argument,\n * which is like a call to 'super'. Any arguments passed to the original method\n * are also passed to the replacement.\n *\n * Care should be taken to extend the correct object – in most cases, a class'\n * prototype will be the desired target of extension, not the class itself.\n *\n * @example\n * override(Discussion.prototype, 'badges', function(original) {\n * const badges = original();\n * // do something with badges\n * return badges;\n * });\n *\n * @param {Object} object The object that owns the method\n * @param {String} method The name of the method to override\n * @param {function} newMethod The method to replace it with\n */\nexport function override(object, method, newMethod) {\n const original = object[method];\n\n object[method] = function (...args) {\n return newMethod.apply(this, [original.bind(this)].concat(args));\n };\n\n Object.assign(object[method], original);\n}\n","/*global ColorThief*/\n\nimport Model from '../Model';\nimport stringToColor from '../utils/stringToColor';\nimport ItemList from '../utils/ItemList';\nimport computed from '../utils/computed';\nimport GroupBadge from '../components/GroupBadge';\n\nexport default class User extends Model {}\n\nObject.assign(User.prototype, {\n username: Model.attribute('username'),\n displayName: Model.attribute('displayName'),\n email: Model.attribute('email'),\n isEmailConfirmed: Model.attribute('isEmailConfirmed'),\n password: Model.attribute('password'),\n\n avatarUrl: Model.attribute('avatarUrl'),\n preferences: Model.attribute('preferences'),\n groups: Model.hasMany('groups'),\n\n joinTime: Model.attribute('joinTime', Model.transformDate),\n lastSeenAt: Model.attribute('lastSeenAt', Model.transformDate),\n markedAllAsReadAt: Model.attribute('markedAllAsReadAt', Model.transformDate),\n unreadNotificationCount: Model.attribute('unreadNotificationCount'),\n newNotificationCount: Model.attribute('newNotificationCount'),\n\n discussionCount: Model.attribute('discussionCount'),\n commentCount: Model.attribute('commentCount'),\n\n canEdit: Model.attribute('canEdit'),\n canDelete: Model.attribute('canDelete'),\n\n avatarColor: null,\n color: computed('username', 'avatarUrl', 'avatarColor', function (username, avatarUrl, avatarColor) {\n // If we've already calculated and cached the dominant color of the user's\n // avatar, then we can return that in RGB format. If we haven't, we'll want\n // to calculate it. Unless the user doesn't have an avatar, in which case\n // we generate a color from their username.\n if (avatarColor) {\n return 'rgb(' + avatarColor.join(', ') + ')';\n } else if (avatarUrl) {\n this.calculateAvatarColor();\n return '';\n }\n\n return '#' + stringToColor(username);\n }),\n\n /**\n * Check whether or not the user has been seen in the last 5 minutes.\n *\n * @return {Boolean}\n * @public\n */\n isOnline() {\n return this.lastSeenAt() > moment().subtract(5, 'minutes').toDate();\n },\n\n /**\n * Get the Badge components that apply to this user.\n *\n * @return {ItemList}\n */\n badges() {\n const items = new ItemList();\n const groups = this.groups();\n\n if (groups) {\n groups.forEach((group) => {\n items.add('group' + group.id(), GroupBadge.component({ group }));\n });\n }\n\n return items;\n },\n\n /**\n * Calculate the dominant color of the user's avatar. The dominant color will\n * be set to the `avatarColor` property once it has been calculated.\n *\n * @protected\n */\n calculateAvatarColor() {\n const image = new Image();\n const user = this;\n\n image.onload = function () {\n const colorThief = new ColorThief();\n user.avatarColor = colorThief.getColor(this);\n user.freshness = new Date();\n m.redraw();\n };\n image.crossOrigin = 'anonymous';\n image.src = this.avatarUrl();\n },\n\n /**\n * Update the user's preferences.\n *\n * @param {Object} newPreferences\n * @return {Promise}\n */\n savePreferences(newPreferences) {\n const preferences = this.preferences();\n\n Object.assign(preferences, newPreferences);\n\n return this.save({ preferences });\n },\n});\n","/**\n * The `SubtreeRetainer` class represents a Mithril virtual DOM subtree. It\n * keeps track of a number of pieces of data, allowing the subtree to be\n * retained if none of them have changed.\n *\n * @example\n * // constructor\n * this.subtree = new SubtreeRetainer(\n * () => this.props.post.freshness,\n * () => this.showing\n * );\n * this.subtree.check(() => this.props.user.freshness);\n *\n * // view\n * this.subtree.retain() || 'expensive expression'\n *\n * @see https://lhorie.github.io/mithril/mithril.html#persisting-dom-elements-across-route-changes\n */\nexport default class SubtreeRetainer {\n /**\n * @param {...callbacks} callbacks Functions returning data to keep track of.\n */\n constructor(...callbacks) {\n this.callbacks = callbacks;\n this.data = {};\n }\n\n /**\n * Return a virtual DOM directive that will retain a subtree if no data has\n * changed since the last check.\n *\n * @return {Object|false}\n * @public\n */\n retain() {\n let needsRebuild = false;\n\n this.callbacks.forEach((callback, i) => {\n const result = callback();\n\n if (result !== this.data[i]) {\n this.data[i] = result;\n needsRebuild = true;\n }\n });\n\n return needsRebuild ? false : { subtree: 'retain' };\n }\n\n /**\n * Add another callback to be checked.\n *\n * @param {...Function} callbacks\n * @public\n */\n check(...callbacks) {\n this.callbacks = this.callbacks.concat(callbacks);\n }\n\n /**\n * Invalidate the subtree, forcing it to be rerendered.\n *\n * @public\n */\n invalidate() {\n this.data = {};\n }\n}\n","import humanTimeUtil from '../utils/humanTime';\n\n/**\n * The `humanTime` helper displays a time in a human-friendly time-ago format\n * (e.g. '12 days ago'), wrapped in a <time> tag with other information about\n * the time.\n *\n * @param {Date} time\n * @return {Object}\n */\nexport default function humanTime(time) {\n const mo = moment(time);\n\n const datetime = mo.format();\n const full = mo.format('LLLL');\n const ago = humanTimeUtil(time);\n\n return (\n <time pubdate datetime={datetime} title={full} data-humantime>\n {ago}\n </time>\n );\n}\n","import Model from '../Model';\nimport computed from '../utils/computed';\nimport ItemList from '../utils/ItemList';\nimport Badge from '../components/Badge';\n\nexport default class Discussion extends Model {}\n\nObject.assign(Discussion.prototype, {\n title: Model.attribute('title'),\n slug: Model.attribute('slug'),\n\n createdAt: Model.attribute('createdAt', Model.transformDate),\n user: Model.hasOne('user'),\n firstPost: Model.hasOne('firstPost'),\n\n lastPostedAt: Model.attribute('lastPostedAt', Model.transformDate),\n lastPostedUser: Model.hasOne('lastPostedUser'),\n lastPost: Model.hasOne('lastPost'),\n lastPostNumber: Model.attribute('lastPostNumber'),\n\n commentCount: Model.attribute('commentCount'),\n replyCount: computed('commentCount', (commentCount) => Math.max(0, commentCount - 1)),\n posts: Model.hasMany('posts'),\n mostRelevantPost: Model.hasOne('mostRelevantPost'),\n\n lastReadAt: Model.attribute('lastReadAt', Model.transformDate),\n lastReadPostNumber: Model.attribute('lastReadPostNumber'),\n isUnread: computed('unreadCount', (unreadCount) => !!unreadCount),\n isRead: computed('unreadCount', (unreadCount) => app.session.user && !unreadCount),\n\n hiddenAt: Model.attribute('hiddenAt', Model.transformDate),\n hiddenUser: Model.hasOne('hiddenUser'),\n isHidden: computed('hiddenAt', (hiddenAt) => !!hiddenAt),\n\n canReply: Model.attribute('canReply'),\n canRename: Model.attribute('canRename'),\n canHide: Model.attribute('canHide'),\n canDelete: Model.attribute('canDelete'),\n\n /**\n * Remove a post from the discussion's posts relationship.\n *\n * @param {Integer} id The ID of the post to remove.\n * @public\n */\n removePost(id) {\n const relationships = this.data.relationships;\n const posts = relationships && relationships.posts;\n\n if (posts) {\n posts.data.some((data, i) => {\n if (id === data.id) {\n posts.data.splice(i, 1);\n return true;\n }\n });\n }\n },\n\n /**\n * Get the estimated number of unread posts in this discussion for the current\n * user.\n *\n * @return {Integer}\n * @public\n */\n unreadCount() {\n const user = app.session.user;\n\n if (user && user.markedAllAsReadAt() < this.lastPostedAt()) {\n const unreadCount = Math.max(0, this.lastPostNumber() - (this.lastReadPostNumber() || 0));\n // If posts have been deleted, it's possible that the unread count could exceed the\n // actual post count. As such, we take the min of the two to ensure this isn't an issue.\n return Math.min(unreadCount, this.commentCount());\n }\n\n return 0;\n },\n\n /**\n * Get the Badge components that apply to this discussion.\n *\n * @return {ItemList}\n * @public\n */\n badges() {\n const items = new ItemList();\n\n if (this.isHidden()) {\n items.add('hidden', <Badge type=\"hidden\" icon=\"fas fa-trash\" label={app.translator.trans('core.lib.badge.hidden_tooltip')} />);\n }\n\n return items;\n },\n\n /**\n * Get a list of all of the post IDs in this discussion.\n *\n * @return {Array}\n * @public\n */\n postIds() {\n const posts = this.data.relationships.posts;\n\n return posts ? posts.data.map((link) => link.id) : [];\n },\n});\n","import Component from '../Component';\nimport LoadingIndicator from './LoadingIndicator';\nimport icon from '../helpers/icon';\n\n/**\n * The `Checkbox` component defines a checkbox input.\n *\n * ### Props\n *\n * - `state` Whether or not the checkbox is checked.\n * - `className` The class name for the root element.\n * - `disabled` Whether or not the checkbox is disabled.\n * - `loading` Whether or not the checkbox is loading.\n * - `onchange` A callback to run when the checkbox is checked/unchecked.\n * - `children` A text label to display next to the checkbox.\n */\nexport default class Checkbox extends Component {\n view() {\n let className = 'Checkbox ' + (this.props.state ? 'on' : 'off') + ' ' + (this.props.className || '');\n if (this.props.loading) className += ' loading';\n if (this.props.disabled) className += ' disabled';\n\n return (\n <label className={className}>\n <input type=\"checkbox\" checked={this.props.state} disabled={this.props.disabled} onchange={m.withAttr('checked', this.onchange.bind(this))} />\n <div className=\"Checkbox-display\">{this.getDisplay()}</div>\n {this.props.children}\n </label>\n );\n }\n\n /**\n * Get the template for the checkbox's display (tick/cross icon).\n *\n * @return {*}\n * @protected\n */\n getDisplay() {\n return this.props.loading ? LoadingIndicator.component({ size: 'tiny' }) : icon(this.props.state ? 'fas fa-check' : 'fas fa-times');\n }\n\n /**\n * Run a callback when the state of the checkbox is changed.\n *\n * @param {Boolean} checked\n * @protected\n */\n onchange(checked) {\n if (this.props.onchange) this.props.onchange(checked, this);\n }\n}\n","export default class RequestError {\n constructor(status, responseText, options, xhr) {\n this.status = status;\n this.responseText = responseText;\n this.options = options;\n this.xhr = xhr;\n\n try {\n this.response = JSON.parse(responseText);\n } catch (e) {\n this.response = null;\n }\n\n this.alert = null;\n }\n}\n","import Component from '../Component';\nimport Button from './Button';\nimport LinkButton from './LinkButton';\n\n/**\n * The `Navigation` component displays a set of navigation buttons. Typically\n * this is just a back button which pops the app's History. If the user is on\n * the root page and there is no history to pop, then in some instances it may\n * show a button that toggles the app's drawer.\n *\n * If the app has a pane, it will also include a 'pin' button which toggles the\n * pinned state of the pane.\n *\n * Accepts the following props:\n *\n * - `className` The name of a class to set on the root element.\n * - `drawer` Whether or not to show a button to toggle the app's drawer if\n * there is no more history to pop.\n */\nexport default class Navigation extends Component {\n view() {\n const { history, pane } = app;\n\n return (\n <div\n className={'Navigation ButtonGroup ' + (this.props.className || '')}\n onmouseenter={pane && pane.show.bind(pane)}\n onmouseleave={pane && pane.onmouseleave.bind(pane)}\n >\n {history.canGoBack() ? [this.getBackButton(), this.getPaneButton()] : this.getDrawerButton()}\n </div>\n );\n }\n\n config(isInitialized, context) {\n // Since this component is 'above' the content of the page (that is, it is a\n // part of the global UI that persists between routes), we will flag the DOM\n // to be retained across route changes.\n context.retain = true;\n }\n\n /**\n * Get the back button.\n *\n * @return {Object}\n * @protected\n */\n getBackButton() {\n const { history } = app;\n const previous = history.getPrevious() || {};\n\n return LinkButton.component({\n className: 'Button Navigation-back Button--icon',\n href: history.backUrl(),\n icon: 'fas fa-chevron-left',\n title: previous.title,\n config: () => {},\n onclick: (e) => {\n if (e.shiftKey || e.ctrlKey || e.metaKey || e.which === 2) return;\n e.preventDefault();\n history.back();\n },\n });\n }\n\n /**\n * Get the pane pinned toggle button.\n *\n * @return {Object|String}\n * @protected\n */\n getPaneButton() {\n const { pane } = app;\n\n if (!pane || !pane.active) return '';\n\n return Button.component({\n className: 'Button Button--icon Navigation-pin' + (pane.pinned ? ' active' : ''),\n onclick: pane.togglePinned.bind(pane),\n icon: 'fas fa-thumbtack',\n });\n }\n\n /**\n * Get the drawer toggle button.\n *\n * @return {Object|String}\n * @protected\n */\n getDrawerButton() {\n if (!this.props.drawer) return '';\n\n const { drawer } = app;\n const user = app.session.user;\n\n return Button.component({\n className: 'Button Button--icon Navigation-drawer' + (user && user.newNotificationCount() ? ' new' : ''),\n onclick: (e) => {\n e.stopPropagation();\n drawer.show();\n },\n icon: 'fas fa-bars',\n });\n }\n}\n","import Component from '../Component';\nimport icon from '../helpers/icon';\n\n/**\n * The `Select` component displays a <select> input, surrounded with some extra\n * elements for styling. It accepts the following props:\n *\n * - `options` A map of option values to labels.\n * - `onchange` A callback to run when the selected value is changed.\n * - `value` The value of the selected option.\n * - `disabled` Disabled state for the input.\n */\nexport default class Select extends Component {\n view() {\n const { options, onchange, value, disabled } = this.props;\n\n return (\n <span className=\"Select\">\n <select\n className=\"Select-input FormControl\"\n onchange={onchange ? m.withAttr('value', onchange.bind(this)) : undefined}\n value={value}\n disabled={disabled}\n >\n {Object.keys(options).map((key) => (\n <option value={key}>{options[key]}</option>\n ))}\n </select>\n {icon('fas fa-sort', { className: 'Select-caret' })}\n </span>\n );\n }\n}\n","import subclassOf from '../../common/utils/subclassOf';\n\nexport default class PageState {\n constructor(type, data = {}) {\n this.type = type;\n this.data = data;\n }\n\n /**\n * Determine whether the page matches the given class and data.\n *\n * @param {object} type The page class to check against. Subclasses are\n * accepted as well.\n * @param {object} data\n * @return {boolean}\n */\n matches(type, data = {}) {\n // Fail early when the page is of a different type\n if (!subclassOf(this.type, type)) return false;\n\n // Now that the type is known to be correct, we loop through the provided\n // data to see whether it matches the data in our state.\n return Object.keys(data).every((key) => this.data[key] === data[key]);\n }\n\n get(key) {\n return this.data[key];\n }\n\n set(key, value) {\n this.data[key] = value;\n }\n}\n","/**\n * Check if class A is the same as or a subclass of class B.\n */\nexport default function subclassOf(A, B) {\n return A && (A === B || A.prototype instanceof B);\n}\n","import Component from '../Component';\n\nexport default function patchMithril(global) {\n const mo = global.m;\n\n const m = function (comp, ...args) {\n if (comp.prototype && comp.prototype instanceof Component) {\n let children = args.slice(1);\n if (children.length === 1 && Array.isArray(children[0])) {\n children = children[0];\n }\n\n return comp.component(args[0], children);\n }\n\n const node = mo.apply(this, arguments);\n\n if (node.attrs.bidi) {\n m.bidi(node, node.attrs.bidi);\n }\n\n if (node.attrs.route) {\n node.attrs.href = node.attrs.route;\n node.attrs.config = m.route;\n\n delete node.attrs.route;\n }\n\n return node;\n };\n\n Object.keys(mo).forEach((key) => (m[key] = mo[key]));\n\n /**\n * Redraw only if not in the middle of a computation (e.g. a route change).\n *\n * @return {void}\n */\n m.lazyRedraw = function () {\n m.startComputation();\n m.endComputation();\n };\n\n global.m = m;\n}\n","import Component from '../Component';\n\n/**\n * The `Placeholder` component displays a muted text with some call to action,\n * usually used as an empty state.\n *\n * ### Props\n *\n * - `text`\n */\nexport default class Placeholder extends Component {\n view() {\n return (\n <div className=\"Placeholder\">\n <p>{this.props.text}</p>\n </div>\n );\n }\n}\n","import Component from '../Component';\nimport Modal from './Modal';\n\n/**\n * The `ModalManager` component manages a modal dialog. Only one modal dialog\n * can be shown at once; loading a new component into the ModalManager will\n * overwrite the previous one.\n */\nexport default class ModalManager extends Component {\n init() {\n this.showing = false;\n this.component = null;\n }\n\n view() {\n return <div className=\"ModalManager modal fade\">{this.component && this.component.render()}</div>;\n }\n\n config(isInitialized, context) {\n if (isInitialized) return;\n\n // Since this component is 'above' the content of the page (that is, it is a\n // part of the global UI that persists between routes), we will flag the DOM\n // to be retained across route changes.\n context.retain = true;\n\n this.$().on('hidden.bs.modal', this.clear.bind(this)).on('shown.bs.modal', this.onready.bind(this));\n }\n\n /**\n * Show a modal dialog.\n *\n * @param {Modal} component\n * @public\n */\n show(component) {\n if (!(component instanceof Modal)) {\n throw new Error('The ModalManager component can only show Modal components');\n }\n\n clearTimeout(this.hideTimeout);\n\n this.showing = true;\n this.component = component;\n\n m.redraw(true);\n\n const dismissible = !!this.component.isDismissible();\n this.$()\n .modal({\n backdrop: dismissible || 'static',\n keyboard: dismissible,\n })\n .modal('show');\n }\n\n /**\n * Close the modal dialog.\n *\n * @public\n */\n close() {\n if (!this.showing) return;\n\n // Don't hide the modal immediately, because if the consumer happens to call\n // the `show` method straight after to show another modal dialog, it will\n // cause Bootstrap's modal JS to misbehave. Instead we will wait for a tiny\n // bit to give the `show` method the opportunity to prevent this from going\n // ahead.\n this.hideTimeout = setTimeout(() => {\n this.$().modal('hide');\n this.showing = false;\n });\n }\n\n /**\n * Clear content from the modal area.\n *\n * @protected\n */\n clear() {\n if (this.component) {\n this.component.onhide();\n }\n\n this.component = null;\n\n app.current.retain = false;\n\n m.lazyRedraw();\n }\n\n /**\n * When the modal dialog is ready to be used, tell it!\n *\n * @protected\n */\n onready() {\n if (this.component && this.component.onready) {\n this.component.onready(this.$());\n }\n }\n}\n","import Component from '../Component';\nimport Alert from './Alert';\n\n/**\n * The `AlertManager` component provides an area in which `Alert` components can\n * be shown and dismissed.\n */\nexport default class AlertManager extends Component {\n init() {\n /**\n * An array of Alert components which are currently showing.\n *\n * @type {Alert[]}\n * @protected\n */\n this.components = [];\n }\n\n view() {\n return (\n <div className=\"AlertManager\">\n {this.components.map((component) => (\n <div className=\"AlertManager-alert\">{component}</div>\n ))}\n </div>\n );\n }\n\n config(isInitialized, context) {\n // Since this component is 'above' the content of the page (that is, it is a\n // part of the global UI that persists between routes), we will flag the DOM\n // to be retained across route changes.\n context.retain = true;\n }\n\n /**\n * Show an Alert in the alerts area.\n *\n * @param {Alert} component\n * @public\n */\n show(component) {\n if (!(component instanceof Alert)) {\n throw new Error('The AlertManager component can only show Alert components');\n }\n\n component.props.ondismiss = this.dismiss.bind(this, component);\n\n this.components.push(component);\n m.redraw();\n }\n\n /**\n * Dismiss an alert.\n *\n * @param {Alert} component\n * @public\n */\n dismiss(component) {\n const index = this.components.indexOf(component);\n\n if (index !== -1) {\n this.components.splice(index, 1);\n m.redraw();\n }\n }\n\n /**\n * Clear all alerts.\n *\n * @public\n */\n clear() {\n this.components = [];\n m.redraw();\n }\n}\n","import Modal from './Modal';\n\nexport default class RequestErrorModal extends Modal {\n className() {\n return 'RequestErrorModal Modal--large';\n }\n\n title() {\n return this.props.error.xhr ? `${this.props.error.xhr.status} ${this.props.error.xhr.statusText}` : '';\n }\n\n content() {\n const { error, formattedError } = this.props;\n\n let responseText;\n\n // If the error is already formatted, just add line endings;\n // else try to parse it as JSON and stringify it with indentation\n if (formattedError) {\n responseText = formattedError.join('\\n\\n');\n } else {\n try {\n const json = error.response || JSON.parse(error.responseText);\n\n responseText = JSON.stringify(json, null, 2);\n } catch (e) {\n responseText = error.responseText;\n }\n }\n\n return (\n <div className=\"Modal-body\">\n <pre>\n {this.props.error.options.method} {this.props.error.options.url}\n <br />\n <br />\n {responseText}\n </pre>\n </div>\n );\n }\n}\n","import User from './models/User';\nimport username from './helpers/username';\nimport extract from './utils/extract';\n\n/**\n * Translator with the same API as Symfony's.\n *\n * Derived from https://github.com/willdurand/BazingaJsTranslationBundle\n * which is available under the MIT License.\n * Copyright (c) William Durand <william.durand1@gmail.com>\n */\nexport default class Translator {\n constructor() {\n /**\n * A map of translation keys to their translated values.\n *\n * @type {Object}\n * @public\n */\n this.translations = {};\n\n this.locale = null;\n }\n\n addTranslations(translations) {\n Object.assign(this.translations, translations);\n }\n\n trans(id, parameters) {\n const translation = this.translations[id];\n\n if (translation) {\n return this.apply(translation, parameters || {});\n }\n\n return id;\n }\n\n transChoice(id, number, parameters) {\n let translation = this.translations[id];\n\n if (translation) {\n number = parseInt(number, 10);\n\n translation = this.pluralize(translation, number);\n\n return this.apply(translation, parameters || {});\n }\n\n return id;\n }\n\n apply(translation, input) {\n // If we've been given a user model as one of the input parameters, then\n // we'll extract the username and use that for the translation. In the\n // future there should be a hook here to inspect the user and change the\n // translation key. This will allow a gender property to determine which\n // translation key is used.\n if ('user' in input) {\n const user = extract(input, 'user');\n\n if (!input.username) input.username = username(user);\n }\n\n translation = translation.split(new RegExp('({[a-z0-9_]+}|</?[a-z0-9_]+>)', 'gi'));\n\n const hydrated = [];\n const open = [hydrated];\n\n translation.forEach((part) => {\n const match = part.match(new RegExp('{([a-z0-9_]+)}|<(/?)([a-z0-9_]+)>', 'i'));\n\n if (match) {\n if (match[1]) {\n open[0].push(input[match[1]]);\n } else if (match[3]) {\n if (match[2]) {\n open.shift();\n } else {\n let tag = input[match[3]] || { tag: match[3], children: [] };\n open[0].push(tag);\n open.unshift(tag.children || tag);\n }\n }\n } else {\n open[0].push(part);\n }\n });\n\n return hydrated.filter((part) => part);\n }\n\n pluralize(translation, number) {\n const sPluralRegex = new RegExp(/^\\w+\\: +(.+)$/),\n cPluralRegex = new RegExp(/^\\s*((\\{\\s*(\\-?\\d+[\\s*,\\s*\\-?\\d+]*)\\s*\\})|([\\[\\]])\\s*(-Inf|\\-?\\d+)\\s*,\\s*(\\+?Inf|\\-?\\d+)\\s*([\\[\\]]))\\s?(.+?)$/),\n iPluralRegex = new RegExp(/^\\s*(\\{\\s*(\\-?\\d+[\\s*,\\s*\\-?\\d+]*)\\s*\\})|([\\[\\]])\\s*(-Inf|\\-?\\d+)\\s*,\\s*(\\+?Inf|\\-?\\d+)\\s*([\\[\\]])/),\n standardRules = [],\n explicitRules = [];\n\n translation.split('|').forEach((part) => {\n if (cPluralRegex.test(part)) {\n const matches = part.match(cPluralRegex);\n explicitRules[matches[0]] = matches[matches.length - 1];\n } else if (sPluralRegex.test(part)) {\n const matches = part.match(sPluralRegex);\n standardRules.push(matches[1]);\n } else {\n standardRules.push(part);\n }\n });\n\n explicitRules.forEach((rule, e) => {\n if (iPluralRegex.test(e)) {\n const matches = e.match(iPluralRegex);\n\n if (matches[1]) {\n const ns = matches[2].split(',');\n\n for (let n in ns) {\n if (number == ns[n]) {\n return explicitRules[e];\n }\n }\n } else {\n var leftNumber = this.convertNumber(matches[4]);\n var rightNumber = this.convertNumber(matches[5]);\n\n if (\n ('[' === matches[3] ? number >= leftNumber : number > leftNumber) &&\n (']' === matches[6] ? number <= rightNumber : number < rightNumber)\n ) {\n return explicitRules[e];\n }\n }\n }\n });\n\n return standardRules[this.pluralPosition(number, this.locale)] || standardRules[0] || undefined;\n }\n\n convertNumber(number) {\n if ('-Inf' === number) {\n return Number.NEGATIVE_INFINITY;\n } else if ('+Inf' === number || 'Inf' === number) {\n return Number.POSITIVE_INFINITY;\n }\n\n return parseInt(number, 10);\n }\n\n pluralPosition(number, locale) {\n if ('pt_BR' === locale) {\n locale = 'xbr';\n }\n\n if (locale.length > 3) {\n locale = locale.split('_')[0];\n }\n\n switch (locale) {\n case 'bo':\n case 'dz':\n case 'id':\n case 'ja':\n case 'jv':\n case 'ka':\n case 'km':\n case 'kn':\n case 'ko':\n case 'ms':\n case 'th':\n case 'vi':\n case 'zh':\n return 0;\n\n case 'af':\n case 'az':\n case 'bn':\n case 'bg':\n case 'ca':\n case 'da':\n case 'de':\n case 'el':\n case 'en':\n case 'eo':\n case 'es':\n case 'et':\n case 'eu':\n case 'fa':\n case 'fi':\n case 'fo':\n case 'fur':\n case 'fy':\n case 'gl':\n case 'gu':\n case 'ha':\n case 'he':\n case 'hu':\n case 'is':\n case 'it':\n case 'ku':\n case 'lb':\n case 'ml':\n case 'mn':\n case 'mr':\n case 'nah':\n case 'nb':\n case 'ne':\n case 'nl':\n case 'nn':\n case 'no':\n case 'om':\n case 'or':\n case 'pa':\n case 'pap':\n case 'ps':\n case 'pt':\n case 'so':\n case 'sq':\n case 'sv':\n case 'sw':\n case 'ta':\n case 'te':\n case 'tk':\n case 'tr':\n case 'ur':\n case 'zu':\n return number == 1 ? 0 : 1;\n\n case 'am':\n case 'bh':\n case 'fil':\n case 'fr':\n case 'gun':\n case 'hi':\n case 'ln':\n case 'mg':\n case 'nso':\n case 'xbr':\n case 'ti':\n case 'wa':\n return number === 0 || number == 1 ? 0 : 1;\n\n case 'be':\n case 'bs':\n case 'hr':\n case 'ru':\n case 'sr':\n case 'uk':\n return number % 10 == 1 && number % 100 != 11 ? 0 : number % 10 >= 2 && number % 10 <= 4 && (number % 100 < 10 || number % 100 >= 20) ? 1 : 2;\n\n case 'cs':\n case 'sk':\n return number == 1 ? 0 : number >= 2 && number <= 4 ? 1 : 2;\n\n case 'ga':\n return number == 1 ? 0 : number == 2 ? 1 : 2;\n\n case 'lt':\n return number % 10 == 1 && number % 100 != 11 ? 0 : number % 10 >= 2 && (number % 100 < 10 || number % 100 >= 20) ? 1 : 2;\n\n case 'sl':\n return number % 100 == 1 ? 0 : number % 100 == 2 ? 1 : number % 100 == 3 || number % 100 == 4 ? 2 : 3;\n\n case 'mk':\n return number % 10 == 1 ? 0 : 1;\n\n case 'mt':\n return number == 1 ? 0 : number === 0 || (number % 100 > 1 && number % 100 < 11) ? 1 : number % 100 > 10 && number % 100 < 20 ? 2 : 3;\n\n case 'lv':\n return number === 0 ? 0 : number % 10 == 1 && number % 100 != 11 ? 1 : 2;\n\n case 'pl':\n return number == 1 ? 0 : number % 10 >= 2 && number % 10 <= 4 && (number % 100 < 12 || number % 100 > 14) ? 1 : 2;\n\n case 'cy':\n return number == 1 ? 0 : number == 2 ? 1 : number == 8 || number == 11 ? 2 : 3;\n\n case 'ro':\n return number == 1 ? 0 : number === 0 || (number % 100 > 0 && number % 100 < 20) ? 1 : 2;\n\n case 'ar':\n return number === 0 ? 0 : number == 1 ? 1 : number == 2 ? 2 : number >= 3 && number <= 10 ? 3 : number >= 11 && number <= 99 ? 4 : 5;\n\n default:\n return 0;\n }\n }\n}\n","function hsvToRgb(h, s, v) {\n let r;\n let g;\n let b;\n\n const i = Math.floor(h * 6);\n const f = h * 6 - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n return {\n r: Math.floor(r * 255),\n g: Math.floor(g * 255),\n b: Math.floor(b * 255),\n };\n}\n\n/**\n * Convert the given string to a unique color.\n *\n * @param {String} string\n * @return {String}\n */\nexport default function stringToColor(string) {\n let num = 0;\n\n // Convert the username into a number based on the ASCII value of each\n // character.\n for (let i = 0; i < string.length; i++) {\n num += string.charCodeAt(i);\n }\n\n // Construct a color using the remainder of that number divided by 360, and\n // some predefined saturation and value values.\n const hue = num % 360;\n const rgb = hsvToRgb(hue / 360, 0.3, 0.9);\n\n return '' + rgb.r.toString(16) + rgb.g.toString(16) + rgb.b.toString(16);\n}\n","/**\n * The `Store` class defines a local data store, and provides methods to\n * retrieve data from the API.\n */\nexport default class Store {\n constructor(models) {\n /**\n * The local data store. A tree of resource types to IDs, such that\n * accessing data[type][id] will return the model for that type/ID.\n *\n * @type {Object}\n * @protected\n */\n this.data = {};\n\n /**\n * The model registry. A map of resource types to the model class that\n * should be used to represent resources of that type.\n *\n * @type {Object}\n * @public\n */\n this.models = models;\n }\n\n /**\n * Push resources contained within an API payload into the store.\n *\n * @param {Object} payload\n * @return {Model|Model[]} The model(s) representing the resource(s) contained\n * within the 'data' key of the payload.\n * @public\n */\n pushPayload(payload) {\n if (payload.included) payload.included.map(this.pushObject.bind(this));\n\n const result = payload.data instanceof Array ? payload.data.map(this.pushObject.bind(this)) : this.pushObject(payload.data);\n\n // Attach the original payload to the model that we give back. This is\n // useful to consumers as it allows them to access meta information\n // associated with their request.\n result.payload = payload;\n\n return result;\n }\n\n /**\n * Create a model to represent a resource object (or update an existing one),\n * and push it into the store.\n *\n * @param {Object} data The resource object\n * @return {Model|null} The model, or null if no model class has been\n * registered for this resource type.\n * @public\n */\n pushObject(data) {\n if (!this.models[data.type]) return null;\n\n const type = (this.data[data.type] = this.data[data.type] || {});\n\n if (type[data.id]) {\n type[data.id].pushData(data);\n } else {\n type[data.id] = this.createRecord(data.type, data);\n }\n\n type[data.id].exists = true;\n\n return type[data.id];\n }\n\n /**\n * Make a request to the API to find record(s) of a specific type.\n *\n * @param {String} type The resource type.\n * @param {Integer|Integer[]|Object} [id] The ID(s) of the model(s) to retrieve.\n * Alternatively, if an object is passed, it will be handled as the\n * `query` parameter.\n * @param {Object} [query]\n * @param {Object} [options]\n * @return {Promise}\n * @public\n */\n find(type, id, query = {}, options = {}) {\n let data = query;\n let url = app.forum.attribute('apiUrl') + '/' + type;\n\n if (id instanceof Array) {\n url += '?filter[id]=' + id.join(',');\n } else if (typeof id === 'object') {\n data = id;\n } else if (id) {\n url += '/' + id;\n }\n\n return app\n .request(\n Object.assign(\n {\n method: 'GET',\n url,\n data,\n },\n options\n )\n )\n .then(this.pushPayload.bind(this));\n }\n\n /**\n * Get a record from the store by ID.\n *\n * @param {String} type The resource type.\n * @param {Integer} id The resource ID.\n * @return {Model}\n * @public\n */\n getById(type, id) {\n return this.data[type] && this.data[type][id];\n }\n\n /**\n * Get a record from the store by the value of a model attribute.\n *\n * @param {String} type The resource type.\n * @param {String} key The name of the method on the model.\n * @param {*} value The value of the model attribute.\n * @return {Model}\n * @public\n */\n getBy(type, key, value) {\n return this.all(type).filter((model) => model[key]() === value)[0];\n }\n\n /**\n * Get all loaded records of a specific type.\n *\n * @param {String} type\n * @return {Model[]}\n * @public\n */\n all(type) {\n const records = this.data[type];\n\n return records ? Object.keys(records).map((id) => records[id]) : [];\n }\n\n /**\n * Remove the given model from the store.\n *\n * @param {Model} model\n */\n remove(model) {\n delete this.data[model.data.type][model.id()];\n }\n\n /**\n * Create a new record of the given type.\n *\n * @param {String} type The resource type\n * @param {Object} [data] Any data to initialize the model with\n * @return {Model}\n * @public\n */\n createRecord(type, data = {}) {\n data.type = data.type || type;\n\n return new this.models[type](data, this);\n }\n}\n","/**\n * The `Session` class defines the current user session. It stores a reference\n * to the current authenticated user, and provides methods to log in/out.\n */\nexport default class Session {\n constructor(user, csrfToken) {\n /**\n * The current authenticated user.\n *\n * @type {User|null}\n * @public\n */\n this.user = user;\n\n /**\n * The CSRF token.\n *\n * @type {String|null}\n * @public\n */\n this.csrfToken = csrfToken;\n }\n\n /**\n * Attempt to log in a user.\n *\n * @param {String} identification The username/email.\n * @param {String} password\n * @param {Object} [options]\n * @return {Promise}\n * @public\n */\n login(data, options = {}) {\n return app.request(\n Object.assign(\n {\n method: 'POST',\n url: app.forum.attribute('baseUrl') + '/login',\n data,\n },\n options\n )\n );\n }\n\n /**\n * Log the user out.\n *\n * @public\n */\n logout() {\n window.location = app.forum.attribute('baseUrl') + '/logout?token=' + this.csrfToken;\n }\n}\n","/**\n * The `Drawer` class controls the page's drawer. The drawer is the area the\n * slides out from the left on mobile devices; it contains the header and the\n * footer.\n */\nexport default class Drawer {\n constructor() {\n // Set up an event handler so that whenever the content area is tapped,\n // the drawer will close.\n $('#content').click((e) => {\n if (this.isOpen()) {\n e.preventDefault();\n this.hide();\n }\n });\n }\n\n /**\n * Check whether or not the drawer is currently open.\n *\n * @return {Boolean}\n * @public\n */\n isOpen() {\n return $('#app').hasClass('drawerOpen');\n }\n\n /**\n * Hide the drawer.\n *\n * @public\n */\n hide() {\n $('#app').removeClass('drawerOpen');\n\n if (this.$backdrop) this.$backdrop.remove();\n }\n\n /**\n * Show the drawer.\n *\n * @public\n */\n show() {\n $('#app').addClass('drawerOpen');\n\n this.$backdrop = $('<div/>')\n .addClass('drawer-backdrop fade')\n .appendTo('body')\n .click(() => this.hide());\n\n setTimeout(() => this.$backdrop.addClass('in'));\n }\n}\n","/**\n * The `mapRoutes` utility converts a map of named application routes into a\n * format that can be understood by Mithril.\n *\n * @see https://lhorie.github.io/mithril/mithril.route.html#defining-routes\n * @param {Object} routes\n * @param {String} [basePath]\n * @return {Object}\n */\nexport default function mapRoutes(routes, basePath = '') {\n const map = {};\n\n for (const key in routes) {\n const route = routes[key];\n\n if (route.component) route.component.props.routeName = key;\n\n map[basePath + route.path] = route.component;\n }\n\n return map;\n}\n","import humanTimeUtil from './humanTime';\n\nfunction updateHumanTimes() {\n $('[data-humantime]').each(function () {\n const $this = $(this);\n const ago = humanTimeUtil($this.attr('datetime'));\n\n $this.html(ago);\n });\n}\n\n/**\n * The `humanTime` initializer sets up a loop every 1 second to update\n * timestamps rendered with the `humanTime` helper.\n */\nexport default function humanTime() {\n setInterval(updateHumanTimes, 10000);\n}\n","import Model from '../Model';\n\nexport default class Forum extends Model {\n apiEndpoint() {\n return '/';\n }\n}\n","import Model from '../Model';\nimport computed from '../utils/computed';\nimport { getPlainContent } from '../utils/string';\n\nexport default class Post extends Model {}\n\nObject.assign(Post.prototype, {\n number: Model.attribute('number'),\n discussion: Model.hasOne('discussion'),\n\n createdAt: Model.attribute('createdAt', Model.transformDate),\n user: Model.hasOne('user'),\n contentType: Model.attribute('contentType'),\n content: Model.attribute('content'),\n contentHtml: Model.attribute('contentHtml'),\n contentPlain: computed('contentHtml', getPlainContent),\n\n editedAt: Model.attribute('editedAt', Model.transformDate),\n editedUser: Model.hasOne('editedUser'),\n isEdited: computed('editedAt', (editedAt) => !!editedAt),\n\n hiddenAt: Model.attribute('hiddenAt', Model.transformDate),\n hiddenUser: Model.hasOne('hiddenUser'),\n isHidden: computed('hiddenAt', (hiddenAt) => !!hiddenAt),\n\n canEdit: Model.attribute('canEdit'),\n canHide: Model.attribute('canHide'),\n canDelete: Model.attribute('canDelete'),\n});\n","import Model from '../Model';\n\nexport default class Notification extends Model {}\n\nObject.assign(Notification.prototype, {\n contentType: Model.attribute('contentType'),\n content: Model.attribute('content'),\n createdAt: Model.attribute('createdAt', Model.transformDate),\n\n isRead: Model.attribute('isRead'),\n\n user: Model.hasOne('user'),\n fromUser: Model.hasOne('fromUser'),\n subject: Model.hasOne('subject'),\n});\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nexport default arrayPush;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","import Symbol from './_Symbol.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nexport default isFlattenable;\n","import arrayPush from './_arrayPush.js';\nimport isFlattenable from './_isFlattenable.js';\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nexport default baseFlatten;\n","import baseFlatten from './_baseFlatten.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\nfunction flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\n}\n\nexport default flattenDeep;\n","import ItemList from './utils/ItemList';\nimport Alert from './components/Alert';\nimport Button from './components/Button';\nimport ModalManager from './components/ModalManager';\nimport AlertManager from './components/AlertManager';\nimport RequestErrorModal from './components/RequestErrorModal';\nimport Translator from './Translator';\nimport Store from './Store';\nimport Session from './Session';\nimport extract from './utils/extract';\nimport Drawer from './utils/Drawer';\nimport mapRoutes from './utils/mapRoutes';\nimport RequestError from './utils/RequestError';\nimport ScrollListener from './utils/ScrollListener';\nimport liveHumanTimes from './utils/liveHumanTimes';\nimport { extend } from './extend';\n\nimport Forum from './models/Forum';\nimport User from './models/User';\nimport Discussion from './models/Discussion';\nimport Post from './models/Post';\nimport Group from './models/Group';\nimport Notification from './models/Notification';\nimport { flattenDeep } from 'lodash-es';\nimport PageState from './states/PageState';\n\n/**\n * The `App` class provides a container for an application, as well as various\n * utilities for the rest of the app to use.\n */\nexport default class Application {\n /**\n * The forum model for this application.\n *\n * @type {Forum}\n * @public\n */\n forum = null;\n\n /**\n * A map of routes, keyed by a unique route name. Each route is an object\n * containing the following properties:\n *\n * - `path` The path that the route is accessed at.\n * - `component` The Mithril component to render when this route is active.\n *\n * @example\n * app.routes.discussion = {path: '/d/:id', component: DiscussionPage.component()};\n *\n * @type {Object}\n * @public\n */\n routes = {};\n\n /**\n * An ordered list of initializers to bootstrap the application.\n *\n * @type {ItemList}\n * @public\n */\n initializers = new ItemList();\n\n /**\n * The app's session.\n *\n * @type {Session}\n * @public\n */\n session = null;\n\n /**\n * The app's translator.\n *\n * @type {Translator}\n * @public\n */\n translator = new Translator();\n\n /**\n * The app's data store.\n *\n * @type {Store}\n * @public\n */\n store = new Store({\n forums: Forum,\n users: User,\n discussions: Discussion,\n posts: Post,\n groups: Group,\n notifications: Notification,\n });\n\n /**\n * A local cache that can be used to store data at the application level, so\n * that is persists between different routes.\n *\n * @type {Object}\n * @public\n */\n cache = {};\n\n /**\n * Whether or not the app has been booted.\n *\n * @type {Boolean}\n * @public\n */\n booted = false;\n\n /**\n * An Alert that was shown as a result of an AJAX request error. If present,\n * it will be dismissed on the next successful request.\n *\n * @type {null|Alert}\n * @private\n */\n requestError = null;\n\n /**\n * The page the app is currently on.\n *\n * This object holds information about the type of page we are currently\n * visiting, and sometimes additional arbitrary page state that may be\n * relevant to lower-level components.\n *\n * @type {PageState}\n */\n current = new PageState(null);\n\n /**\n * The page the app was on before the current page.\n *\n * Once the application navigates to another page, the object previously\n * assigned to this.current will be moved to this.previous, while this.current\n * is re-initialized.\n *\n * @type {PageState}\n */\n previous = new PageState(null);\n\n data;\n\n title = '';\n titleCount = 0;\n\n load(payload) {\n this.data = payload;\n this.translator.locale = payload.locale;\n }\n\n boot() {\n this.initializers.toArray().forEach((initializer) => initializer(this));\n\n this.store.pushPayload({ data: this.data.resources });\n\n this.forum = this.store.getById('forums', 1);\n\n this.session = new Session(this.store.getById('users', this.data.session.userId), this.data.session.csrfToken);\n\n this.mount();\n }\n\n bootExtensions(extensions) {\n Object.keys(extensions).forEach((name) => {\n const extension = extensions[name];\n\n const extenders = flattenDeep(extension.extend);\n\n for (const extender of extenders) {\n extender.extend(this, { name, exports: extension });\n }\n });\n }\n\n mount(basePath = '') {\n this.modal = m.mount(document.getElementById('modal'), <ModalManager />);\n this.alerts = m.mount(document.getElementById('alerts'), <AlertManager />);\n\n this.drawer = new Drawer();\n\n m.route(document.getElementById('content'), basePath + '/', mapRoutes(this.routes, basePath));\n\n // Add a class to the body which indicates that the page has been scrolled\n // down.\n new ScrollListener((top) => {\n const $app = $('#app');\n const offset = $app.offset().top;\n\n $app.toggleClass('affix', top >= offset).toggleClass('scrolled', top > offset);\n }).start();\n\n $(() => {\n $('body').addClass('ontouchstart' in window ? 'touch' : 'no-touch');\n });\n\n liveHumanTimes();\n }\n\n /**\n * Get the API response document that has been preloaded into the application.\n *\n * @return {Object|null}\n * @public\n */\n preloadedApiDocument() {\n if (this.data.apiDocument) {\n const results = this.store.pushPayload(this.data.apiDocument);\n\n this.data.apiDocument = null;\n\n return results;\n }\n\n return null;\n }\n\n /**\n * Set the <title> of the page.\n *\n * @param {String} title\n * @public\n */\n setTitle(title) {\n this.title = title;\n this.updateTitle();\n }\n\n /**\n * Set a number to display in the <title> of the page.\n *\n * @param {Integer} count\n */\n setTitleCount(count) {\n this.titleCount = count;\n this.updateTitle();\n }\n\n updateTitle() {\n document.title = (this.titleCount ? `(${this.titleCount}) ` : '') + (this.title ? this.title + ' - ' : '') + this.forum.attribute('title');\n }\n\n /**\n * Make an AJAX request, handling any low-level errors that may occur.\n *\n * @see https://lhorie.github.io/mithril/mithril.request.html\n * @param {Object} options\n * @return {Promise}\n * @public\n */\n request(originalOptions) {\n const options = Object.assign({}, originalOptions);\n\n // Set some default options if they haven't been overridden. We want to\n // authenticate all requests with the session token. We also want all\n // requests to run asynchronously in the background, so that they don't\n // prevent redraws from occurring.\n options.background = options.background || true;\n\n extend(options, 'config', (result, xhr) => xhr.setRequestHeader('X-CSRF-Token', this.session.csrfToken));\n\n // If the method is something like PATCH or DELETE, which not all servers\n // and clients support, then we'll send it as a POST request with the\n // intended method specified in the X-HTTP-Method-Override header.\n if (options.method !== 'GET' && options.method !== 'POST') {\n const method = options.method;\n extend(options, 'config', (result, xhr) => xhr.setRequestHeader('X-HTTP-Method-Override', method));\n options.method = 'POST';\n }\n\n // When we deserialize JSON data, if for some reason the server has provided\n // a dud response, we don't want the application to crash. We'll show an\n // error message to the user instead.\n options.deserialize = options.deserialize || ((responseText) => responseText);\n\n options.errorHandler =\n options.errorHandler ||\n ((error) => {\n throw error;\n });\n\n // When extracting the data from the response, we can check the server\n // response code and show an error message to the user if something's gone\n // awry.\n const original = options.extract;\n options.extract = (xhr) => {\n let responseText;\n\n if (original) {\n responseText = original(xhr.responseText);\n } else {\n responseText = xhr.responseText || null;\n }\n\n const status = xhr.status;\n\n if (status < 200 || status > 299) {\n throw new RequestError(status, responseText, options, xhr);\n }\n\n if (xhr.getResponseHeader) {\n const csrfToken = xhr.getResponseHeader('X-CSRF-Token');\n if (csrfToken) app.session.csrfToken = csrfToken;\n }\n\n try {\n return JSON.parse(responseText);\n } catch (e) {\n throw new RequestError(500, responseText, options, xhr);\n }\n };\n\n if (this.requestError) this.alerts.dismiss(this.requestError.alert);\n\n // Now make the request. If it's a failure, inspect the error that was\n // returned and show an alert containing its contents.\n const deferred = m.deferred();\n\n m.request(options).then(\n (response) => deferred.resolve(response),\n (error) => {\n this.requestError = error;\n\n let children;\n\n switch (error.status) {\n case 422:\n children = error.response.errors\n .map((error) => [error.detail, <br />])\n .reduce((a, b) => a.concat(b), [])\n .slice(0, -1);\n break;\n\n case 401:\n case 403:\n children = app.translator.trans('core.lib.error.permission_denied_message');\n break;\n\n case 404:\n case 410:\n children = app.translator.trans('core.lib.error.not_found_message');\n break;\n\n case 429:\n children = app.translator.trans('core.lib.error.rate_limit_exceeded_message');\n break;\n\n default:\n children = app.translator.trans('core.lib.error.generic_message');\n }\n\n const isDebug = app.forum.attribute('debug');\n // contains a formatted errors if possible, response must be an JSON API array of errors\n // the details property is decoded to transform escaped characters such as '\\n'\n const formattedError = error.response && Array.isArray(error.response.errors) && error.response.errors.map((e) => decodeURI(e.detail));\n\n error.alert = new Alert({\n type: 'error',\n children,\n controls: isDebug && [\n <Button className=\"Button Button--link\" onclick={this.showDebug.bind(this, error, formattedError)}>\n Debug\n </Button>,\n ],\n });\n\n try {\n options.errorHandler(error);\n } catch (error) {\n if (isDebug && error.xhr) {\n const { method, url } = error.options;\n const { status = '' } = error.xhr;\n\n console.group(`${method} ${url} ${status}`);\n\n console.error(...(formattedError || [error]));\n\n console.groupEnd();\n }\n\n this.alerts.show(error.alert);\n }\n\n deferred.reject(error);\n }\n );\n\n return deferred.promise;\n }\n\n /**\n * @param {RequestError} error\n * @param {string[]} [formattedError]\n * @private\n */\n showDebug(error, formattedError) {\n this.alerts.dismiss(this.requestError.alert);\n\n this.modal.show(new RequestErrorModal({ error, formattedError }));\n }\n\n /**\n * Construct a URL to the route with the given name.\n *\n * @param {String} name\n * @param {Object} params\n * @return {String}\n * @public\n */\n route(name, params = {}) {\n const url = this.routes[name].path.replace(/:([^\\/]+)/g, (m, key) => extract(params, key));\n const queryString = m.route.buildQueryString(params);\n const prefix = m.route.mode === 'pathname' ? app.forum.attribute('basePath') : '';\n\n return prefix + url + (queryString ? '?' + queryString : '');\n }\n}\n","/**\n * The `formatNumber` utility localizes a number into a string with the\n * appropriate punctuation.\n *\n * @example\n * formatNumber(1234);\n * // 1,234\n *\n * @param {Number} number\n * @return {String}\n */\nexport default function formatNumber(number) {\n return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n","/**\n * The `anchorScroll` utility saves the scroll position relative to an element,\n * and then restores it after a callback has been run.\n *\n * This is useful if a redraw will change the page's content above the viewport.\n * Normally doing this will result in the content in the viewport being pushed\n * down or pulled up. By wrapping the redraw with this utility, the scroll\n * position can be anchor to an element that is in or below the viewport, so\n * the content in the viewport will stay the same.\n *\n * @param {DOMElement} element The element to anchor the scroll position to.\n * @param {Function} callback The callback to run that will change page content.\n */\nexport default function anchorScroll(element, callback) {\n const $window = $(window);\n const relativeScroll = $(element).offset().top - $window.scrollTop();\n\n callback();\n\n $window.scrollTop($(element).offset().top - relativeScroll);\n}\n","/**\n * The `evented` mixin provides methods allowing an object to trigger events,\n * running externally registered event handlers.\n */\nexport default {\n /**\n * Arrays of registered event handlers, grouped by the event name.\n *\n * @type {Object}\n * @protected\n */\n handlers: null,\n\n /**\n * Get all of the registered handlers for an event.\n *\n * @param {String} event The name of the event.\n * @return {Array}\n * @protected\n */\n getHandlers(event) {\n this.handlers = this.handlers || {};\n\n this.handlers[event] = this.handlers[event] || [];\n\n return this.handlers[event];\n },\n\n /**\n * Trigger an event.\n *\n * @param {String} event The name of the event.\n * @param {...*} args Arguments to pass to event handlers.\n * @public\n */\n trigger(event, ...args) {\n this.getHandlers(event).forEach((handler) => handler.apply(this, args));\n },\n\n /**\n * Register an event handler.\n *\n * @param {String} event The name of the event.\n * @param {function} handler The function to handle the event.\n */\n on(event, handler) {\n this.getHandlers(event).push(handler);\n },\n\n /**\n * Register an event handler so that it will run only once, and then\n * unregister itself.\n *\n * @param {String} event The name of the event.\n * @param {function} handler The function to handle the event.\n */\n one(event, handler) {\n const wrapper = function () {\n handler.apply(this, arguments);\n\n this.off(event, wrapper);\n };\n\n this.getHandlers(event).push(wrapper);\n },\n\n /**\n * Unregister an event handler.\n *\n * @param {String} event The name of the event.\n * @param {function} handler The function that handles the event.\n */\n off(event, handler) {\n const handlers = this.getHandlers(event);\n const index = handlers.indexOf(handler);\n\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n },\n};\n","import Dropdown from './Dropdown';\nimport Button from './Button';\nimport icon from '../helpers/icon';\n\n/**\n * The `SplitDropdown` component is similar to `Dropdown`, but the first child\n * is displayed as its own button prior to the toggle button.\n */\nexport default class SplitDropdown extends Dropdown {\n static initProps(props) {\n super.initProps(props);\n\n props.className += ' Dropdown--split';\n props.menuClassName += ' Dropdown-menu--right';\n }\n\n getButton() {\n // Make a copy of the props of the first child component. We will assign\n // these props to a new button, so that it has exactly the same behaviour as\n // the first child.\n const firstChild = this.getFirstChild();\n const buttonProps = Object.assign({}, firstChild.props);\n buttonProps.className = (buttonProps.className || '') + ' SplitDropdown-button Button ' + this.props.buttonClassName;\n\n return [\n Button.component(buttonProps),\n <button className={'Dropdown-toggle Button Button--icon ' + this.props.buttonClassName} data-toggle=\"dropdown\">\n {icon(this.props.icon, { className: 'Button-icon' })}\n {icon('fas fa-caret-down', { className: 'Button-caret' })}\n </button>,\n ];\n }\n\n /**\n * Get the first child. If the first child is an array, the first item in that\n * array will be returned.\n *\n * @return {*}\n * @protected\n */\n getFirstChild() {\n let firstChild = this.props.children;\n\n while (firstChild instanceof Array) firstChild = firstChild[0];\n\n return firstChild;\n }\n}\n","/**\n * The `abbreviateNumber` utility converts a number to a shorter localized form.\n *\n * @example\n * abbreviateNumber(1234);\n * // \"1.2K\"\n *\n * @param {Integer} number\n * @return {String}\n */\nexport default function abbreviateNumber(number) {\n // TODO: translation\n if (number >= 1000000) {\n return Math.floor(number / 1000000) + app.translator.trans('core.lib.number_suffix.mega_text');\n } else if (number >= 1000) {\n return Math.floor(number / 1000) + app.translator.trans('core.lib.number_suffix.kilo_text');\n } else {\n return number.toString();\n }\n}\n","import icon from './icon';\n\n/**\n * The `useronline` helper displays a green circle if the user is online\n *\n * @param {User} user\n * @return {Object}\n */\nexport default function userOnline(user) {\n if (user.lastSeenAt() && user.isOnline()) {\n return <span className=\"UserOnline\">{icon('fas fa-circle')}</span>;\n }\n}\n","/**\n * The `fullTime` helper displays a formatted time string wrapped in a <time>\n * tag.\n *\n * @param {Date} time\n * @return {Object}\n */\nexport default function fullTime(time) {\n const mo = moment(time);\n\n const datetime = mo.format();\n const full = mo.format('LLLL');\n\n return (\n <time pubdate datetime={datetime}>\n {full}\n </time>\n );\n}\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","/* global Promise */\r\n\r\n;(function (global, factory) { // eslint-disable-line\r\n\t\"use strict\"\r\n\t/* eslint-disable no-undef */\r\n\tvar m = factory(global)\r\n\t/*\tSet dependencies when no window for isomorphic compatibility */\r\n\tif(typeof window === \"undefined\") {\r\n\t\tm.deps({\r\n\t\t\tdocument: typeof document !== \"undefined\" ? document : {},\r\n\t\t\tlocation: typeof location !== \"undefined\" ? location : {},\r\n\t\t\tclearTimeout: clearTimeout,\r\n\t\t\tsetTimeout: setTimeout\r\n\t\t})\r\n\t}\r\n\tif (typeof module === \"object\" && module != null && module.exports) {\r\n\t\tmodule.exports = m\r\n\t} else if (typeof define === \"function\" && define.amd) {\r\n\t\tdefine(function () { return m })\r\n\t} else {\r\n\t\tglobal.m = m\r\n\t}\r\n\t/* eslint-enable no-undef */\r\n})(typeof window !== \"undefined\" ? window : this, function factory(global, undefined) { // eslint-disable-line\r\n\t\"use strict\"\r\n\r\n\tm.version = function () {\r\n\t\treturn \"v0.2.8\"\r\n\t}\r\n\r\n\tvar hasOwn = {}.hasOwnProperty\r\n\tvar type = {}.toString\r\n\r\n\tfunction isFunction(object) {\r\n\t\treturn typeof object === \"function\"\r\n\t}\r\n\r\n\tfunction isObject(object) {\r\n\t\treturn type.call(object) === \"[object Object]\"\r\n\t}\r\n\r\n\tfunction isString(object) {\r\n\t\treturn type.call(object) === \"[object String]\"\r\n\t}\r\n\r\n\tvar isArray = Array.isArray || function (object) {\r\n\t\treturn type.call(object) === \"[object Array]\"\r\n\t}\r\n\r\n\tfunction noop() {}\r\n\r\n\tvar voidElements = {\r\n\t\tAREA: 1,\r\n\t\tBASE: 1,\r\n\t\tBR: 1,\r\n\t\tCOL: 1,\r\n\t\tCOMMAND: 1,\r\n\t\tEMBED: 1,\r\n\t\tHR: 1,\r\n\t\tIMG: 1,\r\n\t\tINPUT: 1,\r\n\t\tKEYGEN: 1,\r\n\t\tLINK: 1,\r\n\t\tMETA: 1,\r\n\t\tPARAM: 1,\r\n\t\tSOURCE: 1,\r\n\t\tTRACK: 1,\r\n\t\tWBR: 1\r\n\t}\r\n\r\n\t// caching commonly used variables\r\n\tvar $document, $location, $requestAnimationFrame, $cancelAnimationFrame\r\n\r\n\t// self invoking function needed because of the way mocks work\r\n\tfunction initialize(mock) {\r\n\t\t$document = mock.document\r\n\t\t$location = mock.location\r\n\t\t$cancelAnimationFrame = mock.cancelAnimationFrame || mock.clearTimeout\r\n\t\t$requestAnimationFrame = mock.requestAnimationFrame || mock.setTimeout\r\n\t}\r\n\r\n\t// testing API\r\n\tm.deps = function (mock) {\r\n\t\tinitialize(global = mock || window)\r\n\t\treturn global\r\n\t}\r\n\r\n\tm.deps.factory = m.factory = factory\r\n\r\n\tm.deps(global)\r\n\r\n\t/**\r\n\t * @typedef {String} Tag\r\n\t * A string that looks like -> div.classname#id[param=one][param2=two]\r\n\t * Which describes a DOM node\r\n\t */\r\n\r\n\tfunction parseTagAttrs(cell, tag) {\r\n\t\tvar classes = []\r\n\t\t/* eslint-disable max-len */\r\n\t\tvar parser = /(?:(^|#|\\.)([^#\\.\\[\\]]+))|(\\[(.+?)(?:\\s*=\\s*(\"|'|)((?:\\\\[\"'\\]]|.)*?)\\5)?\\])/g\r\n\t\t/* eslint-enable max-len */\r\n\t\tvar match\r\n\r\n\t\twhile ((match = parser.exec(tag))) {\r\n\t\t\tif (match[1] === \"\" && match[2]) {\r\n\t\t\t\tcell.tag = match[2]\r\n\t\t\t} else if (match[1] === \"#\") {\r\n\t\t\t\tcell.attrs.id = match[2]\r\n\t\t\t} else if (match[1] === \".\") {\r\n\t\t\t\tclasses.push(match[2])\r\n\t\t\t} else if (match[3].charAt(0) === \"[\") { // #1195\r\n\t\t\t\tvar attrValue = match[6]\r\n\t\t\t\tif (attrValue) attrValue = attrValue.replace(/\\\\([\"'])/g, \"$1\")\r\n\t\t\t\tif (match[4] === \"class\") classes.push(attrValue)\r\n\t\t\t\telse cell.attrs[match[4]] = attrValue || true\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn classes\r\n\t}\r\n\r\n\tfunction getVirtualChildren(args, hasAttrs) {\r\n\t\tvar children = hasAttrs ? args.slice(1) : args\r\n\r\n\t\tif (children.length === 1 && isArray(children[0])) {\r\n\t\t\treturn children[0]\r\n\t\t} else {\r\n\t\t\treturn children\r\n\t\t}\r\n\t}\r\n\r\n\tfunction assignAttrs(target, attrs, classes) {\r\n\t\tvar classAttr = \"class\" in attrs ? \"class\" : \"className\"\r\n\r\n\t\tfor (var attrName in attrs) {\r\n\t\t\tif (hasOwn.call(attrs, attrName)) {\r\n\t\t\t\tif (attrName === classAttr &&\r\n\t\t\t\t\t\tattrs[attrName] != null &&\r\n\t\t\t\t\t\tattrs[attrName] !== \"\") {\r\n\t\t\t\t\tclasses.push(attrs[attrName])\r\n\t\t\t\t\t// create key in correct iteration order\r\n\t\t\t\t\ttarget[attrName] = \"\"\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttarget[attrName] = attrs[attrName]\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (classes.length) target[classAttr] = classes.join(\" \")\r\n\t}\r\n\r\n\t/**\r\n\t *\r\n\t * @param {Tag} The DOM node tag\r\n\t * @param {Object=[]} optional key-value pairs to be mapped to DOM attrs\r\n\t * @param {...mNode=[]} Zero or more Mithril child nodes. Can be an array,\r\n\t * or splat (optional)\r\n\t */\r\n\tfunction m(tag, pairs) {\r\n\t\tvar args = []\r\n\r\n\t\tfor (var i = 1, length = arguments.length; i < length; i++) {\r\n\t\t\targs[i - 1] = arguments[i]\r\n\t\t}\r\n\r\n\t\tif (tag && isFunction(tag.view)) return parameterize(tag, args)\r\n\r\n\t\tif (!isString(tag)) {\r\n\t\t\tthrow new Error(\"selector in m(selector, attrs, children) should \" +\r\n\t\t\t\t\"be a string\")\r\n\t\t}\r\n\r\n\t\tvar hasAttrs = pairs != null && isObject(pairs) &&\r\n\t\t\t!(\"tag\" in pairs || \"view\" in pairs || \"subtree\" in pairs)\r\n\r\n\t\tvar attrs = hasAttrs ? pairs : {}\r\n\t\tvar cell = {\r\n\t\t\ttag: \"div\",\r\n\t\t\tattrs: {},\r\n\t\t\tchildren: getVirtualChildren(args, hasAttrs)\r\n\t\t}\r\n\r\n\t\tassignAttrs(cell.attrs, attrs, parseTagAttrs(cell, tag))\r\n\t\treturn cell\r\n\t}\r\n\r\n\tfunction forEach(list, f) {\r\n\t\tfor (var i = 0; i < list.length && !f(list[i], i++);) {\r\n\t\t\t// function called in condition\r\n\t\t}\r\n\t}\r\n\r\n\tfunction forKeys(list, f) {\r\n\t\tforEach(list, function (attrs, i) {\r\n\t\t\treturn (attrs = attrs && attrs.attrs) &&\r\n\t\t\t\tattrs.key != null &&\r\n\t\t\t\tf(attrs, i)\r\n\t\t})\r\n\t}\r\n\t// This function was causing deopts in Chrome.\r\n\tfunction dataToString(data) {\r\n\t\t// data.toString() might throw or return null if data is the return\r\n\t\t// value of Console.log in some versions of Firefox (behavior depends on\r\n\t\t// version)\r\n\t\ttry {\r\n\t\t\tif (typeof data !== \"boolean\" &&\r\n\t\t\t\t\tdata != null &&\r\n\t\t\t\t\tdata.toString() != null) return data\r\n\t\t} catch (e) {\r\n\t\t\t// silently ignore errors\r\n\t\t}\r\n\t\treturn \"\"\r\n\t}\r\n\r\n\t// This function was causing deopts in Chrome.\r\n\tfunction injectTextNode(parentElement, first, index, data) {\r\n\t\ttry {\r\n\t\t\tinsertNode(parentElement, first, index)\r\n\t\t\tfirst.nodeValue = data\r\n\t\t} catch (e) {\r\n\t\t\t// IE erroneously throws error when appending an empty text node\r\n\t\t\t// after a null\r\n\t\t}\r\n\t}\r\n\r\n\tfunction flatten(list) {\r\n\t\t// recursively flatten array\r\n\t\tfor (var i = 0; i < list.length; i++) {\r\n\t\t\tif (isArray(list[i])) {\r\n\t\t\t\tlist = list.concat.apply([], list)\r\n\t\t\t\t// check current index again and flatten until there are no more\r\n\t\t\t\t// nested arrays at that index\r\n\t\t\t\ti--\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn list\r\n\t}\r\n\r\n\tfunction insertNode(parentElement, node, index) {\r\n\t\tparentElement.insertBefore(node,\r\n\t\t\tparentElement.childNodes[index] || null)\r\n\t}\r\n\r\n\tvar DELETION = 1\r\n\tvar INSERTION = 2\r\n\tvar MOVE = 3\r\n\r\n\tfunction handleKeysDiffer(data, existing, cached, parentElement) {\r\n\t\tforKeys(data, function (key, i) {\r\n\t\t\texisting[key = key.key] = existing[key] ? {\r\n\t\t\t\taction: MOVE,\r\n\t\t\t\tindex: i,\r\n\t\t\t\tfrom: existing[key].index,\r\n\t\t\t\telement: cached.nodes[existing[key].index] ||\r\n\t\t\t\t\t$document.createElement(\"div\")\r\n\t\t\t} : {action: INSERTION, index: i}\r\n\t\t})\r\n\r\n\t\tvar actions = []\r\n\t\tfor (var prop in existing) {\r\n\t\t\tif (hasOwn.call(existing, prop)) {\r\n\t\t\t\tactions.push(existing[prop])\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar changes = actions.sort(sortChanges)\r\n\t\tvar newCached = new Array(cached.length)\r\n\r\n\t\tnewCached.nodes = cached.nodes.slice()\r\n\r\n\t\tforEach(changes, function (change) {\r\n\t\t\tvar index = change.index\r\n\t\t\tif (change.action === DELETION) {\r\n\t\t\t\tclear(cached[index].nodes, cached[index])\r\n\t\t\t\tnewCached.splice(index, 1)\r\n\t\t\t}\r\n\t\t\tif (change.action === INSERTION) {\r\n\t\t\t\tvar dummy = $document.createElement(\"div\")\r\n\t\t\t\tdummy.key = data[index].attrs.key\r\n\t\t\t\tinsertNode(parentElement, dummy, index)\r\n\t\t\t\tnewCached.splice(index, 0, {\r\n\t\t\t\t\tattrs: {key: data[index].attrs.key},\r\n\t\t\t\t\tnodes: [dummy]\r\n\t\t\t\t})\r\n\t\t\t\tnewCached.nodes[index] = dummy\r\n\t\t\t}\r\n\r\n\t\t\tif (change.action === MOVE) {\r\n\t\t\t\tvar changeElement = change.element\r\n\t\t\t\tvar maybeChanged = parentElement.childNodes[index]\r\n\t\t\t\tif (maybeChanged !== changeElement && changeElement !== null) {\r\n\t\t\t\t\tparentElement.insertBefore(changeElement,\r\n\t\t\t\t\t\tmaybeChanged || null)\r\n\t\t\t\t}\r\n\t\t\t\tnewCached[index] = cached[change.from]\r\n\t\t\t\tnewCached.nodes[index] = changeElement\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\treturn newCached\r\n\t}\r\n\r\n\tfunction diffKeys(data, cached, existing, parentElement) {\r\n\t\tvar keysDiffer = data.length !== cached.length\r\n\r\n\t\tif (!keysDiffer) {\r\n\t\t\tforKeys(data, function (attrs, i) {\r\n\t\t\t\tvar cachedCell = cached[i]\r\n\t\t\t\treturn keysDiffer = cachedCell &&\r\n\t\t\t\t\tcachedCell.attrs &&\r\n\t\t\t\t\tcachedCell.attrs.key !== attrs.key\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tif (keysDiffer) {\r\n\t\t\treturn handleKeysDiffer(data, existing, cached, parentElement)\r\n\t\t} else {\r\n\t\t\treturn cached\r\n\t\t}\r\n\t}\r\n\r\n\tfunction diffArray(data, cached, nodes) {\r\n\t\t// diff the array itself\r\n\r\n\t\t// update the list of DOM nodes by collecting the nodes from each item\r\n\t\tforEach(data, function (_, i) {\r\n\t\t\tif (cached[i] != null) nodes.push.apply(nodes, cached[i].nodes)\r\n\t\t})\r\n\t\t// remove items from the end of the array if the new array is shorter\r\n\t\t// than the old one. if errors ever happen here, the issue is most\r\n\t\t// likely a bug in the construction of the `cached` data structure\r\n\t\t// somewhere earlier in the program\r\n\t\tforEach(cached.nodes, function (node, i) {\r\n\t\t\tif (node.parentNode != null && nodes.indexOf(node) < 0) {\r\n\t\t\t\tclear([node], [cached[i]])\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tif (data.length < cached.length) cached.length = data.length\r\n\t\tcached.nodes = nodes\r\n\t}\r\n\r\n\tfunction buildArrayKeys(data) {\r\n\t\tvar guid = 0\r\n\t\tforKeys(data, function () {\r\n\t\t\tforEach(data, function (attrs) {\r\n\t\t\t\tif ((attrs = attrs && attrs.attrs) && attrs.key == null) {\r\n\t\t\t\t\tattrs.key = \"__mithril__\" + guid++\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\treturn 1\r\n\t\t})\r\n\t}\r\n\r\n\tfunction isDifferentEnough(data, cached, dataAttrKeys) {\r\n\t\tif (data.tag !== cached.tag) return true\r\n\r\n\t\tif (dataAttrKeys.sort().join() !==\r\n\t\t\t\tObject.keys(cached.attrs).sort().join()) {\r\n\t\t\treturn true\r\n\t\t}\r\n\r\n\t\tif (data.attrs.id !== cached.attrs.id) {\r\n\t\t\treturn true\r\n\t\t}\r\n\r\n\t\tif (data.attrs.key !== cached.attrs.key) {\r\n\t\t\treturn true\r\n\t\t}\r\n\r\n\t\tif (m.redraw.strategy() === \"all\") {\r\n\t\t\treturn !cached.configContext || cached.configContext.retain !== true\r\n\t\t}\r\n\r\n\t\tif (m.redraw.strategy() === \"diff\") {\r\n\t\t\treturn cached.configContext && cached.configContext.retain === false\r\n\t\t}\r\n\r\n\t\treturn false\r\n\t}\r\n\r\n\tfunction maybeRecreateObject(data, cached, dataAttrKeys) {\r\n\t\t// if an element is different enough from the one in cache, recreate it\r\n\t\tif (isDifferentEnough(data, cached, dataAttrKeys)) {\r\n\t\t\tif (cached.nodes.length) clear(cached.nodes)\r\n\r\n\t\t\tif (cached.configContext &&\r\n\t\t\t\t\tisFunction(cached.configContext.onunload)) {\r\n\t\t\t\tcached.configContext.onunload()\r\n\t\t\t}\r\n\r\n\t\t\tif (cached.controllers) {\r\n\t\t\t\tforEach(cached.controllers, function (controller) {\r\n\t\t\t\t\tif (controller.onunload) {\r\n\t\t\t\t\t\tcontroller.onunload({preventDefault: noop})\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction getObjectNamespace(data, namespace) {\r\n\t\tif (data.attrs.xmlns) return data.attrs.xmlns\r\n\t\tif (data.tag === \"svg\") return \"http://www.w3.org/2000/svg\"\r\n\t\tif (data.tag === \"math\") return \"http://www.w3.org/1998/Math/MathML\"\r\n\t\treturn namespace\r\n\t}\r\n\r\n\tvar pendingRequests = 0\r\n\tm.startComputation = function () { pendingRequests++ }\r\n\tm.endComputation = function () {\r\n\t\tif (pendingRequests > 1) {\r\n\t\t\tpendingRequests--\r\n\t\t} else {\r\n\t\t\tpendingRequests = 0\r\n\t\t\tm.redraw()\r\n\t\t}\r\n\t}\r\n\r\n\tfunction unloadCachedControllers(cached, views, controllers) {\r\n\t\tif (controllers.length) {\r\n\t\t\tcached.views = views\r\n\t\t\tcached.controllers = controllers\r\n\t\t\tforEach(controllers, function (controller) {\r\n\t\t\t\tif (controller.onunload && controller.onunload.$old) {\r\n\t\t\t\t\tcontroller.onunload = controller.onunload.$old\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (pendingRequests && controller.onunload) {\r\n\t\t\t\t\tvar onunload = controller.onunload\r\n\t\t\t\t\tcontroller.onunload = function (){}\r\n\t\t\t\t\tcontroller.onunload.$old = onunload\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\tfunction scheduleConfigsToBeCalled(configs, data, node, isNew, cached) {\r\n\t\t// schedule configs to be called. They are called after `build` finishes\r\n\t\t// running\r\n\t\tif (isFunction(data.attrs.config)) {\r\n\t\t\tvar context = cached.configContext = cached.configContext || {}\r\n\r\n\t\t\t// bind\r\n\t\t\tconfigs.push(function () {\r\n\t\t\t\treturn data.attrs.config.call(data, node, !isNew, context,\r\n\t\t\t\t\tcached)\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\tfunction buildUpdatedNode(\r\n\t\tcached,\r\n\t\tdata,\r\n\t\teditable,\r\n\t\thasKeys,\r\n\t\tnamespace,\r\n\t\tviews,\r\n\t\tconfigs,\r\n\t\tcontrollers\r\n\t) {\r\n\t\tvar node = cached.nodes[0]\r\n\r\n\t\tif (hasKeys) {\r\n\t\t\tsetAttributes(node, data.tag, data.attrs, cached.attrs, namespace)\r\n\t\t}\r\n\r\n\t\tcached.children = build(\r\n\t\t\tnode,\r\n\t\t\tdata.tag,\r\n\t\t\tundefined,\r\n\t\t\tundefined,\r\n\t\t\tdata.children,\r\n\t\t\tcached.children,\r\n\t\t\tfalse,\r\n\t\t\t0,\r\n\t\t\tdata.attrs.contenteditable ? node : editable,\r\n\t\t\tnamespace,\r\n\t\t\tconfigs\r\n\t\t)\r\n\r\n\t\tcached.nodes.intact = true\r\n\r\n\t\tif (controllers.length) {\r\n\t\t\tcached.views = views\r\n\t\t\tcached.controllers = controllers\r\n\t\t}\r\n\r\n\t\treturn node\r\n\t}\r\n\r\n\tfunction handleNonexistentNodes(data, parentElement, index) {\r\n\t\tvar nodes\r\n\t\tif (data.$trusted) {\r\n\t\t\tnodes = injectHTML(parentElement, index, data)\r\n\t\t} else {\r\n\t\t\tnodes = [$document.createTextNode(data)]\r\n\t\t\tif (!(parentElement.nodeName in voidElements)) {\r\n\t\t\t\tinsertNode(parentElement, nodes[0], index)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar cached\r\n\r\n\t\tif (typeof data === \"string\" ||\r\n\t\t\t\ttypeof data === \"number\" ||\r\n\t\t\t\ttypeof data === \"boolean\") {\r\n\t\t\tcached = new data.constructor(data)\r\n\t\t} else {\r\n\t\t\tcached = data\r\n\t\t}\r\n\r\n\t\tcached.nodes = nodes\r\n\t\treturn cached\r\n\t}\r\n\r\n\tfunction reattachNodes(\r\n\t\tdata,\r\n\t\tcached,\r\n\t\tparentElement,\r\n\t\teditable,\r\n\t\tindex,\r\n\t\tparentTag\r\n\t) {\r\n\t\tvar nodes = cached.nodes\r\n\t\tif (!editable || editable !== $document.activeElement ||\r\n\t\t\t\tdata !== cached) {\r\n\t\t\tif (data.$trusted) {\r\n\t\t\t\tclear(nodes, cached)\r\n\t\t\t\tnodes = injectHTML(parentElement, index, data)\r\n\t\t\t} else if (parentTag === \"textarea\") {\r\n\t\t\t\t// <textarea> uses `value` instead of `nodeValue`.\r\n\t\t\t\tparentElement.value = data\r\n\t\t\t} else if (editable) {\r\n\t\t\t\t// contenteditable nodes use `innerHTML` instead of `nodeValue`.\r\n\t\t\t\teditable.innerHTML = data\r\n\t\t\t\tnodes = [].slice.call(editable.childNodes)\r\n\t\t\t} else {\r\n\t\t\t\t// was a trusted string\r\n\t\t\t\tif (nodes[0].nodeType === 1 || nodes.length > 1 ||\r\n\t\t\t\t\t\t(nodes[0].nodeValue.trim &&\r\n\t\t\t\t\t\t\t!nodes[0].nodeValue.trim())) {\r\n\t\t\t\t\tclear(cached.nodes, cached)\r\n\t\t\t\t\tnodes = [$document.createTextNode(data)]\r\n\t\t\t\t}\r\n\r\n\t\t\t\tinjectTextNode(parentElement, nodes[0], index, data)\r\n\t\t\t}\r\n\t\t}\r\n\t\tcached = new data.constructor(data)\r\n\t\tcached.nodes = nodes\r\n\t\tcached.$trusted = data.$trusted\r\n\t\treturn cached\r\n\t}\r\n\r\n\tfunction handleTextNode(\r\n\t\tcached,\r\n\t\tdata,\r\n\t\tindex,\r\n\t\tparentElement,\r\n\t\tshouldReattach,\r\n\t\teditable,\r\n\t\tparentTag\r\n\t) {\r\n\t\tif (!cached.nodes.length) {\r\n\t\t\treturn handleNonexistentNodes(data, parentElement, index)\r\n\t\t} else if (cached.valueOf() !== data.valueOf() || shouldReattach) {\r\n\t\t\treturn reattachNodes(data, cached, parentElement, editable, index,\r\n\t\t\t\tparentTag)\r\n\t\t} else {\r\n\t\t\treturn (cached.nodes.intact = true, cached)\r\n\t\t}\r\n\t}\r\n\r\n\tfunction getSubArrayCount(item) {\r\n\t\tif (item.$trusted) {\r\n\t\t\t// fix offset of next element if item was a trusted string w/ more\r\n\t\t\t// than one html element\r\n\t\t\treturn item.nodes.length\r\n\t\t} else if (isArray(item)) {\r\n\t\t\treturn item.length\r\n\t\t}\r\n\t\treturn 1\r\n\t}\r\n\r\n\tfunction buildArray(\r\n\t\tdata,\r\n\t\tcached,\r\n\t\tparentElement,\r\n\t\tindex,\r\n\t\tparentTag,\r\n\t\tshouldReattach,\r\n\t\teditable,\r\n\t\tnamespace,\r\n\t\tconfigs\r\n\t) {\r\n\t\tdata = flatten(data)\r\n\t\tvar nodes = []\r\n\t\tvar intact = cached.length === data.length\r\n\t\tvar subArrayCount = 0\r\n\r\n\t\t// keys algorithm: sort elements without recreating them if keys are\r\n\t\t// present\r\n\t\t//\r\n\t\t// 1) create a map of all existing keys, and mark all for deletion\r\n\t\t// 2) add new keys to map and mark them for addition\r\n\t\t// 3) if key exists in new list, change action from deletion to a move\r\n\t\t// 4) for each key, handle its corresponding action as marked in\r\n\t\t// previous steps\r\n\r\n\t\tvar existing = {}\r\n\t\tvar shouldMaintainIdentities = false\r\n\r\n\t\tforKeys(cached, function (attrs, i) {\r\n\t\t\tshouldMaintainIdentities = true\r\n\t\t\texisting[cached[i].attrs.key] = {action: DELETION, index: i}\r\n\t\t})\r\n\r\n\t\tbuildArrayKeys(data)\r\n\t\tif (shouldMaintainIdentities) {\r\n\t\t\tcached = diffKeys(data, cached, existing, parentElement)\r\n\t\t}\r\n\t\t// end key algorithm\r\n\r\n\t\tvar cacheCount = 0\r\n\t\t// faster explicitly written\r\n\t\tfor (var i = 0, len = data.length; i < len; i++) {\r\n\t\t\t// diff each item in the array\r\n\t\t\tvar item = build(\r\n\t\t\t\tparentElement,\r\n\t\t\t\tparentTag,\r\n\t\t\t\tcached,\r\n\t\t\t\tindex,\r\n\t\t\t\tdata[i],\r\n\t\t\t\tcached[cacheCount],\r\n\t\t\t\tshouldReattach,\r\n\t\t\t\tindex + subArrayCount || subArrayCount,\r\n\t\t\t\teditable,\r\n\t\t\t\tnamespace,\r\n\t\t\t\tconfigs)\r\n\r\n\t\t\tif (item !== undefined) {\r\n\t\t\t\tintact = intact && item.nodes.intact\r\n\t\t\t\tsubArrayCount += getSubArrayCount(item)\r\n\t\t\t\tcached[cacheCount++] = item\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!intact) diffArray(data, cached, nodes)\r\n\t\treturn cached\r\n\t}\r\n\r\n\tfunction makeCache(data, cached, index, parentIndex, parentCache) {\r\n\t\tif (cached != null) {\r\n\t\t\tif (type.call(cached) === type.call(data)) return cached\r\n\r\n\t\t\tif (parentCache && parentCache.nodes) {\r\n\t\t\t\tvar offset = index - parentIndex\r\n\t\t\t\tvar end = offset + (isArray(data) ? data : cached.nodes).length\r\n\t\t\t\tclear(\r\n\t\t\t\t\tparentCache.nodes.slice(offset, end),\r\n\t\t\t\t\tparentCache.slice(offset, end))\r\n\t\t\t} else if (cached.nodes) {\r\n\t\t\t\tclear(cached.nodes, cached)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tcached = new data.constructor()\r\n\t\t// if constructor creates a virtual dom element, use a blank object as\r\n\t\t// the base cached node instead of copying the virtual el (#277)\r\n\t\tif (cached.tag) cached = {}\r\n\t\tcached.nodes = []\r\n\t\treturn cached\r\n\t}\r\n\r\n\tfunction constructNode(data, namespace) {\r\n\t\tif (data.attrs.is) {\r\n\t\t\tif (namespace == null) {\r\n\t\t\t\treturn $document.createElement(data.tag, data.attrs.is)\r\n\t\t\t} else {\r\n\t\t\t\treturn $document.createElementNS(namespace, data.tag,\r\n\t\t\t\t\tdata.attrs.is)\r\n\t\t\t}\r\n\t\t} else if (namespace == null) {\r\n\t\t\treturn $document.createElement(data.tag)\r\n\t\t} else {\r\n\t\t\treturn $document.createElementNS(namespace, data.tag)\r\n\t\t}\r\n\t}\r\n\r\n\tfunction constructAttrs(data, node, namespace, hasKeys) {\r\n\t\tif (hasKeys) {\r\n\t\t\treturn setAttributes(node, data.tag, data.attrs, {}, namespace)\r\n\t\t} else {\r\n\t\t\treturn data.attrs\r\n\t\t}\r\n\t}\r\n\r\n\tfunction constructChildren(\r\n\t\tdata,\r\n\t\tnode,\r\n\t\tcached,\r\n\t\teditable,\r\n\t\tnamespace,\r\n\t\tconfigs\r\n\t) {\r\n\t\tif (data.children != null && data.children.length > 0) {\r\n\t\t\treturn build(\r\n\t\t\t\tnode,\r\n\t\t\t\tdata.tag,\r\n\t\t\t\tundefined,\r\n\t\t\t\tundefined,\r\n\t\t\t\tdata.children,\r\n\t\t\t\tcached.children,\r\n\t\t\t\ttrue,\r\n\t\t\t\t0,\r\n\t\t\t\tdata.attrs.contenteditable ? node : editable,\r\n\t\t\t\tnamespace,\r\n\t\t\t\tconfigs)\r\n\t\t} else {\r\n\t\t\treturn data.children\r\n\t\t}\r\n\t}\r\n\r\n\tfunction reconstructCached(\r\n\t\tdata,\r\n\t\tattrs,\r\n\t\tchildren,\r\n\t\tnode,\r\n\t\tnamespace,\r\n\t\tviews,\r\n\t\tcontrollers\r\n\t) {\r\n\t\tvar cached = {\r\n\t\t\ttag: data.tag,\r\n\t\t\tattrs: attrs,\r\n\t\t\tchildren: children,\r\n\t\t\tnodes: [node]\r\n\t\t}\r\n\r\n\t\tunloadCachedControllers(cached, views, controllers)\r\n\r\n\t\tif (cached.children && !cached.children.nodes) {\r\n\t\t\tcached.children.nodes = []\r\n\t\t}\r\n\r\n\t\treturn cached\r\n\t}\r\n\r\n\tfunction getController(views, view, cachedControllers, controller) {\r\n\t\tvar controllerIndex\r\n\r\n\t\tif (m.redraw.strategy() === \"diff\" && views) {\r\n\t\t\tcontrollerIndex = views.indexOf(view)\r\n\t\t} else {\r\n\t\t\tcontrollerIndex = -1\r\n\t\t}\r\n\r\n\t\tif (controllerIndex > -1) {\r\n\t\t\treturn cachedControllers[controllerIndex]\r\n\t\t} else if (isFunction(controller)) {\r\n\t\t\treturn new controller()\r\n\t\t} else {\r\n\t\t\treturn {}\r\n\t\t}\r\n\t}\r\n\r\n\tvar unloaders = []\r\n\r\n\tfunction updateLists(views, controllers, view, controller) {\r\n\t\tif (controller.onunload != null &&\r\n\t\t\t\tunloaders.map(function (u) { return u.handler })\r\n\t\t\t\t\t.indexOf(controller.onunload) < 0) {\r\n\t\t\tunloaders.push({\r\n\t\t\t\tcontroller: controller,\r\n\t\t\t\thandler: controller.onunload\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tviews.push(view)\r\n\t\tcontrollers.push(controller)\r\n\t}\r\n\r\n\tvar forcing = false\r\n\tfunction checkView(\r\n\t\tdata,\r\n\t\tview,\r\n\t\tcached,\r\n\t\tcachedControllers,\r\n\t\tcontrollers,\r\n\t\tviews\r\n\t) {\r\n\t\tvar controller = getController(\r\n\t\t\tcached.views,\r\n\t\t\tview,\r\n\t\t\tcachedControllers,\r\n\t\t\tdata.controller)\r\n\r\n\t\tvar key = data && data.attrs && data.attrs.key\r\n\r\n\t\tif (pendingRequests === 0 ||\r\n\t\t\t\tforcing ||\r\n\t\t\t\tcachedControllers &&\r\n\t\t\t\t\tcachedControllers.indexOf(controller) > -1) {\r\n\t\t\tdata = data.view(controller)\r\n\t\t} else {\r\n\t\t\tdata = {tag: \"placeholder\"}\r\n\t\t}\r\n\r\n\t\tif (data.subtree === \"retain\") return data\r\n\t\tdata.attrs = data.attrs || {}\r\n\t\tdata.attrs.key = key\r\n\t\tupdateLists(views, controllers, view, controller)\r\n\t\treturn data\r\n\t}\r\n\r\n\tfunction markViews(data, cached, views, controllers) {\r\n\t\tvar cachedControllers = cached && cached.controllers\r\n\r\n\t\twhile (data.view != null) {\r\n\t\t\tdata = checkView(\r\n\t\t\t\tdata,\r\n\t\t\t\tdata.view.$original || data.view,\r\n\t\t\t\tcached,\r\n\t\t\t\tcachedControllers,\r\n\t\t\t\tcontrollers,\r\n\t\t\t\tviews)\r\n\t\t}\r\n\r\n\t\treturn data\r\n\t}\r\n\r\n\tfunction buildObject( // eslint-disable-line max-statements\r\n\t\tdata,\r\n\t\tcached,\r\n\t\teditable,\r\n\t\tparentElement,\r\n\t\tindex,\r\n\t\tshouldReattach,\r\n\t\tnamespace,\r\n\t\tconfigs\r\n\t) {\r\n\t\tvar views = []\r\n\t\tvar controllers = []\r\n\r\n\t\tdata = markViews(data, cached, views, controllers)\r\n\r\n\t\tif (data.subtree === \"retain\") return cached\r\n\r\n\t\tif (!data.tag && controllers.length) {\r\n\t\t\tthrow new Error(\"Component template must return a virtual \" +\r\n\t\t\t\t\"element, not an array, string, etc.\")\r\n\t\t}\r\n\r\n\t\tdata.attrs = data.attrs || {}\r\n\t\tcached.attrs = cached.attrs || {}\r\n\r\n\t\tvar dataAttrKeys = Object.keys(data.attrs)\r\n\t\tvar hasKeys = dataAttrKeys.length > (\"key\" in data.attrs ? 1 : 0)\r\n\r\n\t\tmaybeRecreateObject(data, cached, dataAttrKeys)\r\n\r\n\t\tif (!isString(data.tag)) return\r\n\r\n\t\tvar isNew = cached.nodes.length === 0\r\n\r\n\t\tnamespace = getObjectNamespace(data, namespace)\r\n\r\n\t\tvar node\r\n\t\tif (isNew) {\r\n\t\t\tnode = constructNode(data, namespace)\r\n\t\t\t// set attributes first, then create children\r\n\t\t\tvar attrs = constructAttrs(data, node, namespace, hasKeys)\r\n\r\n\t\t\t// add the node to its parent before attaching children to it\r\n\t\t\tinsertNode(parentElement, node, index)\r\n\r\n\t\t\tvar children = constructChildren(data, node, cached, editable,\r\n\t\t\t\tnamespace, configs)\r\n\r\n\t\t\tcached = reconstructCached(\r\n\t\t\t\tdata,\r\n\t\t\t\tattrs,\r\n\t\t\t\tchildren,\r\n\t\t\t\tnode,\r\n\t\t\t\tnamespace,\r\n\t\t\t\tviews,\r\n\t\t\t\tcontrollers)\r\n\t\t} else {\r\n\t\t\tnode = buildUpdatedNode(\r\n\t\t\t\tcached,\r\n\t\t\t\tdata,\r\n\t\t\t\teditable,\r\n\t\t\t\thasKeys,\r\n\t\t\t\tnamespace,\r\n\t\t\t\tviews,\r\n\t\t\t\tconfigs,\r\n\t\t\t\tcontrollers)\r\n\t\t}\r\n\r\n\t\t// edge case: setting value on <select> doesn't work before children\r\n\t\t// exist, so set it again after children have been created/updated\r\n\t\tif (data.tag === \"select\" && \"value\" in data.attrs) {\r\n\t\t\tsetAttributes(node, data.tag, {value: data.attrs.value}, {},\r\n\t\t\t\tnamespace)\r\n\t\t}\r\n\r\n\t\tif (!isNew && shouldReattach === true && node != null) {\r\n\t\t\tinsertNode(parentElement, node, index)\r\n\t\t}\r\n\r\n\t\t// The configs are called after `build` finishes running\r\n\t\tscheduleConfigsToBeCalled(configs, data, node, isNew, cached)\r\n\r\n\t\treturn cached\r\n\t}\r\n\r\n\tfunction build(\r\n\t\tparentElement,\r\n\t\tparentTag,\r\n\t\tparentCache,\r\n\t\tparentIndex,\r\n\t\tdata,\r\n\t\tcached,\r\n\t\tshouldReattach,\r\n\t\tindex,\r\n\t\teditable,\r\n\t\tnamespace,\r\n\t\tconfigs\r\n\t) {\r\n\t\t/*\r\n\t\t * `build` is a recursive function that manages creation/diffing/removal\r\n\t\t * of DOM elements based on comparison between `data` and `cached` the\r\n\t\t * diff algorithm can be summarized as this:\r\n\t\t *\r\n\t\t * 1 - compare `data` and `cached`\r\n\t\t * 2 - if they are different, copy `data` to `cached` and update the DOM\r\n\t\t * based on what the difference is\r\n\t\t * 3 - recursively apply this algorithm for every array and for the\r\n\t\t * children of every virtual element\r\n\t\t *\r\n\t\t * The `cached` data structure is essentially the same as the previous\r\n\t\t * redraw's `data` data structure, with a few additions:\r\n\t\t * - `cached` always has a property called `nodes`, which is a list of\r\n\t\t * DOM elements that correspond to the data represented by the\r\n\t\t * respective virtual element\r\n\t\t * - in order to support attaching `nodes` as a property of `cached`,\r\n\t\t * `cached` is *always* a non-primitive object, i.e. if the data was\r\n\t\t * a string, then cached is a String instance. If data was `null` or\r\n\t\t * `undefined`, cached is `new String(\"\")`\r\n\t\t * - `cached also has a `configContext` property, which is the state\r\n\t\t * storage object exposed by config(element, isInitialized, context)\r\n\t\t * - when `cached` is an Object, it represents a virtual element; when\r\n\t\t * it's an Array, it represents a list of elements; when it's a\r\n\t\t * String, Number or Boolean, it represents a text node\r\n\t\t *\r\n\t\t * `parentElement` is a DOM element used for W3C DOM API calls\r\n\t\t * `parentTag` is only used for handling a corner case for textarea\r\n\t\t * values\r\n\t\t * `parentCache` is used to remove nodes in some multi-node cases\r\n\t\t * `parentIndex` and `index` are used to figure out the offset of nodes.\r\n\t\t * They're artifacts from before arrays started being flattened and are\r\n\t\t * likely refactorable\r\n\t\t * `data` and `cached` are, respectively, the new and old nodes being\r\n\t\t * diffed\r\n\t\t * `shouldReattach` is a flag indicating whether a parent node was\r\n\t\t * recreated (if so, and if this node is reused, then this node must\r\n\t\t * reattach itself to the new parent)\r\n\t\t * `editable` is a flag that indicates whether an ancestor is\r\n\t\t * contenteditable\r\n\t\t * `namespace` indicates the closest HTML namespace as it cascades down\r\n\t\t * from an ancestor\r\n\t\t * `configs` is a list of config functions to run after the topmost\r\n\t\t * `build` call finishes running\r\n\t\t *\r\n\t\t * there's logic that relies on the assumption that null and undefined\r\n\t\t * data are equivalent to empty strings\r\n\t\t * - this prevents lifecycle surprises from procedural helpers that mix\r\n\t\t * implicit and explicit return statements (e.g.\r\n\t\t * function foo() {if (cond) return m(\"div\")}\r\n\t\t * - it simplifies diffing code\r\n\t\t */\r\n\t\tdata = dataToString(data)\r\n\t\tif (data.subtree === \"retain\") return cached\r\n\t\tcached = makeCache(data, cached, index, parentIndex, parentCache)\r\n\r\n\t\tif (isArray(data)) {\r\n\t\t\treturn buildArray(\r\n\t\t\t\tdata,\r\n\t\t\t\tcached,\r\n\t\t\t\tparentElement,\r\n\t\t\t\tindex,\r\n\t\t\t\tparentTag,\r\n\t\t\t\tshouldReattach,\r\n\t\t\t\teditable,\r\n\t\t\t\tnamespace,\r\n\t\t\t\tconfigs)\r\n\t\t} else if (data != null && isObject(data)) {\r\n\t\t\treturn buildObject(\r\n\t\t\t\tdata,\r\n\t\t\t\tcached,\r\n\t\t\t\teditable,\r\n\t\t\t\tparentElement,\r\n\t\t\t\tindex,\r\n\t\t\t\tshouldReattach,\r\n\t\t\t\tnamespace,\r\n\t\t\t\tconfigs)\r\n\t\t} else if (!isFunction(data)) {\r\n\t\t\treturn handleTextNode(\r\n\t\t\t\tcached,\r\n\t\t\t\tdata,\r\n\t\t\t\tindex,\r\n\t\t\t\tparentElement,\r\n\t\t\t\tshouldReattach,\r\n\t\t\t\teditable,\r\n\t\t\t\tparentTag)\r\n\t\t} else {\r\n\t\t\treturn cached\r\n\t\t}\r\n\t}\r\n\r\n\tfunction sortChanges(a, b) {\r\n\t\treturn a.action - b.action || a.index - b.index\r\n\t}\r\n\r\n\tfunction copyStyleAttrs(node, dataAttr, cachedAttr) {\r\n\t\tif (cachedAttr === dataAttr) {\r\n\t\t\tnode.style = \"\"\r\n\t\t\tcachedAttr = {}\r\n\t\t}\r\n\t\tfor (var rule in dataAttr) {\r\n\t\t\tif (hasOwn.call(dataAttr, rule)) {\r\n\t\t\t\tif (cachedAttr == null || cachedAttr[rule] !== dataAttr[rule]) {\r\n\t\t\t\t\tnode.style[rule] = dataAttr[rule]\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (rule in cachedAttr) {\r\n\t\t\tif (hasOwn.call(cachedAttr, rule)) {\r\n\t\t\t\tif (!hasOwn.call(dataAttr, rule)) node.style[rule] = \"\"\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tvar shouldUseSetAttribute = {\r\n\t\tlist: 1,\r\n\t\tstyle: 1,\r\n\t\tform: 1,\r\n\t\ttype: 1,\r\n\t\twidth: 1,\r\n\t\theight: 1\r\n\t}\r\n\r\n\tfunction setSingleAttr(\r\n\t\tnode,\r\n\t\tattrName,\r\n\t\tdataAttr,\r\n\t\tcachedAttr,\r\n\t\ttag,\r\n\t\tnamespace\r\n\t) {\r\n\t\tif (attrName === \"config\" || attrName === \"key\") {\r\n\t\t\t// `config` isn't a real attribute, so ignore it\r\n\t\t\treturn true\r\n\t\t} else if (isFunction(dataAttr) && attrName.slice(0, 2) === \"on\") {\r\n\t\t\t// hook event handlers to the auto-redrawing system\r\n\t\t\tnode[attrName] = autoredraw(dataAttr, node)\r\n\t\t} else if (attrName === \"style\" && dataAttr != null &&\r\n\t\t\t\tisObject(dataAttr)) {\r\n\t\t\t// handle `style: {...}`\r\n\t\t\tcopyStyleAttrs(node, dataAttr, cachedAttr)\r\n\t\t} else if (namespace != null) {\r\n\t\t\t// handle SVG\r\n\t\t\tif (attrName === \"href\") {\r\n\t\t\t\tnode.setAttributeNS(\"http://www.w3.org/1999/xlink\",\r\n\t\t\t\t\t\"href\", dataAttr)\r\n\t\t\t} else {\r\n\t\t\t\tnode.setAttribute(\r\n\t\t\t\t\tattrName === \"className\" ? \"class\" : attrName,\r\n\t\t\t\t\tdataAttr)\r\n\t\t\t}\r\n\t\t} else if (attrName in node && !shouldUseSetAttribute[attrName]) {\r\n\t\t\t// handle cases that are properties (but ignore cases where we\r\n\t\t\t// should use setAttribute instead)\r\n\t\t\t//\r\n\t\t\t// - list and form are typically used as strings, but are DOM\r\n\t\t\t// element references in js\r\n\t\t\t//\r\n\t\t\t// - when using CSS selectors (e.g. `m(\"[style='']\")`), style is\r\n\t\t\t// used as a string, but it's an object in js\r\n\t\t\t//\r\n\t\t\t// #348 don't set the value if not needed - otherwise, cursor\r\n\t\t\t// placement breaks in Chrome\r\n\t\t\t// #1252 likewise when `contenteditable` is set on an element.\r\n\t\t\ttry {\r\n\t\t\t\tif (\r\n\t\t\t\t\ttag !== \"input\" && !node.isContentEditable ||\r\n\t\t\t\t\tnode[attrName] != dataAttr // eslint-disable-line eqeqeq\r\n\t\t\t\t) {\r\n\t\t\t\t\tnode[attrName] = dataAttr\r\n\t\t\t\t}\r\n\t\t\t} catch (e) {\r\n\t\t\t\tnode.setAttribute(attrName, dataAttr)\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttry {\r\n\t\t\t\tnode.setAttribute(attrName, dataAttr)\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// IE8 doesn't allow change input attributes and throws\r\n\t\t\t\t// an exception. Unfortunately it cannot be handled, because\r\n\t\t\t\t// error code is not informative.\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction trySetAttr(\r\n\t\tnode,\r\n\t\tattrName,\r\n\t\tdataAttr,\r\n\t\tcachedAttr,\r\n\t\tcachedAttrs,\r\n\t\ttag,\r\n\t\tnamespace\r\n\t) {\r\n\t\tif (!(attrName in cachedAttrs) ||\r\n\t\t\t\t(cachedAttr !== dataAttr) ||\r\n\t\t\t\ttypeof dataAttr === \"object\" ||\r\n\t\t\t\t($document.activeElement === node)) {\r\n\t\t\tcachedAttrs[attrName] = dataAttr\r\n\t\t\ttry {\r\n\t\t\t\treturn setSingleAttr(\r\n\t\t\t\t\tnode,\r\n\t\t\t\t\tattrName,\r\n\t\t\t\t\tdataAttr,\r\n\t\t\t\t\tcachedAttr,\r\n\t\t\t\t\ttag,\r\n\t\t\t\t\tnamespace)\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// swallow IE's invalid argument errors to mimic HTML's\r\n\t\t\t\t// fallback-to-doing-nothing-on-invalid-attributes behavior\r\n\t\t\t\tif (e.message.indexOf(\"Invalid argument\") < 0) throw e\r\n\t\t\t}\r\n\t\t} else if (attrName === \"value\" && tag === \"input\" &&\r\n\t\t\t\t\t\t\t\t/* eslint-disable eqeqeq */\r\n\t\t\t\t\t\t\t\tnode.value != dataAttr) {\r\n\t\t\t\t\t\t\t\t// #348 dataAttr may not be a string,\r\n\t\t\t\t\t\t\t\t// so use loose comparison\r\n\t\t\t\t\t\t\t\t/* eslint-enable eqeqeq */\r\n\t\t\tnode.value = dataAttr\r\n\t\t}\r\n\t}\r\n\r\n\tfunction setAttributes(node, tag, dataAttrs, cachedAttrs, namespace) {\r\n\t\tfor (var attrName in dataAttrs) {\r\n\t\t\tif (hasOwn.call(dataAttrs, attrName)) {\r\n\t\t\t\tif (trySetAttr(\r\n\t\t\t\t\t\tnode,\r\n\t\t\t\t\t\tattrName,\r\n\t\t\t\t\t\tdataAttrs[attrName],\r\n\t\t\t\t\t\tcachedAttrs[attrName],\r\n\t\t\t\t\t\tcachedAttrs,\r\n\t\t\t\t\t\ttag,\r\n\t\t\t\t\t\tnamespace)) {\r\n\t\t\t\t\tcontinue\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn cachedAttrs\r\n\t}\r\n\r\n\tfunction clear(nodes, cached) {\r\n\t\tfor (var i = nodes.length - 1; i > -1; i--) {\r\n\t\t\tif (nodes[i] && nodes[i].parentNode) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tnodes[i].parentNode.removeChild(nodes[i])\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\t/* eslint-disable max-len */\r\n\t\t\t\t\t// ignore if this fails due to order of events (see\r\n\t\t\t\t\t// http://stackoverflow.com/questions/21926083/failed-to-execute-removechild-on-node)\r\n\t\t\t\t\t/* eslint-enable max-len */\r\n\t\t\t\t}\r\n\t\t\t\tcached = [].concat(cached)\r\n\t\t\t\tif (cached[i]) unload(cached[i])\r\n\t\t\t}\r\n\t\t}\r\n\t\t// release memory if nodes is an array. This check should fail if nodes\r\n\t\t// is a NodeList (see loop above)\r\n\t\tif (nodes.length) {\r\n\t\t\tnodes.length = 0\r\n\t\t}\r\n\t}\r\n\r\n\tfunction unload(cached) {\r\n\t\tif (cached.configContext && isFunction(cached.configContext.onunload)) {\r\n\t\t\tcached.configContext.onunload()\r\n\t\t\tcached.configContext.onunload = null\r\n\t\t}\r\n\t\tif (cached.controllers) {\r\n\t\t\tforEach(cached.controllers, function (controller) {\r\n\t\t\t\tif (isFunction(controller.onunload)) {\r\n\t\t\t\t\tcontroller.onunload({preventDefault: noop})\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\t\tif (cached.children) {\r\n\t\t\tif (isArray(cached.children)) forEach(cached.children, unload)\r\n\t\t\telse if (cached.children.tag) unload(cached.children)\r\n\t\t}\r\n\t}\r\n\r\n\tfunction appendTextFragment(parentElement, data) {\r\n\t\ttry {\r\n\t\t\tparentElement.appendChild(\r\n\t\t\t\t$document.createRange().createContextualFragment(data))\r\n\t\t} catch (e) {\r\n\t\t\tparentElement.insertAdjacentHTML(\"beforeend\", data)\r\n\t\t\treplaceScriptNodes(parentElement)\r\n\t\t}\r\n\t}\r\n\r\n\t// Replace script tags inside given DOM element with executable ones.\r\n\t// Will also check children recursively and replace any found script\r\n\t// tags in same manner.\r\n\tfunction replaceScriptNodes(node) {\r\n\t\tif (node.tagName === \"SCRIPT\") {\r\n\t\t\tnode.parentNode.replaceChild(buildExecutableNode(node), node)\r\n\t\t} else {\r\n\t\t\tvar children = node.childNodes\r\n\t\t\tif (children && children.length) {\r\n\t\t\t\tfor (var i = 0; i < children.length; i++) {\r\n\t\t\t\t\treplaceScriptNodes(children[i])\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn node\r\n\t}\r\n\r\n\t// Replace script element with one whose contents are executable.\r\n\tfunction buildExecutableNode(node){\r\n\t\tvar scriptEl = document.createElement(\"script\")\r\n\t\tvar attrs = node.attributes\r\n\r\n\t\tfor (var i = 0; i < attrs.length; i++) {\r\n\t\t\tscriptEl.setAttribute(attrs[i].name, attrs[i].value)\r\n\t\t}\r\n\r\n\t\tscriptEl.text = node.innerHTML\r\n\t\treturn scriptEl\r\n\t}\r\n\r\n\tfunction injectHTML(parentElement, index, data) {\r\n\t\tvar nextSibling = parentElement.childNodes[index]\r\n\t\tif (nextSibling) {\r\n\t\t\tvar isElement = nextSibling.nodeType !== 1\r\n\t\t\tvar placeholder = $document.createElement(\"span\")\r\n\t\t\tif (isElement) {\r\n\t\t\t\tparentElement.insertBefore(placeholder, nextSibling || null)\r\n\t\t\t\tplaceholder.insertAdjacentHTML(\"beforebegin\", data)\r\n\t\t\t\tparentElement.removeChild(placeholder)\r\n\t\t\t} else {\r\n\t\t\t\tnextSibling.insertAdjacentHTML(\"beforebegin\", data)\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tappendTextFragment(parentElement, data)\r\n\t\t}\r\n\r\n\t\tvar nodes = []\r\n\r\n\t\twhile (parentElement.childNodes[index] !== nextSibling) {\r\n\t\t\tnodes.push(parentElement.childNodes[index])\r\n\t\t\tindex++\r\n\t\t}\r\n\r\n\t\treturn nodes\r\n\t}\r\n\r\n\tfunction autoredraw(callback, object) {\r\n\t\treturn function (e) {\r\n\t\t\te = e || event\r\n\t\t\tm.redraw.strategy(\"diff\")\r\n\t\t\tm.startComputation()\r\n\t\t\ttry {\r\n\t\t\t\treturn callback.call(object, e)\r\n\t\t\t} finally {\r\n\t\t\t\tendFirstComputation()\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tvar html\r\n\tvar documentNode = {\r\n\t\tappendChild: function (node) {\r\n\t\t\tif (html === undefined) html = $document.createElement(\"html\")\r\n\t\t\tif ($document.documentElement &&\r\n\t\t\t\t\t$document.documentElement !== node) {\r\n\t\t\t\t$document.replaceChild(node, $document.documentElement)\r\n\t\t\t} else {\r\n\t\t\t\t$document.appendChild(node)\r\n\t\t\t}\r\n\r\n\t\t\tthis.childNodes = $document.childNodes\r\n\t\t},\r\n\r\n\t\tinsertBefore: function (node) {\r\n\t\t\tthis.appendChild(node)\r\n\t\t},\r\n\r\n\t\tchildNodes: []\r\n\t}\r\n\r\n\tvar nodeCache = []\r\n\tvar cellCache = {}\r\n\r\n\tm.render = function (root, cell, forceRecreation) {\r\n\t\tif (!root) {\r\n\t\t\tthrow new Error(\"Ensure the DOM element being passed to \" +\r\n\t\t\t\t\"m.route/m.mount/m.render is not undefined.\")\r\n\t\t}\r\n\t\tvar configs = []\r\n\t\tvar id = getCellCacheKey(root)\r\n\t\tvar isDocumentRoot = root === $document\r\n\t\tvar node\r\n\r\n\t\tif (isDocumentRoot || root === $document.documentElement) {\r\n\t\t\tnode = documentNode\r\n\t\t} else {\r\n\t\t\tnode = root\r\n\t\t}\r\n\r\n\t\tif (isDocumentRoot && cell.tag !== \"html\") {\r\n\t\t\tcell = {tag: \"html\", attrs: {}, children: cell}\r\n\t\t}\r\n\r\n\t\tif (cellCache[id] === undefined) clear(node.childNodes)\r\n\t\tif (forceRecreation === true) reset(root)\r\n\r\n\t\tcellCache[id] = build(\r\n\t\t\tnode,\r\n\t\t\tnull,\r\n\t\t\tundefined,\r\n\t\t\tundefined,\r\n\t\t\tcell,\r\n\t\t\tcellCache[id],\r\n\t\t\tfalse,\r\n\t\t\t0,\r\n\t\t\tnull,\r\n\t\t\tundefined,\r\n\t\t\tconfigs)\r\n\r\n\t\tforEach(configs, function (config) { config() })\r\n\t}\r\n\r\n\tfunction getCellCacheKey(element) {\r\n\t\tvar index = nodeCache.indexOf(element)\r\n\t\treturn index < 0 ? nodeCache.push(element) - 1 : index\r\n\t}\r\n\r\n\tm.trust = function (value) {\r\n\t\tvalue = new String(value) // eslint-disable-line no-new-wrappers\r\n\t\tvalue.$trusted = true\r\n\t\treturn value\r\n\t}\r\n\r\n\tfunction gettersetter(store) {\r\n\t\tfunction prop() {\r\n\t\t\tif (arguments.length) store = arguments[0]\r\n\t\t\treturn store\r\n\t\t}\r\n\r\n\t\tprop.toJSON = function () {\r\n\t\t\tif (store && isFunction(store.toJSON)) return store.toJSON()\r\n\t\t\treturn store\r\n\t\t}\r\n\r\n\t\treturn prop\r\n\t}\r\n\r\n\tm.prop = function (store) {\r\n\t\tif ((store != null && (isObject(store) || isFunction(store)) ||\r\n\t\t\t\t\t((typeof Promise !== \"undefined\") &&\r\n\t\t\t\t\t\t(store instanceof Promise))) &&\r\n\t\t\t\tisFunction(store.then)) {\r\n\t\t\treturn propify(store)\r\n\t\t}\r\n\r\n\t\treturn gettersetter(store)\r\n\t}\r\n\r\n\tvar roots = []\r\n\tvar components = []\r\n\tvar controllers = []\r\n\tvar lastRedrawId = null\r\n\tvar lastRedrawCallTime = 0\r\n\tvar computePreRedrawHook = null\r\n\tvar computePostRedrawHook = null\r\n\tvar topComponent\r\n\tvar FRAME_BUDGET = 16 // 60 frames per second = 1 call per 16 ms\r\n\r\n\tfunction parameterize(component, args) {\r\n\t\tfunction controller() {\r\n\t\t\t/* eslint-disable no-invalid-this */\r\n\t\t\treturn (component.controller || noop).apply(this, args) || this\r\n\t\t\t/* eslint-enable no-invalid-this */\r\n\t\t}\r\n\r\n\t\tif (component.controller) {\r\n\t\t\tcontroller.prototype = component.controller.prototype\r\n\t\t}\r\n\r\n\t\tfunction view(ctrl) {\r\n\t\t\tvar currentArgs = [ctrl].concat(args)\r\n\t\t\tfor (var i = 1; i < arguments.length; i++) {\r\n\t\t\t\tcurrentArgs.push(arguments[i])\r\n\t\t\t}\r\n\r\n\t\t\treturn component.view.apply(component, currentArgs)\r\n\t\t}\r\n\r\n\t\tview.$original = component.view\r\n\t\tvar output = {controller: controller, view: view}\r\n\t\tif (args[0] && args[0].key != null) output.attrs = {key: args[0].key}\r\n\t\treturn output\r\n\t}\r\n\r\n\tm.component = function (component) {\r\n\t\tvar args = new Array(arguments.length - 1)\r\n\r\n\t\tfor (var i = 1; i < arguments.length; i++) {\r\n\t\t\targs[i - 1] = arguments[i]\r\n\t\t}\r\n\r\n\t\treturn parameterize(component, args)\r\n\t}\r\n\r\n\tvar currentRoute, previousRoute\r\n\r\n\tfunction checkPrevented(component, root, index, isPrevented) {\r\n\t\tif (!isPrevented) {\r\n\t\t\tm.redraw.strategy(\"all\")\r\n\t\t\tm.startComputation()\r\n\t\t\troots[index] = root\r\n\t\t\tvar currentComponent\r\n\r\n\t\t\tif (component) {\r\n\t\t\t\tcurrentComponent = topComponent = component\r\n\t\t\t} else {\r\n\t\t\t\tcurrentComponent = topComponent = component = {controller: noop}\r\n\t\t\t}\r\n\r\n\t\t\tvar controller = new (component.controller || noop)()\r\n\r\n\t\t\t// controllers may call m.mount recursively (via m.route redirects,\r\n\t\t\t// for example)\r\n\t\t\t// this conditional ensures only the last recursive m.mount call is\r\n\t\t\t// applied\r\n\t\t\tif (currentComponent === topComponent) {\r\n\t\t\t\tcontrollers[index] = controller\r\n\t\t\t\tcomponents[index] = component\r\n\t\t\t}\r\n\t\t\tendFirstComputation()\r\n\t\t\tif (component === null) {\r\n\t\t\t\tremoveRootElement(root, index)\r\n\t\t\t}\r\n\t\t\treturn controllers[index]\r\n\t\t} else {\r\n\t\t\tif (component == null) {\r\n\t\t\t\tremoveRootElement(root, index)\r\n\t\t\t}\r\n\r\n\t\t\tif (previousRoute) {\r\n\t\t\t\tcurrentRoute = previousRoute\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tm.mount = m.module = function (root, component) {\r\n\t\tif (!root) {\r\n\t\t\tthrow new Error(\"Ensure the DOM element being passed to \" +\r\n\t\t\t\t\"m.route/m.mount/m.render is not undefined.\")\r\n\t\t}\r\n\r\n\t\tvar index = roots.indexOf(root)\r\n\t\tif (index < 0) index = roots.length\r\n\r\n\t\tvar isPrevented = false\r\n\t\tvar event = {\r\n\t\t\tpreventDefault: function () {\r\n\t\t\t\tisPrevented = true\r\n\t\t\t\tcomputePreRedrawHook = computePostRedrawHook = null\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tforEach(unloaders, function (unloader) {\r\n\t\t\tunloader.handler.call(unloader.controller, event)\r\n\t\t\tunloader.controller.onunload = null\r\n\t\t})\r\n\r\n\t\tif (isPrevented) {\r\n\t\t\tforEach(unloaders, function (unloader) {\r\n\t\t\t\tunloader.controller.onunload = unloader.handler\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\tunloaders = []\r\n\t\t}\r\n\r\n\t\tif (controllers[index] && isFunction(controllers[index].onunload)) {\r\n\t\t\tcontrollers[index].onunload(event)\r\n\t\t}\r\n\r\n\t\treturn checkPrevented(component, root, index, isPrevented)\r\n\t}\r\n\r\n\tfunction removeRootElement(root, index) {\r\n\t\troots.splice(index, 1)\r\n\t\tcontrollers.splice(index, 1)\r\n\t\tcomponents.splice(index, 1)\r\n\t\treset(root)\r\n\t\tnodeCache.splice(getCellCacheKey(root), 1)\r\n\t\tunloaders = []\r\n\t}\r\n\r\n\tvar redrawing = false\r\n\tm.redraw = function (force) {\r\n\t\tif (redrawing) return\r\n\t\tredrawing = true\r\n\t\tif (force) forcing = true\r\n\r\n\t\ttry {\r\n\t\t\t// lastRedrawId is a positive number if a second redraw is requested\r\n\t\t\t// before the next animation frame\r\n\t\t\t// lastRedrawId is null if it's the first redraw and not an event\r\n\t\t\t// handler\r\n\t\t\tif (lastRedrawId && !force) {\r\n\t\t\t\t// when setTimeout: only reschedule redraw if time between now\r\n\t\t\t\t// and previous redraw is bigger than a frame, otherwise keep\r\n\t\t\t\t// currently scheduled timeout\r\n\t\t\t\t// when rAF: always reschedule redraw\r\n\t\t\t\tif ($requestAnimationFrame === global.requestAnimationFrame ||\r\n\t\t\t\t\t\tnew Date() - lastRedrawCallTime > FRAME_BUDGET) {\r\n\t\t\t\t\tif (lastRedrawId > 0) $cancelAnimationFrame(lastRedrawId)\r\n\t\t\t\t\tlastRedrawId = $requestAnimationFrame(redraw, FRAME_BUDGET)\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tredraw()\r\n\t\t\t\tlastRedrawId = $requestAnimationFrame(function () {\r\n\t\t\t\t\tlastRedrawId = null\r\n\t\t\t\t}, FRAME_BUDGET)\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\tredrawing = forcing = false\r\n\t\t}\r\n\t}\r\n\r\n\tm.redraw.strategy = m.prop()\r\n\tfunction redraw() {\r\n\t\tif (computePreRedrawHook) {\r\n\t\t\tcomputePreRedrawHook()\r\n\t\t\tcomputePreRedrawHook = null\r\n\t\t}\r\n\t\tforEach(roots, function (root, i) {\r\n\t\t\tvar component = components[i]\r\n\t\t\tif (controllers[i]) {\r\n\t\t\t\tvar args = [controllers[i]]\r\n\t\t\t\tm.render(root,\r\n\t\t\t\t\tcomponent.view ? component.view(controllers[i], args) : \"\")\r\n\t\t\t}\r\n\t\t})\r\n\t\t// after rendering within a routed context, we need to scroll back to\r\n\t\t// the top, and fetch the document title for history.pushState\r\n\t\tif (computePostRedrawHook) {\r\n\t\t\tcomputePostRedrawHook()\r\n\t\t\tcomputePostRedrawHook = null\r\n\t\t}\r\n\t\tlastRedrawId = null\r\n\t\tlastRedrawCallTime = new Date()\r\n\t\tm.redraw.strategy(\"diff\")\r\n\t}\r\n\r\n\tfunction endFirstComputation() {\r\n\t\tif (m.redraw.strategy() === \"none\") {\r\n\t\t\tpendingRequests--\r\n\t\t\tm.redraw.strategy(\"diff\")\r\n\t\t} else {\r\n\t\t\tm.endComputation()\r\n\t\t}\r\n\t}\r\n\r\n\tm.withAttr = function (prop, withAttrCallback, callbackThis) {\r\n\t\treturn function (e) {\r\n\t\t\te = e || window.event\r\n\t\t\t/* eslint-disable no-invalid-this */\r\n\t\t\tvar currentTarget = e.currentTarget || this\r\n\t\t\tvar _this = callbackThis || this\r\n\t\t\t/* eslint-enable no-invalid-this */\r\n\t\t\tvar target = prop in currentTarget ?\r\n\t\t\t\tcurrentTarget[prop] :\r\n\t\t\t\tcurrentTarget.getAttribute(prop)\r\n\t\t\twithAttrCallback.call(_this, target)\r\n\t\t}\r\n\t}\r\n\r\n\t// routing\r\n\tvar modes = {pathname: \"\", hash: \"#\", search: \"?\"}\r\n\tvar redirect = noop\r\n\tvar isDefaultRoute = false\r\n\tvar routeParams\r\n\r\n\tm.route = function (root, arg1, arg2, vdom) { // eslint-disable-line\r\n\t\t// m.route()\r\n\t\tif (arguments.length === 0) return currentRoute\r\n\t\t// m.route(el, defaultRoute, routes)\r\n\t\tif (arguments.length === 3 && isString(arg1)) {\r\n\t\t\tredirect = function (source) {\r\n\t\t\t\tvar path = currentRoute = normalizeRoute(source)\r\n\t\t\t\tif (!routeByValue(root, arg2, path)) {\r\n\t\t\t\t\tif (isDefaultRoute) {\r\n\t\t\t\t\t\tthrow new Error(\"Ensure the default route matches \" +\r\n\t\t\t\t\t\t\t\"one of the routes defined in m.route\")\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tisDefaultRoute = true\r\n\t\t\t\t\tm.route(arg1, true)\r\n\t\t\t\t\tisDefaultRoute = false\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar listener = m.route.mode === \"hash\" ?\r\n\t\t\t\t\"onhashchange\" :\r\n\t\t\t\t\"onpopstate\"\r\n\r\n\t\t\tglobal[listener] = function () {\r\n\t\t\t\tvar path = $location[m.route.mode]\r\n\t\t\t\tif (m.route.mode === \"pathname\") path += $location.search\r\n\t\t\t\tif (currentRoute !== normalizeRoute(path)) redirect(path)\r\n\t\t\t}\r\n\r\n\t\t\tcomputePreRedrawHook = setScroll\r\n\t\t\tglobal[listener]()\r\n\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// config: m.route\r\n\t\tif (root.addEventListener || root.attachEvent) {\r\n\t\t\tvar base = m.route.mode !== \"pathname\" ? $location.pathname : \"\"\r\n\t\t\troot.href = base + modes[m.route.mode] + vdom.attrs.href\r\n\t\t\tif (root.addEventListener) {\r\n\t\t\t\troot.removeEventListener(\"click\", routeUnobtrusive)\r\n\t\t\t\troot.addEventListener(\"click\", routeUnobtrusive)\r\n\t\t\t} else {\r\n\t\t\t\troot.detachEvent(\"onclick\", routeUnobtrusive)\r\n\t\t\t\troot.attachEvent(\"onclick\", routeUnobtrusive)\r\n\t\t\t}\r\n\r\n\t\t\treturn\r\n\t\t}\r\n\t\t// m.route(route, params, shouldReplaceHistoryEntry)\r\n\t\tif (isString(root)) {\r\n\t\t\tpreviousRoute = currentRoute\r\n\t\t\tcurrentRoute = root\r\n\r\n\t\t\tvar args = arg1 || {}\r\n\t\t\tvar queryIndex = currentRoute.indexOf(\"?\")\r\n\t\t\tvar params\r\n\r\n\t\t\tif (queryIndex > -1) {\r\n\t\t\t\tparams = parseQueryString(currentRoute.slice(queryIndex + 1))\r\n\t\t\t} else {\r\n\t\t\t\tparams = {}\r\n\t\t\t}\r\n\r\n\t\t\tfor (var i in args) {\r\n\t\t\t\tif (hasOwn.call(args, i)) {\r\n\t\t\t\t\tparams[i] = args[i]\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar querystring = buildQueryString(params)\r\n\t\t\tvar currentPath\r\n\r\n\t\t\tif (queryIndex > -1) {\r\n\t\t\t\tcurrentPath = currentRoute.slice(0, queryIndex)\r\n\t\t\t} else {\r\n\t\t\t\tcurrentPath = currentRoute\r\n\t\t\t}\r\n\r\n\t\t\tif (querystring) {\r\n\t\t\t\tcurrentRoute = currentPath +\r\n\t\t\t\t\t(currentPath.indexOf(\"?\") === -1 ? \"?\" : \"&\") +\r\n\t\t\t\t\tquerystring\r\n\t\t\t}\r\n\r\n\t\t\tvar replaceHistory =\r\n\t\t\t\t(arguments.length === 3 ? arg2 : arg1) === true ||\r\n\t\t\t\tpreviousRoute === currentRoute\r\n\r\n\t\t\tif (global.history.pushState) {\r\n\t\t\t\tvar method = replaceHistory ? \"replaceState\" : \"pushState\"\r\n\t\t\t\tcomputePreRedrawHook = setScroll\r\n\t\t\t\tcomputePostRedrawHook = function () {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tglobal.history[method](null, $document.title,\r\n\t\t\t\t\t\t\tmodes[m.route.mode] + currentRoute)\r\n\t\t\t\t\t} catch (err) {\r\n\t\t\t\t\t\t// In the event of a pushState or replaceState failure,\r\n\t\t\t\t\t\t// fallback to a standard redirect. This is specifically\r\n\t\t\t\t\t\t// to address a Safari security error when attempting to\r\n\t\t\t\t\t\t// call pushState more than 100 times.\r\n\t\t\t\t\t\t$location[m.route.mode] = currentRoute\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tredirect(modes[m.route.mode] + currentRoute)\r\n\t\t\t} else {\r\n\t\t\t\t$location[m.route.mode] = currentRoute\r\n\t\t\t\tredirect(modes[m.route.mode] + currentRoute)\r\n\t\t\t}\r\n\r\n\t\t\tpreviousRoute = null\r\n\t\t}\r\n\t}\r\n\r\n\tm.route.param = function (key) {\r\n\t\tif (!routeParams) {\r\n\t\t\tthrow new Error(\"You must call m.route(element, defaultRoute, \" +\r\n\t\t\t\t\"routes) before calling m.route.param()\")\r\n\t\t}\r\n\r\n\t\tif (!key) {\r\n\t\t\treturn routeParams\r\n\t\t}\r\n\r\n\t\treturn routeParams[key]\r\n\t}\r\n\r\n\tm.route.mode = \"search\"\r\n\r\n\tfunction normalizeRoute(route) {\r\n\t\treturn route.slice(modes[m.route.mode].length)\r\n\t}\r\n\r\n\tfunction routeByValue(root, router, path) {\r\n\t\trouteParams = {}\r\n\r\n\t\tvar queryStart = path.indexOf(\"?\")\r\n\t\tif (queryStart !== -1) {\r\n\t\t\trouteParams = parseQueryString(\r\n\t\t\t\tpath.substr(queryStart + 1, path.length))\r\n\t\t\tpath = path.substr(0, queryStart)\r\n\t\t}\r\n\r\n\t\t// Get all routes and check if there's\r\n\t\t// an exact match for the current path\r\n\t\tvar keys = Object.keys(router)\r\n\t\tvar index = keys.indexOf(path)\r\n\r\n\t\tif (index !== -1){\r\n\t\t\tm.mount(root, router[keys [index]])\r\n\t\t\treturn true\r\n\t\t}\r\n\r\n\t\tfor (var route in router) {\r\n\t\t\tif (hasOwn.call(router, route)) {\r\n\t\t\t\tif (route === path) {\r\n\t\t\t\t\tm.mount(root, router[route])\r\n\t\t\t\t\treturn true\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar matcher = new RegExp(\"^\" + route\r\n\t\t\t\t\t.replace(/:[^\\/]+?\\.{3}/g, \"(.*?)\")\r\n\t\t\t\t\t.replace(/:[^\\/]+/g, \"([^\\\\/]+)\") + \"\\/?$\")\r\n\r\n\t\t\t\tif (matcher.test(path)) {\r\n\t\t\t\t\t/* eslint-disable no-loop-func */\r\n\t\t\t\t\tpath.replace(matcher, function () {\r\n\t\t\t\t\t\tvar keys = route.match(/:[^\\/]+/g) || []\r\n\t\t\t\t\t\tvar values = [].slice.call(arguments, 1, -2)\r\n\t\t\t\t\t\tforEach(keys, function (key, i) {\r\n\t\t\t\t\t\t\trouteParams[key.replace(/:|\\./g, \"\")] =\r\n\t\t\t\t\t\t\t\tdecodeURIComponent(values[i])\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\tm.mount(root, router[route])\r\n\t\t\t\t\t})\r\n\t\t\t\t\t/* eslint-enable no-loop-func */\r\n\t\t\t\t\treturn true\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction routeUnobtrusive(e) {\r\n\t\te = e || event\r\n\t\tif (e.ctrlKey || e.metaKey || e.shiftKey || e.which === 2) return\r\n\r\n\t\tif (e.preventDefault) {\r\n\t\t\te.preventDefault()\r\n\t\t} else {\r\n\t\t\te.returnValue = false\r\n\t\t}\r\n\r\n\t\tvar currentTarget = e.currentTarget || e.srcElement\r\n\t\tvar args\r\n\r\n\t\tif (m.route.mode === \"pathname\" && currentTarget.search) {\r\n\t\t\targs = parseQueryString(currentTarget.search.slice(1))\r\n\t\t} else {\r\n\t\t\targs = {}\r\n\t\t}\r\n\r\n\t\twhile (currentTarget && !/a/i.test(currentTarget.nodeName)) {\r\n\t\t\tcurrentTarget = currentTarget.parentNode\r\n\t\t}\r\n\r\n\t\t// clear pendingRequests because we want an immediate route change\r\n\t\tpendingRequests = 0\r\n\t\tm.route(currentTarget[m.route.mode]\r\n\t\t\t.slice(modes[m.route.mode].length), args)\r\n\t}\r\n\r\n\tfunction setScroll() {\r\n\t\tif (m.route.mode !== \"hash\" && $location.hash) {\r\n\t\t\t$location.hash = $location.hash\r\n\t\t} else {\r\n\t\t\tglobal.scrollTo(0, 0)\r\n\t\t}\r\n\t}\r\n\r\n\tfunction buildQueryString(object, prefix) {\r\n\t\tvar duplicates = {}\r\n\t\tvar str = []\r\n\r\n\t\tfor (var prop in object) {\r\n\t\t\tif (hasOwn.call(object, prop)) {\r\n\t\t\t\tvar key = prefix ? prefix + \"[\" + prop + \"]\" : prop\r\n\t\t\t\tvar value = object[prop]\r\n\r\n\t\t\t\tif (value === null) {\r\n\t\t\t\t\tstr.push(encodeURIComponent(key))\r\n\t\t\t\t} else if (isObject(value)) {\r\n\t\t\t\t\tstr.push(buildQueryString(value, key))\r\n\t\t\t\t} else if (isArray(value)) {\r\n\t\t\t\t\tvar keys = []\r\n\t\t\t\t\tduplicates[key] = duplicates[key] || {}\r\n\t\t\t\t\t/* eslint-disable no-loop-func */\r\n\t\t\t\t\tforEach(value, function (item) {\r\n\t\t\t\t\t\t/* eslint-enable no-loop-func */\r\n\t\t\t\t\t\tif (!duplicates[key][item]) {\r\n\t\t\t\t\t\t\tduplicates[key][item] = true\r\n\t\t\t\t\t\t\tkeys.push(encodeURIComponent(key) + \"=\" +\r\n\t\t\t\t\t\t\t\tencodeURIComponent(item))\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\tstr.push(keys.join(\"&\"))\r\n\t\t\t\t} else if (value !== undefined) {\r\n\t\t\t\t\tstr.push(encodeURIComponent(key) + \"=\" +\r\n\t\t\t\t\t\tencodeURIComponent(value))\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn str.join(\"&\")\r\n\t}\r\n\r\n\tfunction parseQueryString(str) {\r\n\t\tif (str === \"\" || str == null) return {}\r\n\t\tif (str.charAt(0) === \"?\") str = str.slice(1)\r\n\r\n\t\tvar pairs = str.split(\"&\")\r\n\t\tvar params = {}\r\n\r\n\t\tforEach(pairs, function (string) {\r\n\t\t\tvar pair = string.split(\"=\")\r\n\t\t\tvar key = decodeURIComponent(pair[0])\r\n\t\t\tvar value = pair.length === 2 ? decodeURIComponent(pair[1]) : null\r\n\t\t\tif (params[key] != null) {\r\n\t\t\t\tif (!isArray(params[key])) params[key] = [params[key]]\r\n\t\t\t\tparams[key].push(value)\r\n\t\t\t} else params[key] = value\r\n\t\t})\r\n\r\n\t\treturn params\r\n\t}\r\n\r\n\tm.route.buildQueryString = buildQueryString\r\n\tm.route.parseQueryString = parseQueryString\r\n\r\n\tfunction reset(root) {\r\n\t\tvar cacheKey = getCellCacheKey(root)\r\n\t\tclear(root.childNodes, cellCache[cacheKey])\r\n\t\tcellCache[cacheKey] = undefined\r\n\t}\r\n\r\n\tm.deferred = function () {\r\n\t\tvar deferred = new Deferred()\r\n\t\tdeferred.promise = propify(deferred.promise)\r\n\t\treturn deferred\r\n\t}\r\n\r\n\tfunction propify(promise, initialValue) {\r\n\t\tvar prop = m.prop(initialValue)\r\n\t\tpromise.then(prop)\r\n\t\tprop.then = function (resolve, reject) {\r\n\t\t\treturn propify(promise.then(resolve, reject), initialValue)\r\n\t\t}\r\n\r\n\t\tprop[\"catch\"] = prop.then.bind(null, null)\r\n\t\treturn prop\r\n\t}\r\n\t// Promiz.mithril.js | Zolmeister | MIT\r\n\t// a modified version of Promiz.js, which does not conform to Promises/A+\r\n\t// for two reasons:\r\n\t//\r\n\t// 1) `then` callbacks are called synchronously (because setTimeout is too\r\n\t// slow, and the setImmediate polyfill is too big\r\n\t//\r\n\t// 2) throwing subclasses of Error cause the error to be bubbled up instead\r\n\t// of triggering rejection (because the spec does not account for the\r\n\t// important use case of default browser error handling, i.e. message w/\r\n\t// line number)\r\n\r\n\tvar RESOLVING = 1\r\n\tvar REJECTING = 2\r\n\tvar RESOLVED = 3\r\n\tvar REJECTED = 4\r\n\r\n\tfunction Deferred(onSuccess, onFailure) {\r\n\t\tvar self = this\r\n\t\tvar state = 0\r\n\t\tvar promiseValue = 0\r\n\t\tvar next = []\r\n\r\n\t\tself.promise = {}\r\n\r\n\t\tself.resolve = function (value) {\r\n\t\t\tif (!state) {\r\n\t\t\t\tpromiseValue = value\r\n\t\t\t\tstate = RESOLVING\r\n\r\n\t\t\t\tfire()\r\n\t\t\t}\r\n\r\n\t\t\treturn self\r\n\t\t}\r\n\r\n\t\tself.reject = function (value) {\r\n\t\t\tif (!state) {\r\n\t\t\t\tpromiseValue = value\r\n\t\t\t\tstate = REJECTING\r\n\r\n\t\t\t\tfire()\r\n\t\t\t}\r\n\r\n\t\t\treturn self\r\n\t\t}\r\n\r\n\t\tself.promise.then = function (onSuccess, onFailure) {\r\n\t\t\tvar deferred = new Deferred(onSuccess, onFailure)\r\n\r\n\t\t\tif (state === RESOLVED) {\r\n\t\t\t\tdeferred.resolve(promiseValue)\r\n\t\t\t} else if (state === REJECTED) {\r\n\t\t\t\tdeferred.reject(promiseValue)\r\n\t\t\t} else {\r\n\t\t\t\tnext.push(deferred)\r\n\t\t\t}\r\n\r\n\t\t\treturn deferred.promise\r\n\t\t}\r\n\r\n\t\tfunction finish(type) {\r\n\t\t\tstate = type || REJECTED\r\n\t\t\tnext.map(function (deferred) {\r\n\t\t\t\tif (state === RESOLVED) {\r\n\t\t\t\t\tdeferred.resolve(promiseValue)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdeferred.reject(promiseValue)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tfunction thennable(then, success, failure, notThennable) {\r\n\t\t\tif (((promiseValue != null && isObject(promiseValue)) ||\r\n\t\t\t\t\tisFunction(promiseValue)) && isFunction(then)) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\t// count protects against abuse calls from spec checker\r\n\t\t\t\t\tvar count = 0\r\n\t\t\t\t\tthen.call(promiseValue, function (value) {\r\n\t\t\t\t\t\tif (count++) return\r\n\t\t\t\t\t\tpromiseValue = value\r\n\t\t\t\t\t\tsuccess()\r\n\t\t\t\t\t}, function (value) {\r\n\t\t\t\t\t\tif (count++) return\r\n\t\t\t\t\t\tpromiseValue = value\r\n\t\t\t\t\t\tfailure()\r\n\t\t\t\t\t})\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tm.deferred.onerror(e)\r\n\t\t\t\t\tpromiseValue = e\r\n\t\t\t\t\tfailure()\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tnotThennable()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction fire() {\r\n\t\t\t// check if it's a thenable\r\n\t\t\tvar then\r\n\t\t\ttry {\r\n\t\t\t\tthen = promiseValue && promiseValue.then\r\n\t\t\t} catch (e) {\r\n\t\t\t\tm.deferred.onerror(e)\r\n\t\t\t\tpromiseValue = e\r\n\t\t\t\tstate = REJECTING\r\n\t\t\t\treturn fire()\r\n\t\t\t}\r\n\r\n\t\t\tif (state === REJECTING) {\r\n\t\t\t\tm.deferred.onerror(promiseValue)\r\n\t\t\t}\r\n\r\n\t\t\tthennable(then, function () {\r\n\t\t\t\tstate = RESOLVING\r\n\t\t\t\tfire()\r\n\t\t\t}, function () {\r\n\t\t\t\tstate = REJECTING\r\n\t\t\t\tfire()\r\n\t\t\t}, function () {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (state === RESOLVING && isFunction(onSuccess)) {\r\n\t\t\t\t\t\tpromiseValue = onSuccess(promiseValue)\r\n\t\t\t\t\t} else if (state === REJECTING && isFunction(onFailure)) {\r\n\t\t\t\t\t\tpromiseValue = onFailure(promiseValue)\r\n\t\t\t\t\t\tstate = RESOLVING\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tm.deferred.onerror(e)\r\n\t\t\t\t\tpromiseValue = e\r\n\t\t\t\t\treturn finish()\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (promiseValue === self) {\r\n\t\t\t\t\tpromiseValue = TypeError()\r\n\t\t\t\t\tfinish()\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthennable(then, function () {\r\n\t\t\t\t\t\tfinish(RESOLVED)\r\n\t\t\t\t\t}, finish, function () {\r\n\t\t\t\t\t\tfinish(state === RESOLVING && RESOLVED)\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\tm.deferred.onerror = function (e) {\r\n\t\tif (type.call(e) === \"[object Error]\" &&\r\n\t\t\t\t!/ Error/.test(e.constructor.toString())) {\r\n\t\t\tpendingRequests = 0\r\n\t\t\tthrow e\r\n\t\t}\r\n\t}\r\n\r\n\tm.sync = function (args) {\r\n\t\tvar deferred = m.deferred()\r\n\t\tvar outstanding = args.length\r\n\t\tvar results = []\r\n\t\tvar method = \"resolve\"\r\n\r\n\t\tfunction synchronizer(pos, resolved) {\r\n\t\t\treturn function (value) {\r\n\t\t\t\tresults[pos] = value\r\n\t\t\t\tif (!resolved) method = \"reject\"\r\n\t\t\t\tif (--outstanding === 0) {\r\n\t\t\t\t\tdeferred.promise(results)\r\n\t\t\t\t\tdeferred[method](results)\r\n\t\t\t\t}\r\n\t\t\t\treturn value\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (args.length > 0) {\r\n\t\t\tforEach(args, function (arg, i) {\r\n\t\t\t\targ.then(synchronizer(i, true), synchronizer(i, false))\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\tdeferred.resolve([])\r\n\t\t}\r\n\r\n\t\treturn deferred.promise\r\n\t}\r\n\r\n\tfunction identity(value) { return value }\r\n\r\n\tfunction handleJsonp(options) {\r\n\t\tvar callbackKey = options.callbackName || \"mithril_callback_\" +\r\n\t\t\tnew Date().getTime() + \"_\" +\r\n\t\t\t(Math.round(Math.random() * 1e16)).toString(36)\r\n\r\n\t\tvar script = $document.createElement(\"script\")\r\n\r\n\t\tglobal[callbackKey] = function (resp) {\r\n\t\t\tscript.parentNode.removeChild(script)\r\n\t\t\toptions.onload({\r\n\t\t\t\ttype: \"load\",\r\n\t\t\t\ttarget: {\r\n\t\t\t\t\tresponseText: resp\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\tglobal[callbackKey] = undefined\r\n\t\t}\r\n\r\n\t\tscript.onerror = function () {\r\n\t\t\tscript.parentNode.removeChild(script)\r\n\r\n\t\t\toptions.onerror({\r\n\t\t\t\ttype: \"error\",\r\n\t\t\t\ttarget: {\r\n\t\t\t\t\tstatus: 500,\r\n\t\t\t\t\tresponseText: JSON.stringify({\r\n\t\t\t\t\t\terror: \"Error making jsonp request\"\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\tglobal[callbackKey] = undefined\r\n\r\n\t\t\treturn false\r\n\t\t}\r\n\r\n\t\tscript.onload = function () {\r\n\t\t\treturn false\r\n\t\t}\r\n\r\n\t\tscript.src = options.url +\r\n\t\t\t(options.url.indexOf(\"?\") > 0 ? \"&\" : \"?\") +\r\n\t\t\t(options.callbackKey ? options.callbackKey : \"callback\") +\r\n\t\t\t\"=\" + callbackKey +\r\n\t\t\t\"&\" + buildQueryString(options.data || {})\r\n\r\n\t\t$document.body.appendChild(script)\r\n\t}\r\n\r\n\tfunction createXhr(options) {\r\n\t\tvar xhr = new global.XMLHttpRequest()\r\n\t\txhr.open(options.method, options.url, true, options.user,\r\n\t\t\toptions.password)\r\n\r\n\t\txhr.onreadystatechange = function () {\r\n\t\t\tif (xhr.readyState === 4) {\r\n\t\t\t\tif (xhr.status >= 200 && xhr.status < 300) {\r\n\t\t\t\t\toptions.onload({type: \"load\", target: xhr})\r\n\t\t\t\t} else {\r\n\t\t\t\t\toptions.onerror({type: \"error\", target: xhr})\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (options.serialize === JSON.stringify &&\r\n\t\t\t\toptions.data &&\r\n\t\t\t\toptions.method !== \"GET\") {\r\n\t\t\txhr.setRequestHeader(\"Content-Type\",\r\n\t\t\t\t\"application/json; charset=utf-8\")\r\n\t\t}\r\n\r\n\t\tif (options.deserialize === JSON.parse) {\r\n\t\t\txhr.setRequestHeader(\"Accept\", \"application/json, text/*\")\r\n\t\t}\r\n\r\n\t\tif (isObject(options.headers)) {\r\n\t\t\tfor (var header in options.headers) {\r\n\t\t\t\tif (hasOwn.call(options.headers, header)) {\r\n\t\t\t\t\txhr.setRequestHeader(header, options.headers[header])\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isFunction(options.config)) {\r\n\t\t\tvar maybeXhr = options.config(xhr, options)\r\n\t\t\tif (maybeXhr != null) xhr = maybeXhr\r\n\t\t}\r\n\r\n\t\tvar data = options.method === \"GET\" || !options.data ? \"\" : options.data\r\n\r\n\t\tif (data && !isString(data) && data.constructor !== global.FormData) {\r\n\t\t\tthrow new Error(\"Request data should be either be a string or \" +\r\n\t\t\t\t\"FormData. Check the `serialize` option in `m.request`\")\r\n\t\t}\r\n\r\n\t\txhr.send(data)\r\n\t\treturn xhr\r\n\t}\r\n\r\n\tfunction ajax(options) {\r\n\t\tif (options.dataType && options.dataType.toLowerCase() === \"jsonp\") {\r\n\t\t\treturn handleJsonp(options)\r\n\t\t} else {\r\n\t\t\treturn createXhr(options)\r\n\t\t}\r\n\t}\r\n\r\n\tfunction bindData(options, data, serialize) {\r\n\t\tif (options.method === \"GET\" && options.dataType !== \"jsonp\") {\r\n\t\t\tvar prefix = options.url.indexOf(\"?\") < 0 ? \"?\" : \"&\"\r\n\t\t\tvar querystring = buildQueryString(data)\r\n\t\t\toptions.url += (querystring ? prefix + querystring : \"\")\r\n\t\t} else {\r\n\t\t\toptions.data = serialize(data)\r\n\t\t}\r\n\t}\r\n\r\n\tfunction parameterizeUrl(url, data) {\r\n\t\tif (data) {\r\n\t\t\turl = url.replace(/:[a-z]\\w+/gi, function (token){\r\n\t\t\t\tvar key = token.slice(1)\r\n\t\t\t\tvar value = data[key] || token\r\n\t\t\t\tdelete data[key]\r\n\t\t\t\treturn value\r\n\t\t\t})\r\n\t\t}\r\n\t\treturn url\r\n\t}\r\n\r\n\tm.request = function (options) {\r\n\t\tif (options.background !== true) m.startComputation()\r\n\t\tvar deferred = new Deferred()\r\n\t\tvar isJSONP = options.dataType &&\r\n\t\t\toptions.dataType.toLowerCase() === \"jsonp\"\r\n\r\n\t\tvar serialize, deserialize, extract\r\n\r\n\t\tif (isJSONP) {\r\n\t\t\tserialize = options.serialize =\r\n\t\t\tdeserialize = options.deserialize = identity\r\n\r\n\t\t\textract = function (jsonp) { return jsonp.responseText }\r\n\t\t} else {\r\n\t\t\tserialize = options.serialize = options.serialize || JSON.stringify\r\n\r\n\t\t\tdeserialize = options.deserialize =\r\n\t\t\t\toptions.deserialize || JSON.parse\r\n\t\t\textract = options.extract || function (xhr) {\r\n\t\t\t\tif (xhr.responseText.length || deserialize !== JSON.parse) {\r\n\t\t\t\t\treturn xhr.responseText\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn null\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\toptions.method = (options.method || \"GET\").toUpperCase()\r\n\t\toptions.url = parameterizeUrl(options.url, options.data)\r\n\t\tbindData(options, options.data, serialize)\r\n\t\toptions.onload = options.onerror = function (ev) {\r\n\t\t\ttry {\r\n\t\t\t\tev = ev || event\r\n\t\t\t\tvar response = deserialize(extract(ev.target, options))\r\n\t\t\t\tif (ev.type === \"load\") {\r\n\t\t\t\t\tif (options.unwrapSuccess) {\r\n\t\t\t\t\t\tresponse = options.unwrapSuccess(response, ev.target)\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (isArray(response) && options.type) {\r\n\t\t\t\t\t\tforEach(response, function (res, i) {\r\n\t\t\t\t\t\t\tresponse[i] = new options.type(res)\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else if (options.type) {\r\n\t\t\t\t\t\tresponse = new options.type(response)\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdeferred.resolve(response)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.unwrapError) {\r\n\t\t\t\t\t\tresponse = options.unwrapError(response, ev.target)\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdeferred.reject(response)\r\n\t\t\t\t}\r\n\t\t\t} catch (e) {\r\n\t\t\t\tdeferred.reject(e)\r\n\t\t\t\tm.deferred.onerror(e)\r\n\t\t\t} finally {\r\n\t\t\t\tif (options.background !== true) m.endComputation()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tajax(options)\r\n\t\tdeferred.promise = propify(deferred.promise, options.initialValue)\r\n\t\treturn deferred.promise\r\n\t}\r\n\r\n\treturn m\r\n}); // eslint-disable-line\r\n","export default class Routes {\n type;\n attributes = [];\n hasOnes = [];\n hasManys = [];\n\n constructor(type, model = null) {\n this.type = type;\n this.model = model;\n }\n\n attribute(name) {\n this.attributes.push(name);\n\n return this;\n }\n\n hasOne(type) {\n this.hasOnes.push(type);\n\n return this;\n }\n\n hasMany(type) {\n this.hasManys.push(type);\n\n return this;\n }\n\n extend(app, extension) {\n if (this.model) {\n app.store.models[this.type] = this.model;\n }\n\n const model = app.store.models[this.type];\n\n this.attributes.forEach((name) => (model.prototype[name] = model.attribute(name)));\n this.hasOnes.forEach((name) => (model.prototype[name] = model.hasOne(name)));\n this.hasManys.forEach((name) => (model.prototype[name] = model.hasMany(name)));\n }\n}\n","export default class PostTypes {\n postComponents = {};\n\n add(name, component) {\n this.postComponents[name] = component;\n\n return this;\n }\n\n extend(app, extension) {\n Object.assign(app.postComponents, this.postComponents);\n }\n}\n","export default class Routes {\n routes = {};\n\n add(name, path, component) {\n this.routes[name] = { path, component };\n\n return this;\n }\n\n extend(app, extension) {\n Object.assign(app.routes, this.routes);\n }\n}\n","import 'expose-loader?$!expose-loader?jQuery!jquery';\nimport 'expose-loader?m!mithril';\nimport 'expose-loader?moment!moment';\nimport 'expose-loader?m.bidi!m.attrs.bidi';\nimport 'bootstrap/js/affix';\nimport 'bootstrap/js/dropdown';\nimport 'bootstrap/js/modal';\nimport 'bootstrap/js/tooltip';\nimport 'bootstrap/js/transition';\nimport 'jquery.hotkeys/jquery.hotkeys';\n\nimport patchMithril from './utils/patchMithril';\n\npatchMithril(window);\n\nimport * as Extend from './extend/index';\n\nexport { Extend };\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import * as extend from './extend';\nimport Session from './Session';\nimport Store from './Store';\nimport evented from './utils/evented';\nimport liveHumanTimes from './utils/liveHumanTimes';\nimport ItemList from './utils/ItemList';\nimport mixin from './utils/mixin';\nimport humanTime from './utils/humanTime';\nimport computed from './utils/computed';\nimport Drawer from './utils/Drawer';\nimport anchorScroll from './utils/anchorScroll';\nimport RequestError from './utils/RequestError';\nimport abbreviateNumber from './utils/abbreviateNumber';\nimport * as string from './utils/string';\nimport SubtreeRetainer from './utils/SubtreeRetainer';\nimport extract from './utils/extract';\nimport ScrollListener from './utils/ScrollListener';\nimport stringToColor from './utils/stringToColor';\nimport patchMithril from './utils/patchMithril';\nimport classList from './utils/classList';\nimport extractText from './utils/extractText';\nimport formatNumber from './utils/formatNumber';\nimport mapRoutes from './utils/mapRoutes';\nimport Notification from './models/Notification';\nimport User from './models/User';\nimport Post from './models/Post';\nimport Discussion from './models/Discussion';\nimport Group from './models/Group';\nimport Forum from './models/Forum';\nimport Component from './Component';\nimport Translator from './Translator';\nimport AlertManager from './components/AlertManager';\nimport Page from './components/Page';\nimport Switch from './components/Switch';\nimport Badge from './components/Badge';\nimport LoadingIndicator from './components/LoadingIndicator';\nimport Placeholder from './components/Placeholder';\nimport Separator from './components/Separator';\nimport Dropdown from './components/Dropdown';\nimport SplitDropdown from './components/SplitDropdown';\nimport RequestErrorModal from './components/RequestErrorModal';\nimport FieldSet from './components/FieldSet';\nimport Select from './components/Select';\nimport Navigation from './components/Navigation';\nimport Alert from './components/Alert';\nimport LinkButton from './components/LinkButton';\nimport Checkbox from './components/Checkbox';\nimport SelectDropdown from './components/SelectDropdown';\nimport ModalManager from './components/ModalManager';\nimport Button from './components/Button';\nimport Modal from './components/Modal';\nimport GroupBadge from './components/GroupBadge';\nimport Model from './Model';\nimport Application from './Application';\nimport fullTime from './helpers/fullTime';\nimport avatar from './helpers/avatar';\nimport icon from './helpers/icon';\nimport humanTimeHelper from './helpers/humanTime';\nimport punctuateSeries from './helpers/punctuateSeries';\nimport highlight from './helpers/highlight';\nimport username from './helpers/username';\nimport userOnline from './helpers/userOnline';\nimport listItems from './helpers/listItems';\n\nexport default {\n extend: extend,\n Session: Session,\n Store: Store,\n 'utils/evented': evented,\n 'utils/liveHumanTimes': liveHumanTimes,\n 'utils/ItemList': ItemList,\n 'utils/mixin': mixin,\n 'utils/humanTime': humanTime,\n 'utils/computed': computed,\n 'utils/Drawer': Drawer,\n 'utils/anchorScroll': anchorScroll,\n 'utils/RequestError': RequestError,\n 'utils/abbreviateNumber': abbreviateNumber,\n 'utils/string': string,\n 'utils/SubtreeRetainer': SubtreeRetainer,\n 'utils/extract': extract,\n 'utils/ScrollListener': ScrollListener,\n 'utils/stringToColor': stringToColor,\n 'utils/patchMithril': patchMithril,\n 'utils/classList': classList,\n 'utils/extractText': extractText,\n 'utils/formatNumber': formatNumber,\n 'utils/mapRoutes': mapRoutes,\n 'models/Notification': Notification,\n 'models/User': User,\n 'models/Post': Post,\n 'models/Discussion': Discussion,\n 'models/Group': Group,\n 'models/Forum': Forum,\n Component: Component,\n Translator: Translator,\n 'components/AlertManager': AlertManager,\n 'components/Page': Page,\n 'components/Switch': Switch,\n 'components/Badge': Badge,\n 'components/LoadingIndicator': LoadingIndicator,\n 'components/Placeholder': Placeholder,\n 'components/Separator': Separator,\n 'components/Dropdown': Dropdown,\n 'components/SplitDropdown': SplitDropdown,\n 'components/RequestErrorModal': RequestErrorModal,\n 'components/FieldSet': FieldSet,\n 'components/Select': Select,\n 'components/Navigation': Navigation,\n 'components/Alert': Alert,\n 'components/LinkButton': LinkButton,\n 'components/Checkbox': Checkbox,\n 'components/SelectDropdown': SelectDropdown,\n 'components/ModalManager': ModalManager,\n 'components/Button': Button,\n 'components/Modal': Modal,\n 'components/GroupBadge': GroupBadge,\n Model: Model,\n Application: Application,\n 'helpers/fullTime': fullTime,\n 'helpers/avatar': avatar,\n 'helpers/icon': icon,\n 'helpers/humanTime': humanTimeHelper,\n 'helpers/punctuateSeries': punctuateSeries,\n 'helpers/highlight': highlight,\n 'helpers/username': username,\n 'helpers/userOnline': userOnline,\n 'helpers/listItems': listItems,\n};\n","/**\n * The `mixin` utility assigns the properties of a set of 'mixin' objects to\n * the prototype of a parent object.\n *\n * @example\n * class MyClass extends mixin(ExistingClass, evented, etc) {}\n *\n * @param {Class} Parent The class to extend the new class from.\n * @param {...Object} mixins The objects to mix in.\n * @return {Class} A new class that extends Parent and contains the mixins.\n */\nexport default function mixin(Parent, ...mixins) {\n class Mixed extends Parent {}\n\n mixins.forEach((object) => {\n Object.assign(Mixed.prototype, object);\n });\n\n return Mixed;\n}\n","/**\n * The `punctuateSeries` helper formats a list of strings (e.g. names) to read\n * fluently in the application's locale.\n *\n * ```js\n * punctuateSeries(['Toby', 'Franz', 'Dominion']) // Toby, Franz, and Dominion\n * ```\n *\n * @param {Array} items\n * @return {VirtualElement}\n */\nexport default function punctuateSeries(items) {\n if (items.length === 2) {\n return app.translator.trans('core.lib.series.two_text', {\n first: items[0],\n second: items[1],\n });\n } else if (items.length >= 3) {\n // If there are three or more items, we will join all but the first and\n // last items with the equivalent of a comma, and then we will feed that\n // into the translator along with the first and last item.\n const second = items\n .slice(1, items.length - 1)\n .reduce((list, item) => list.concat([item, app.translator.trans('core.lib.series.glue_text')]), [])\n .slice(0, -1);\n\n return app.translator.trans('core.lib.series.three_text', {\n first: items[0],\n second,\n third: items[items.length - 1],\n });\n }\n\n return items;\n}\n","module.exports = global[\"$\"] = require(\"-!/github/workspace/js/node_modules/expose-loader/index.js?jQuery!./jquery.js\");","module.exports = global[\"jQuery\"] = require(\"-!./jquery.js\");","/*!\n * jQuery JavaScript Library v3.4.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2019-05-01T21:04Z\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 #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 document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\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 // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML <object> elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\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\n\tversion = \"3.4.1\",\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\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\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\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 global context\n\tglobalEval: function( code, options ) {\n\t\tDOMEval( code, { nonce: options && options.nonce } );\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\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\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[ 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\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 concat.apply( [], 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( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\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}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.4\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2019-04-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\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\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\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\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\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\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\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// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\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\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( 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\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\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, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\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\tresults.push( 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, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\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\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( 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]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\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 ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t(nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\") ) {\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// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 && rdescend.test( selector ) ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\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 + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\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\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( rtrim, \"$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\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\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 Sizzle\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\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\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\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"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\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.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\t/* jshint -W018 */\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 Sizzle 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// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = (elem.ownerDocument || elem).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\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\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\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\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\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\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && 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\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\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\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( 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\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\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && 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( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( 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\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 Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.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 */\nSizzle.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\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( 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\tresults.splice( 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\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\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\t\"ATTR\": 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] || \"\" ).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\t\"CHILD\": function( match ) {\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\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.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] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\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\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": 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\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\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\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": 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 + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.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\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": 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, uniqueCache, 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\tnode.nodeName.toLowerCase() === 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\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\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ 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\tuniqueCache[ 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\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\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ 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\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\tnode.nodeName.toLowerCase() === 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 ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ 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\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://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\tSizzle.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 Sizzle 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( 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\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\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( rtrim, \"$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\t\t\t\t\t// Don't keep the element (issue #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\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( 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// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.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\t\"target\": 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\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\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\t\"empty\": function( elem ) {\n\t\t\t// http://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\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": 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\t\"odd\": 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\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\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\t\"gt\": 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\ntokenize = Sizzle.tokenize = function( 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\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 = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\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\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\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\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, uniqueCache, 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\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ 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\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ 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\tSizzle( 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,\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 || multipleContexts( selector || \"*\", context.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\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\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\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\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( 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( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\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\t\t\t// Avoid hanging onto element (issue #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\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\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 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$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\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\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\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: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\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\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\tresults.push( 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\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\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\tSizzle.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\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\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, matcherFromGroupMatchers( 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 Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( 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\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[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\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 ) && testContext( 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// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\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\n\n\nfunction nodeName( elem, name ) {\n\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\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 (#9521)\n\t// Strict HTML recognition (#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 Sizzle\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 ( typeof elem.contentDocument !== \"undefined\" ) {\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.stackTrace );\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 stack, 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.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = 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 master Deferred\n\t\t\tmaster = 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\tmaster.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, master.done( updateFunc( i ) ).resolve, master.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 ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.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 ), master.reject );\n\t\t}\n\n\t\treturn master.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\njQuery.Deferred.exceptionHook = function( error, stack ) {\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, error.stack, stack );\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 #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\tvalue :\n\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 (#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 #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 (#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\nvar swap = function( elem, options, callback, args ) {\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.apply( elem, args || [] );\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\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// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\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\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\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 (#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 (#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\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 (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#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\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\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\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// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\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 = {};\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\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ 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 (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #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 (#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\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\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\", returnTrue );\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, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\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 notAsync, 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\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\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\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\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\t\t\t\t\t\treturn result.value;\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 the\n\t\t\t\t// 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.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\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 (#504, #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\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\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\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, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\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\tdelegateType: delegateType\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/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\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\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, pdataCur, 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.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.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 = concat.apply( [], 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 (#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// Reenable 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} );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\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.replace( rxhtmlTag, \"<$1></$2>\" );\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 Sizzle here for performance reasons: 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 getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #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 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\treliableMarginLeftVal,\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 (#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\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\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, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\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\trcustomProp = /^--/,\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\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\tif ( box === \"margin\" ) {\n\t\t\tdelta += 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;\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// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\t// Support: Android <=4.1 - 4.3 only\n\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t// Support: IE 9-11 only\n\t// Also use offsetWidth/offsetHeight for when box sizing is unreliable\n\t// We use getClientRects() to check for hidden/disconnected.\n\t// In those cases, the computed value can be trusted to be border-box\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\t\tval === \"auto\" ||\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\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\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": 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 (#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 #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 (#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\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\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\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\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/* 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 )` (#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\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\t\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 && type !== false ) {\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.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\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// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#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 classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\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\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\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\telem.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 classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\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\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\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\telem.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 type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\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\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\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = 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\"\" :\n\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\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 (#14686, #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 (#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\n\n\nsupport.focusin = \"onfocusin\" in window;\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 (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#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\" ) || {} )[ 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 (#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\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = Date.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\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\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\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} )\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} )\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// #7653, #8125, #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 (#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\toriginAnchor.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 #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\t\tjQuery( callbackContext ) :\n\t\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 (#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 #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 (#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// #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++ ) + uncached;\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// 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\n\njQuery._evalUrl = function( url, options ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#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 );\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// #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 #8605, #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// #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++ ) );\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\n// Attach a bunch of functions for handling common AJAX events\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.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( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( 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( ( \"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// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\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\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\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// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","module.exports = global[\"m\"] = require(\"-!./mithril.js\");","module.exports = global[\"moment\"] = require(\"-!./moment.js\");","//! moment.js\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 input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\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 input != null && Object.prototype.toString.call(input) === '[object Object]';\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 (obj.hasOwnProperty(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 typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n }\n\n function isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n }\n\n function map(arr, fn) {\n var res = [], i;\n for (i = 0; i < arr.length; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\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 invalidMonth : null,\n invalidFormat : false,\n userInvalidated : false,\n iso : false,\n parsedDateParts : [],\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 var len = t.length >>> 0;\n\n for (var 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 if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n var isNowValid = !isNaN(m._d.getTime()) &&\n flags.overflow < 0 &&\n !flags.empty &&\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\n if (m._strict) {\n isNowValid = 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 }\n else {\n return isNowValid;\n }\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 }\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\n function copyConfig(to, from) {\n var i, prop, val;\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 (momentProperties.length > 0) {\n for (i = 0; i < momentProperties.length; 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 var updateInProgress = false;\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 obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\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 // 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 ((dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n function warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\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 var arg;\n for (var i = 0; i < arguments.length; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (var key in arguments[0]) {\n arg += key + ': ' + arguments[0][key] + ', ';\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(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\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 input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n }\n\n function set (config) {\n var prop, i;\n for (i in config) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\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 '|' + (/\\d{1,2}/).source);\n }\n\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig), 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 (hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])) {\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, 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 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.replace(/MMMM|MM|DD|dddd/g, function (val) {\n return val.slice(1);\n });\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 var 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 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\n function addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n }\n\n function normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : 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\n function addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n }\n\n function getPrioritizedUnits(unitsObj) {\n var units = [];\n for (var u in unitsObj) {\n units.push({unit: u, priority: priorities[u]});\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\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 (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n }\n\n var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\n var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n var formatFunctions = {};\n\n var 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(func.apply(this, arguments), token);\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), i, 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 = '', i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : 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] = 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(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n }\n\n var match1 = /\\d/; // 0 - 9\n var match2 = /\\d\\d/; // 00 - 99\n var match3 = /\\d{3}/; // 000 - 999\n var match4 = /\\d{4}/; // 0000 - 9999\n var match6 = /[+-]?\\d{6}/; // -999999 - 999999\n var match1to2 = /\\d\\d?/; // 0 - 99\n var match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\n var match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\n var match1to3 = /\\d{1,3}/; // 0 - 999\n var match1to4 = /\\d{1,4}/; // 0 - 9999\n var match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\n var matchUnsigned = /\\d+/; // 0 - inf\n var matchSigned = /[+-]?\\d+/; // -inf - inf\n\n var matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\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 var matchWord = /[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\n var regexes = {};\n\n function addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : 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(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n }\n\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n\n var tokens = {};\n\n function addParseToken (token, callback) {\n var i, func = callback;\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 for (i = 0; i < token.length; 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 var YEAR = 0;\n var MONTH = 1;\n var DATE = 2;\n var HOUR = 3;\n var MINUTE = 4;\n var SECOND = 5;\n var MILLISECOND = 6;\n var WEEK = 7;\n var WEEKDAY = 8;\n\n // FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + 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 // ALIASES\n\n addUnitAlias('year', 'y');\n\n // PRIORITIES\n\n addUnitPriority('year', 1);\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] = 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 function isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\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 return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n }\n\n function set$1 (mom, unit, value) {\n if (mom.isValid() && !isNaN(value)) {\n if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n }\n else {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n }\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\n function stringSet (units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units);\n for (var i = 0; i < prioritized.length; 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 ? (isLeapYear(year) ? 29 : 28) : (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 // ALIASES\n\n addUnitAlias('month', 'M');\n\n // PRIORITY\n\n addUnitPriority('month', 8);\n\n // PARSING\n\n addRegexToken('M', match1to2);\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 MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\n var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n function localeMonths (m, format) {\n if (!m) {\n return isArray(this._months) ? this._months :\n this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] :\n this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n function localeMonthsShort (m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort :\n this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n function handleStrictParse(monthName, format, strict) {\n var i, ii, mom, 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(mom, '').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('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n }\n if (!strict && !this._monthsParse[i]) {\n regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n return i;\n } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\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 var dayOfMonth;\n\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 dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\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 var defaultMonthsShortRegex = matchWord;\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 : this._monthsShortRegex;\n }\n }\n\n var defaultMonthsRegex = matchWord;\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 : this._monthsRegex;\n }\n }\n\n function computeMonthsParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortPieces.push(this.monthsShort(mom, ''));\n longPieces.push(this.months(mom, ''));\n mixedPieces.push(this.months(mom, ''));\n mixedPieces.push(this.monthsShort(mom, ''));\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 for (i = 0; i < 12; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n }\n for (i = 0; i < 24; i++) {\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\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 = new Date(y, m, d, h, M, s, ms);\n\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n return date;\n }\n\n function createUTCDate (y) {\n var date = new Date(Date.UTC.apply(null, arguments));\n\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\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, 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, 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 // ALIASES\n\n addUnitAlias('week', 'w');\n addUnitAlias('isoWeek', 'W');\n\n // PRIORITIES\n\n addUnitPriority('week', 5);\n addUnitPriority('isoWeek', 5);\n\n // PARSING\n\n addRegexToken('w', match1to2);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2);\n addRegexToken('WW', match1to2, match2);\n\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\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 1st 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 // ALIASES\n\n addUnitAlias('day', 'd');\n addUnitAlias('weekday', 'e');\n addUnitAlias('isoWeekday', 'E');\n\n // PRIORITY\n addUnitPriority('day', 11);\n addUnitPriority('weekday', 11);\n addUnitPriority('isoWeekday', 11);\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\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n function localeWeekdays (m, format) {\n if (!m) {\n return isArray(this._weekdays) ? this._weekdays :\n this._weekdays['standalone'];\n }\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n }\n\n var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n function localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n }\n\n var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n function localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n }\n\n function handleStrictParse$1(weekdayName, format, strict) {\n var i, ii, mom, 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(mom, '').toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').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('^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$', 'i');\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$', 'i');\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$', 'i');\n }\n if (!this._weekdaysParse[i]) {\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\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 var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\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 var defaultWeekdaysRegex = matchWord;\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 : this._weekdaysRegex;\n }\n }\n\n var defaultWeekdaysShortRegex = matchWord;\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 : this._weekdaysShortRegex;\n }\n }\n\n var defaultWeekdaysMinRegex = matchWord;\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 : this._weekdaysMinRegex;\n }\n }\n\n\n function computeWeekdaysParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom, minp, shortp, 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 = this.weekdaysMin(mom, '');\n shortp = this.weekdaysShort(mom, '');\n longp = 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 for (i = 0; i < 7; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\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('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\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 '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\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 '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n function meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n }\n\n meridiem('a', true);\n meridiem('A', false);\n\n // ALIASES\n\n addUnitAlias('hour', 'h');\n\n // PRIORITY\n addUnitPriority('hour', 13);\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);\n addRegexToken('h', match1to2);\n addRegexToken('k', match1to2);\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 var 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 var 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 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\n // MOMENTS\n\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 var getSetHour = makeGetSet('Hours', true);\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 var localeFamilies = {};\n var globalLocale;\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, j, next, locale, 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 (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\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 loadLocale(name) {\n var oldLocale = null;\n // TODO: Find a better way to register and load all the locales in Node\n if (!locales[name] && (typeof module !== 'undefined') &&\n module && module.exports) {\n try {\n oldLocale = globalLocale._abbr;\n var aliasedRequire = require;\n aliasedRequire('./locale/' + name);\n getSetGlobalLocale(oldLocale);\n } catch (e) {}\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 }\n else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n }\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('Locale ' + key + ' not found. Did you forget to load it?');\n }\n }\n }\n\n return globalLocale._abbr;\n }\n\n function defineLocale (name, config) {\n if (config !== null) {\n var locale, parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('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 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\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, tmpLocale, parentConfig = baseConfig;\n // MERGE\n tmpLocale = loadLocale(name);\n if (tmpLocale != null) {\n parentConfig = tmpLocale._config;\n }\n config = mergeConfigs(parentConfig, config);\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\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 } 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 var a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :\n a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :\n a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :\n a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n -1;\n\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\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 // 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 [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\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, date, input = [], currentDate, expectedWeekday, 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 (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\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] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n config._a[MILLISECOND] === 0) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n\n config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n expectedWeekday = config._useUTC ? config._d.getUTCDay() : 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 (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n getParsingFlags(config).weekdayMismatch = true;\n }\n }\n\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\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(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\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 var 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 begining of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to begining 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 // 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 = /^\\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 var basicIsoRegex = /^\\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\n var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n var 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 // YYYYMM is NOT allowed by the standard\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/]\n ];\n\n // iso time formats and regexes\n var 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\n var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n // date from iso format\n function configFromISO(config) {\n var i, l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime, dateFormat, timeFormat, tzFormat;\n\n if (match) {\n getParsingFlags(config).iso = true;\n\n for (i = 0, l = isoDates.length; 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 = isoTimes.length; 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 // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n var rfc2822 = /^(?:(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\n function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\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.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n }\n\n function checkWeekday(weekdayStr, parsedInput, config) {\n if (weekdayStr) {\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).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 var 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 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 var m = hm % 100, 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 if (match) {\n var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\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 iso format or fallback\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n\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 // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\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 and will be removed in an upcoming major release. Please refer to ' +\n '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 // 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, parsedInput, tokens, token, skipped,\n stringLength = string.length,\n totalParsedInputLength = 0;\n\n tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n // console.log('token', token, 'parsedInput', parsedInput,\n // 'regex', getParseRegexForToken(token, config));\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(string.indexOf(parsedInput) + parsedInput.length);\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 }\n else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n }\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 = 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 (config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n config._a[HOUR] > 0) {\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(config._locale, config._a[HOUR], config._meridiem);\n\n configFromArray(config);\n checkOverflow(config);\n }\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\n scoreToBeat,\n i,\n currentScore;\n\n if (config._f.length === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n\n for (i = 0; i < config._f.length; i++) {\n currentScore = 0;\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 continue;\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 (scoreToBeat == null || currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\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 config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\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 (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if ((isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)) {\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\n var 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 = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n function isDurationValid(m) {\n for (var key in m) {\n if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n\n var unitHasDecimal = false;\n for (var i = 0; i < ordering.length; ++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 || 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 = +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 +\n 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 +\n quarters * 3 +\n 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 // FORMATTING\n\n function offset (token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset();\n var sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\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\n if (matches === null) {\n return null;\n }\n\n var chunk = matches[matches.length - 1] || [];\n var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ?\n 0 :\n 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 = (isMoment(input) || isDate(input) ? input.valueOf() : 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() / 15) * 15;\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(this, createDuration(input - offset, 'm'), 1, false);\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 }\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\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() &&\n 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\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 var isoRegex = /^(-|\\+)?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)) {\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 : (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) {// checks for null or undefined\n duration = {};\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\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 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 = {milliseconds: 0, months: 0};\n\n res.months = other.month() - base.month() +\n (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(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val; val = period; period = tmp;\n }\n\n val = typeof val === 'string' ? +val : val;\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 var subtract = createAdder(-1, 'subtract');\n\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' :\n diff < -1 ? 'lastWeek' :\n diff < 0 ? 'lastDay' :\n diff < 1 ? 'sameDay' :\n diff < 2 ? 'nextDay' :\n diff < 7 ? 'nextWeek' : 'sameElse';\n }\n\n function calendar$1 (time, formats) {\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\n var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\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(!isUndefined(units) ? 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(!isUndefined(units) ? 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 inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\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 this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\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,\n zoneDelta,\n 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': output = monthDiff(this, that) / 12; break;\n case 'month': output = monthDiff(this, that); break;\n case 'quarter': output = monthDiff(this, that) / 3; break;\n case 'second': output = (this - that) / 1e3; break; // 1000\n case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n default: output = this - that;\n }\n\n return asFloat ? output : absFloor(output);\n }\n\n function monthDiff (a, b) {\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, 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 var m = utc ? this.clone().utc() : this;\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\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).toISOString().replace('Z', formatMoment(m, 'Z'));\n }\n }\n return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\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 var zone = '';\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n var prefix = '[' + func + '(\"]';\n var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n var suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n }\n\n function format (inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n\n function from (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({to: this, from: time}).locale(this.locale()).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 (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({from: this, to: time}).locale(this.locale()).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 function startOf (units) {\n units = normalizeUnits(units);\n // the following switch intentionally omits break keywords\n // to utilize falling through the cases.\n switch (units) {\n case 'year':\n this.month(0);\n /* falls through */\n case 'quarter':\n case 'month':\n this.date(1);\n /* falls through */\n case 'week':\n case 'isoWeek':\n case 'day':\n case 'date':\n this.hours(0);\n /* falls through */\n case 'hour':\n this.minutes(0);\n /* falls through */\n case 'minute':\n this.seconds(0);\n /* falls through */\n case 'second':\n this.milliseconds(0);\n }\n\n // weeks are a special case\n if (units === 'week') {\n this.weekday(0);\n }\n if (units === 'isoWeek') {\n this.isoWeekday(1);\n }\n\n // quarters are also special\n if (units === 'quarter') {\n this.month(Math.floor(this.month() / 3) * 3);\n }\n\n return this;\n }\n\n function endOf (units) {\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond') {\n return this;\n }\n\n // 'date' is an alias for 'day', so it should be considered as such.\n if (units === 'date') {\n units = 'day';\n }\n\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\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 [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\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 // 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 addUnitAlias('weekYear', 'gg');\n addUnitAlias('isoWeekYear', 'GG');\n\n // PRIORITY\n\n addUnitPriority('weekYear', 1);\n addUnitPriority('isoWeekYear', 1);\n\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(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\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(this,\n input,\n this.week(),\n this.weekday(),\n this.localeData()._week.dow,\n this.localeData()._week.doy);\n }\n\n function getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n }\n\n function getISOWeeksInYear () {\n return weeksInYear(this.year(), 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 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 // ALIASES\n\n addUnitAlias('quarter', 'Q');\n\n // PRIORITY\n\n addUnitPriority('quarter', 7);\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 ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n }\n\n // FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n // ALIASES\n\n addUnitAlias('date', 'D');\n\n // PRIORITY\n addUnitPriority('date', 9);\n\n // PARSING\n\n addRegexToken('D', match1to2);\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 // ALIASES\n\n addUnitAlias('dayOfYear', 'DDD');\n\n // PRIORITY\n addUnitPriority('dayOfYear', 4);\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 = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 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 // ALIASES\n\n addUnitAlias('minute', 'm');\n\n // PRIORITY\n\n addUnitPriority('minute', 14);\n\n // PARSING\n\n addRegexToken('m', match1to2);\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 // ALIASES\n\n addUnitAlias('second', 's');\n\n // PRIORITY\n\n addUnitPriority('second', 15);\n\n // PARSING\n\n addRegexToken('s', match1to2);\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\n // ALIASES\n\n addUnitAlias('millisecond', 'ms');\n\n // PRIORITY\n\n addUnitPriority('millisecond', 16);\n\n // PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n\n var token;\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 // MOMENTS\n\n var 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 proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\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.isoWeeksInYear = getISOWeeksInYear;\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('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\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\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 var 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 var 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\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n var i;\n var out = [];\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 dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal : function (number) {\n var b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? 'th' :\n (b === 1) ? 'st' :\n (b === 2) ? 'nd' :\n (b === 3) ? 'rd' : 'th';\n return number + output;\n }\n });\n\n // Side effect imports\n\n hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\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 var days = this._days;\n var months = this._months;\n var data = this._data;\n var seconds, minutes, hours, years, 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 (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\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 var months;\n var milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n return units === 'month' ? months : months / 12;\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' : return days / 7 + milliseconds / 6048e5;\n case 'day' : return days + milliseconds / 864e5;\n case 'hour' : return days * 24 + milliseconds / 36e5;\n case 'minute' : return days * 1440 + milliseconds / 6e4;\n case 'second' : return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n default: throw new Error('Unknown unit ' + units);\n }\n }\n }\n\n // TODO: Use this.as('ms')?\n function valueOf$1 () {\n if (!this.isValid()) {\n return NaN;\n }\n return (\n this._milliseconds +\n this._days * 864e5 +\n (this._months % 12) * 2592e6 +\n toInt(this._months / 12) * 31536e6\n );\n }\n\n function makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n }\n\n var asMilliseconds = makeAs('ms');\n var asSeconds = makeAs('s');\n var asMinutes = makeAs('m');\n var asHours = makeAs('h');\n var asDays = makeAs('d');\n var asWeeks = makeAs('w');\n var asMonths = makeAs('M');\n var asYears = makeAs('y');\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 var seconds = makeGetter('seconds');\n var minutes = makeGetter('minutes');\n var hours = makeGetter('hours');\n var days = makeGetter('days');\n var months = makeGetter('months');\n var years = makeGetter('years');\n\n function weeks () {\n return absFloor(this.days() / 7);\n }\n\n var round = Math.round;\n var 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\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, locale) {\n var duration = createDuration(posNegDuration).abs();\n var seconds = round(duration.as('s'));\n var minutes = round(duration.as('m'));\n var hours = round(duration.as('h'));\n var days = round(duration.as('d'));\n var months = round(duration.as('M'));\n var years = round(duration.as('y'));\n\n var a = 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 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 (withSuffix) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var locale = this.localeData();\n var output = relativeTime$1(this, !withSuffix, 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 var days = abs$1(this._days);\n var months = abs$1(this._months);\n var minutes, hours, years;\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\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n var Y = years;\n var M = months;\n var D = days;\n var h = hours;\n var m = minutes;\n var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n var total = this.asSeconds();\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 var totalSign = total < 0 ? '-' : '';\n var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n return totalSign + 'P' +\n (Y ? ymSign + Y + 'Y' : '') +\n (M ? ymSign + M + 'M' : '') +\n (D ? daysSign + D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? hmsSign + h + 'H' : '') +\n (m ? hmsSign + m + 'M' : '') +\n (s ? hmsSign + s + 'S' : '');\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.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('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n proto$2.lang = lang;\n\n // Side effect imports\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, 10) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n // Side effect imports\n\n\n hooks.version = '2.22.2';\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: 'YYYY-[W]WW', // <input type=\"week\" />\n MONTH: 'YYYY-MM' // <input type=\"month\" />\n };\n\n return hooks;\n\n})));\n","if(!global[\"m\"]) global[\"m\"] = {};\nmodule.exports = global[\"m\"][\"bidi\"] = require(\"-!./bidi.js\");","( function _package( factory ){\n\tif( typeof define === 'function' && define.amd ){\n\t\tdefine( [ 'mithril' ], factory )\n\t}\n\telse if( typeof exports === 'object' ){\n\t\tmodule.exports = factory( require( 'mithril' ) )\n\t}\n\telse{\n\t\tfactory( m )\n\t}\n}( function define( m ){\n\tfunction bidi( node, prop ){\n\t\tvar type = node.tag === 'select'\n\t\t\t? node.attrs.multi\n\t\t\t\t? 'multi'\n\t\t\t\t: 'select'\n\t\t\t: node.attrs.type\n\n\t\t// Setup: bind listeners\n\t\tif( type === 'multi' ){\n\t\t\tnode.attrs.onchange = function(){\n\t\t\t\tprop( [].slice.call( this.selectedOptions, function( x ){\n\t\t\t\t\treturn x.value\n\t\t\t\t} ) )\n\t\t\t}\n\t\t}\n\t\telse if( type === 'select' ){\n\t\t\tnode.attrs.onchange = function( e ){\n\t\t\t\tprop( this.selectedOptions[ 0 ].value )\n\t\t\t}\n\t\t}\n\t\telse if( type === 'checkbox' ){\n\t\t\tnode.attrs.onchange = function( e ){\n\t\t\t\tprop( this.checked )\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tnode.attrs.onchange = node.attrs.oninput = function( e ){\n\t\t\t\tprop( this.value )\n\t\t\t}\n\t\t}\n\n\t\tif( node.tag === 'select' ){\n\t\t\tnode.children.forEach( function( option ){\n\t\t\t\tif( option.attrs.value === prop() || option.children[ 0 ] === prop() ){\n\t\t\t\t\toption.attrs.selected = true\n\t\t\t\t}\n\t\t\t} )\n\t\t}\n\t\telse if( type === 'checkbox' ){\n\t\t\tnode.attrs.checked = prop()\n\t\t}\n\t\telse if( type === 'radio' ){\n\t\t\tnode.attrs.checked = prop() === node.attrs.value\n\t\t}\n\t\telse {\n\t\t\tnode.attrs.value = prop()\n\t\t}\n\n\t\treturn node\n\t}\n\n\tbidi.view = function( ctrl, node, prop ){\n\t return bidi( node, node.attrs.bidi )\n\t}\n\n\tif( m.attrs ) m.attrs.bidi = bidi\n\t\n\tm.bidi = bidi\n\n\treturn bidi\n} ) )\n","/* ========================================================================\n * Bootstrap: affix.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#affix\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n 'use strict';\n\n // AFFIX CLASS DEFINITION\n // ======================\n\n var Affix = function (element, options) {\n this.options = $.extend({}, Affix.DEFAULTS, options)\n\n var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target)\n\n this.$target = target\n .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))\n\n this.$element = $(element)\n this.affixed = null\n this.unpin = null\n this.pinnedOffset = null\n\n this.checkPosition()\n }\n\n Affix.VERSION = '3.4.1'\n\n Affix.RESET = 'affix affix-top affix-bottom'\n\n Affix.DEFAULTS = {\n offset: 0,\n target: window\n }\n\n Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n var scrollTop = this.$target.scrollTop()\n var position = this.$element.offset()\n var targetHeight = this.$target.height()\n\n if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n if (this.affixed == 'bottom') {\n if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n }\n\n var initializing = this.affixed == null\n var colliderTop = initializing ? scrollTop : position.top\n var colliderHeight = initializing ? targetHeight : height\n\n if (offsetTop != null && scrollTop <= offsetTop) return 'top'\n if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n return false\n }\n\n Affix.prototype.getPinnedOffset = function () {\n if (this.pinnedOffset) return this.pinnedOffset\n this.$element.removeClass(Affix.RESET).addClass('affix')\n var scrollTop = this.$target.scrollTop()\n var position = this.$element.offset()\n return (this.pinnedOffset = position.top - scrollTop)\n }\n\n Affix.prototype.checkPositionWithEventLoop = function () {\n setTimeout($.proxy(this.checkPosition, this), 1)\n }\n\n Affix.prototype.checkPosition = function () {\n if (!this.$element.is(':visible')) return\n\n var height = this.$element.height()\n var offset = this.options.offset\n var offsetTop = offset.top\n var offsetBottom = offset.bottom\n var scrollHeight = Math.max($(document).height(), $(document.body).height())\n\n if (typeof offset != 'object') offsetBottom = offsetTop = offset\n if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)\n if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n if (this.affixed != affix) {\n if (this.unpin != null) this.$element.css('top', '')\n\n var affixType = 'affix' + (affix ? '-' + affix : '')\n var e = $.Event(affixType + '.bs.affix')\n\n this.$element.trigger(e)\n\n if (e.isDefaultPrevented()) return\n\n this.affixed = affix\n this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n this.$element\n .removeClass(Affix.RESET)\n .addClass(affixType)\n .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n }\n\n if (affix == 'bottom') {\n this.$element.offset({\n top: scrollHeight - height - offsetBottom\n })\n }\n }\n\n\n // AFFIX PLUGIN DEFINITION\n // =======================\n\n function Plugin(option) {\n return this.each(function () {\n var $this = $(this)\n var data = $this.data('bs.affix')\n var options = typeof option == 'object' && option\n\n if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n if (typeof option == 'string') data[option]()\n })\n }\n\n var old = $.fn.affix\n\n $.fn.affix = Plugin\n $.fn.affix.Constructor = Affix\n\n\n // AFFIX NO CONFLICT\n // =================\n\n $.fn.affix.noConflict = function () {\n $.fn.affix = old\n return this\n }\n\n\n // AFFIX DATA-API\n // ==============\n\n $(window).on('load', function () {\n $('[data-spy=\"affix\"]').each(function () {\n var $spy = $(this)\n var data = $spy.data()\n\n data.offset = data.offset || {}\n\n if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n if (data.offsetTop != null) data.offset.top = data.offsetTop\n\n Plugin.call($spy, data)\n })\n })\n\n}(jQuery);\n","/* ========================================================================\n * Bootstrap: dropdown.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n 'use strict';\n\n // DROPDOWN CLASS DEFINITION\n // =========================\n\n var backdrop = '.dropdown-backdrop'\n var toggle = '[data-toggle=\"dropdown\"]'\n var Dropdown = function (element) {\n $(element).on('click.bs.dropdown', this.toggle)\n }\n\n Dropdown.VERSION = '3.4.1'\n\n function getParent($this) {\n var selector = $this.attr('data-target')\n\n if (!selector) {\n selector = $this.attr('href')\n selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n }\n\n var $parent = selector !== '#' ? $(document).find(selector) : null\n\n return $parent && $parent.length ? $parent : $this.parent()\n }\n\n function clearMenus(e) {\n if (e && e.which === 3) return\n $(backdrop).remove()\n $(toggle).each(function () {\n var $this = $(this)\n var $parent = getParent($this)\n var relatedTarget = { relatedTarget: this }\n\n if (!$parent.hasClass('open')) return\n\n if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\n $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n if (e.isDefaultPrevented()) return\n\n $this.attr('aria-expanded', 'false')\n $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\n })\n }\n\n Dropdown.prototype.toggle = function (e) {\n var $this = $(this)\n\n if ($this.is('.disabled, :disabled')) return\n\n var $parent = getParent($this)\n var isActive = $parent.hasClass('open')\n\n clearMenus()\n\n if (!isActive) {\n if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n // if mobile we use a backdrop because click events don't delegate\n $(document.createElement('div'))\n .addClass('dropdown-backdrop')\n .insertAfter($(this))\n .on('click', clearMenus)\n }\n\n var relatedTarget = { relatedTarget: this }\n $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n if (e.isDefaultPrevented()) return\n\n $this\n .trigger('focus')\n .attr('aria-expanded', 'true')\n\n $parent\n .toggleClass('open')\n .trigger($.Event('shown.bs.dropdown', relatedTarget))\n }\n\n return false\n }\n\n Dropdown.prototype.keydown = function (e) {\n if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n var $this = $(this)\n\n e.preventDefault()\n e.stopPropagation()\n\n if ($this.is('.disabled, :disabled')) return\n\n var $parent = getParent($this)\n var isActive = $parent.hasClass('open')\n\n if (!isActive && e.which != 27 || isActive && e.which == 27) {\n if (e.which == 27) $parent.find(toggle).trigger('focus')\n return $this.trigger('click')\n }\n\n var desc = ' li:not(.disabled):visible a'\n var $items = $parent.find('.dropdown-menu' + desc)\n\n if (!$items.length) return\n\n var index = $items.index(e.target)\n\n if (e.which == 38 && index > 0) index-- // up\n if (e.which == 40 && index < $items.length - 1) index++ // down\n if (!~index) index = 0\n\n $items.eq(index).trigger('focus')\n }\n\n\n // DROPDOWN PLUGIN DEFINITION\n // ==========================\n\n function Plugin(option) {\n return this.each(function () {\n var $this = $(this)\n var data = $this.data('bs.dropdown')\n\n if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n if (typeof option == 'string') data[option].call($this)\n })\n }\n\n var old = $.fn.dropdown\n\n $.fn.dropdown = Plugin\n $.fn.dropdown.Constructor = Dropdown\n\n\n // DROPDOWN NO CONFLICT\n // ====================\n\n $.fn.dropdown.noConflict = function () {\n $.fn.dropdown = old\n return this\n }\n\n\n // APPLY TO STANDARD DROPDOWN ELEMENTS\n // ===================================\n\n $(document)\n .on('click.bs.dropdown.data-api', clearMenus)\n .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\n}(jQuery);\n","/* ========================================================================\n * Bootstrap: modal.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#modals\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n 'use strict';\n\n // MODAL CLASS DEFINITION\n // ======================\n\n var Modal = function (element, options) {\n this.options = options\n this.$body = $(document.body)\n this.$element = $(element)\n this.$dialog = this.$element.find('.modal-dialog')\n this.$backdrop = null\n this.isShown = null\n this.originalBodyPad = null\n this.scrollbarWidth = 0\n this.ignoreBackdropClick = false\n this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom'\n\n if (this.options.remote) {\n this.$element\n .find('.modal-content')\n .load(this.options.remote, $.proxy(function () {\n this.$element.trigger('loaded.bs.modal')\n }, this))\n }\n }\n\n Modal.VERSION = '3.4.1'\n\n Modal.TRANSITION_DURATION = 300\n Modal.BACKDROP_TRANSITION_DURATION = 150\n\n Modal.DEFAULTS = {\n backdrop: true,\n keyboard: true,\n show: true\n }\n\n Modal.prototype.toggle = function (_relatedTarget) {\n return this.isShown ? this.hide() : this.show(_relatedTarget)\n }\n\n Modal.prototype.show = function (_relatedTarget) {\n var that = this\n var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n this.$element.trigger(e)\n\n if (this.isShown || e.isDefaultPrevented()) return\n\n this.isShown = true\n\n this.checkScrollbar()\n this.setScrollbar()\n this.$body.addClass('modal-open')\n\n this.escape()\n this.resize()\n\n this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n this.$dialog.on('mousedown.dismiss.bs.modal', function () {\n that.$element.one('mouseup.dismiss.bs.modal', function (e) {\n if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true\n })\n })\n\n this.backdrop(function () {\n var transition = $.support.transition && that.$element.hasClass('fade')\n\n if (!that.$element.parent().length) {\n that.$element.appendTo(that.$body) // don't move modals dom position\n }\n\n that.$element\n .show()\n .scrollTop(0)\n\n that.adjustDialog()\n\n if (transition) {\n that.$element[0].offsetWidth // force reflow\n }\n\n that.$element.addClass('in')\n\n that.enforceFocus()\n\n var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n transition ?\n that.$dialog // wait for modal to slide in\n .one('bsTransitionEnd', function () {\n that.$element.trigger('focus').trigger(e)\n })\n .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n that.$element.trigger('focus').trigger(e)\n })\n }\n\n Modal.prototype.hide = function (e) {\n if (e) e.preventDefault()\n\n e = $.Event('hide.bs.modal')\n\n this.$element.trigger(e)\n\n if (!this.isShown || e.isDefaultPrevented()) return\n\n this.isShown = false\n\n this.escape()\n this.resize()\n\n $(document).off('focusin.bs.modal')\n\n this.$element\n .removeClass('in')\n .off('click.dismiss.bs.modal')\n .off('mouseup.dismiss.bs.modal')\n\n this.$dialog.off('mousedown.dismiss.bs.modal')\n\n $.support.transition && this.$element.hasClass('fade') ?\n this.$element\n .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n this.hideModal()\n }\n\n Modal.prototype.enforceFocus = function () {\n $(document)\n .off('focusin.bs.modal') // guard against infinite focus loop\n .on('focusin.bs.modal', $.proxy(function (e) {\n if (document !== e.target &&\n this.$element[0] !== e.target &&\n !this.$element.has(e.target).length) {\n this.$element.trigger('focus')\n }\n }, this))\n }\n\n Modal.prototype.escape = function () {\n if (this.isShown && this.options.keyboard) {\n this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n e.which == 27 && this.hide()\n }, this))\n } else if (!this.isShown) {\n this.$element.off('keydown.dismiss.bs.modal')\n }\n }\n\n Modal.prototype.resize = function () {\n if (this.isShown) {\n $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n } else {\n $(window).off('resize.bs.modal')\n }\n }\n\n Modal.prototype.hideModal = function () {\n var that = this\n this.$element.hide()\n this.backdrop(function () {\n that.$body.removeClass('modal-open')\n that.resetAdjustments()\n that.resetScrollbar()\n that.$element.trigger('hidden.bs.modal')\n })\n }\n\n Modal.prototype.removeBackdrop = function () {\n this.$backdrop && this.$backdrop.remove()\n this.$backdrop = null\n }\n\n Modal.prototype.backdrop = function (callback) {\n var that = this\n var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n if (this.isShown && this.options.backdrop) {\n var doAnimate = $.support.transition && animate\n\n this.$backdrop = $(document.createElement('div'))\n .addClass('modal-backdrop ' + animate)\n .appendTo(this.$body)\n\n this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n if (this.ignoreBackdropClick) {\n this.ignoreBackdropClick = false\n return\n }\n if (e.target !== e.currentTarget) return\n this.options.backdrop == 'static'\n ? this.$element[0].focus()\n : this.hide()\n }, this))\n\n if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n this.$backdrop.addClass('in')\n\n if (!callback) return\n\n doAnimate ?\n this.$backdrop\n .one('bsTransitionEnd', callback)\n .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n callback()\n\n } else if (!this.isShown && this.$backdrop) {\n this.$backdrop.removeClass('in')\n\n var callbackRemove = function () {\n that.removeBackdrop()\n callback && callback()\n }\n $.support.transition && this.$element.hasClass('fade') ?\n this.$backdrop\n .one('bsTransitionEnd', callbackRemove)\n .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n callbackRemove()\n\n } else if (callback) {\n callback()\n }\n }\n\n // these following methods are used to handle overflowing modals\n\n Modal.prototype.handleUpdate = function () {\n this.adjustDialog()\n }\n\n Modal.prototype.adjustDialog = function () {\n var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n this.$element.css({\n paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n })\n }\n\n Modal.prototype.resetAdjustments = function () {\n this.$element.css({\n paddingLeft: '',\n paddingRight: ''\n })\n }\n\n Modal.prototype.checkScrollbar = function () {\n var fullWindowWidth = window.innerWidth\n if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8\n var documentElementRect = document.documentElement.getBoundingClientRect()\n fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)\n }\n this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth\n this.scrollbarWidth = this.measureScrollbar()\n }\n\n Modal.prototype.setScrollbar = function () {\n var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n this.originalBodyPad = document.body.style.paddingRight || ''\n var scrollbarWidth = this.scrollbarWidth\n if (this.bodyIsOverflowing) {\n this.$body.css('padding-right', bodyPad + scrollbarWidth)\n $(this.fixedContent).each(function (index, element) {\n var actualPadding = element.style.paddingRight\n var calculatedPadding = $(element).css('padding-right')\n $(element)\n .data('padding-right', actualPadding)\n .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px')\n })\n }\n }\n\n Modal.prototype.resetScrollbar = function () {\n this.$body.css('padding-right', this.originalBodyPad)\n $(this.fixedContent).each(function (index, element) {\n var padding = $(element).data('padding-right')\n $(element).removeData('padding-right')\n element.style.paddingRight = padding ? padding : ''\n })\n }\n\n Modal.prototype.measureScrollbar = function () { // thx walsh\n var scrollDiv = document.createElement('div')\n scrollDiv.className = 'modal-scrollbar-measure'\n this.$body.append(scrollDiv)\n var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n this.$body[0].removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n\n // MODAL PLUGIN DEFINITION\n // =======================\n\n function Plugin(option, _relatedTarget) {\n return this.each(function () {\n var $this = $(this)\n var data = $this.data('bs.modal')\n var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n if (typeof option == 'string') data[option](_relatedTarget)\n else if (options.show) data.show(_relatedTarget)\n })\n }\n\n var old = $.fn.modal\n\n $.fn.modal = Plugin\n $.fn.modal.Constructor = Modal\n\n\n // MODAL NO CONFLICT\n // =================\n\n $.fn.modal.noConflict = function () {\n $.fn.modal = old\n return this\n }\n\n\n // MODAL DATA-API\n // ==============\n\n $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n var $this = $(this)\n var href = $this.attr('href')\n var target = $this.attr('data-target') ||\n (href && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n\n var $target = $(document).find(target)\n var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n if ($this.is('a')) e.preventDefault()\n\n $target.one('show.bs.modal', function (showEvent) {\n if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n $target.one('hidden.bs.modal', function () {\n $this.is(':visible') && $this.trigger('focus')\n })\n })\n Plugin.call($target, option, this)\n })\n\n}(jQuery);\n","/* ========================================================================\n * Bootstrap: tooltip.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n+function ($) {\n 'use strict';\n\n var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\n var uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n ]\n\n var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n var DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n }\n\n /**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\n var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n /**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\n var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\n function allowedAttribute(attr, allowedAttributeList) {\n var attrName = attr.nodeName.toLowerCase()\n\n if ($.inArray(attrName, allowedAttributeList) !== -1) {\n if ($.inArray(attrName, uriAttrs) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n var regExp = $(allowedAttributeList).filter(function (index, value) {\n return value instanceof RegExp\n })\n\n // Check if a regular expression validates the attribute.\n for (var i = 0, l = regExp.length; i < l; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n }\n\n function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n // IE 8 and below don't support createHTMLDocument\n if (!document.implementation || !document.implementation.createHTMLDocument) {\n return unsafeHtml\n }\n\n var createdDocument = document.implementation.createHTMLDocument('sanitization')\n createdDocument.body.innerHTML = unsafeHtml\n\n var whitelistKeys = $.map(whiteList, function (el, i) { return i })\n var elements = $(createdDocument.body).find('*')\n\n for (var i = 0, len = elements.length; i < len; i++) {\n var el = elements[i]\n var elName = el.nodeName.toLowerCase()\n\n if ($.inArray(elName, whitelistKeys) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n var attributeList = $.map(el.attributes, function (el) { return el })\n var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n for (var j = 0, len2 = attributeList.length; j < len2; j++) {\n if (!allowedAttribute(attributeList[j], whitelistedAttributes)) {\n el.removeAttribute(attributeList[j].nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n }\n\n // TOOLTIP PUBLIC CLASS DEFINITION\n // ===============================\n\n var Tooltip = function (element, options) {\n this.type = null\n this.options = null\n this.enabled = null\n this.timeout = null\n this.hoverState = null\n this.$element = null\n this.inState = null\n\n this.init('tooltip', element, options)\n }\n\n Tooltip.VERSION = '3.4.1'\n\n Tooltip.TRANSITION_DURATION = 150\n\n Tooltip.DEFAULTS = {\n animation: true,\n placement: 'top',\n selector: false,\n template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n container: false,\n viewport: {\n selector: 'body',\n padding: 0\n },\n sanitize : true,\n sanitizeFn : null,\n whiteList : DefaultWhitelist\n }\n\n Tooltip.prototype.init = function (type, element, options) {\n this.enabled = true\n this.type = type\n this.$element = $(element)\n this.options = this.getOptions(options)\n this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))\n this.inState = { click: false, hover: false, focus: false }\n\n if (this.$element[0] instanceof document.constructor && !this.options.selector) {\n throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')\n }\n\n var triggers = this.options.trigger.split(' ')\n\n for (var i = triggers.length; i--;) {\n var trigger = triggers[i]\n\n if (trigger == 'click') {\n this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n } else if (trigger != 'manual') {\n var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'\n var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n }\n }\n\n this.options.selector ?\n (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n this.fixTitle()\n }\n\n Tooltip.prototype.getDefaults = function () {\n return Tooltip.DEFAULTS\n }\n\n Tooltip.prototype.getOptions = function (options) {\n var dataAttributes = this.$element.data()\n\n for (var dataAttr in dataAttributes) {\n if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {\n delete dataAttributes[dataAttr]\n }\n }\n\n options = $.extend({}, this.getDefaults(), dataAttributes, options)\n\n if (options.delay && typeof options.delay == 'number') {\n options.delay = {\n show: options.delay,\n hide: options.delay\n }\n }\n\n if (options.sanitize) {\n options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn)\n }\n\n return options\n }\n\n Tooltip.prototype.getDelegateOptions = function () {\n var options = {}\n var defaults = this.getDefaults()\n\n this._options && $.each(this._options, function (key, value) {\n if (defaults[key] != value) options[key] = value\n })\n\n return options\n }\n\n Tooltip.prototype.enter = function (obj) {\n var self = obj instanceof this.constructor ?\n obj : $(obj.currentTarget).data('bs.' + this.type)\n\n if (!self) {\n self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n $(obj.currentTarget).data('bs.' + this.type, self)\n }\n\n if (obj instanceof $.Event) {\n self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true\n }\n\n if (self.tip().hasClass('in') || self.hoverState == 'in') {\n self.hoverState = 'in'\n return\n }\n\n clearTimeout(self.timeout)\n\n self.hoverState = 'in'\n\n if (!self.options.delay || !self.options.delay.show) return self.show()\n\n self.timeout = setTimeout(function () {\n if (self.hoverState == 'in') self.show()\n }, self.options.delay.show)\n }\n\n Tooltip.prototype.isInStateTrue = function () {\n for (var key in this.inState) {\n if (this.inState[key]) return true\n }\n\n return false\n }\n\n Tooltip.prototype.leave = function (obj) {\n var self = obj instanceof this.constructor ?\n obj : $(obj.currentTarget).data('bs.' + this.type)\n\n if (!self) {\n self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n $(obj.currentTarget).data('bs.' + this.type, self)\n }\n\n if (obj instanceof $.Event) {\n self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false\n }\n\n if (self.isInStateTrue()) return\n\n clearTimeout(self.timeout)\n\n self.hoverState = 'out'\n\n if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n self.timeout = setTimeout(function () {\n if (self.hoverState == 'out') self.hide()\n }, self.options.delay.hide)\n }\n\n Tooltip.prototype.show = function () {\n var e = $.Event('show.bs.' + this.type)\n\n if (this.hasContent() && this.enabled) {\n this.$element.trigger(e)\n\n var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n if (e.isDefaultPrevented() || !inDom) return\n var that = this\n\n var $tip = this.tip()\n\n var tipId = this.getUID(this.type)\n\n this.setContent()\n $tip.attr('id', tipId)\n this.$element.attr('aria-describedby', tipId)\n\n if (this.options.animation) $tip.addClass('fade')\n\n var placement = typeof this.options.placement == 'function' ?\n this.options.placement.call(this, $tip[0], this.$element[0]) :\n this.options.placement\n\n var autoToken = /\\s?auto?\\s?/i\n var autoPlace = autoToken.test(placement)\n if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n $tip\n .detach()\n .css({ top: 0, left: 0, display: 'block' })\n .addClass(placement)\n .data('bs.' + this.type, this)\n\n this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element)\n this.$element.trigger('inserted.bs.' + this.type)\n\n var pos = this.getPosition()\n var actualWidth = $tip[0].offsetWidth\n var actualHeight = $tip[0].offsetHeight\n\n if (autoPlace) {\n var orgPlacement = placement\n var viewportDim = this.getPosition(this.$viewport)\n\n placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :\n placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :\n placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :\n placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :\n placement\n\n $tip\n .removeClass(orgPlacement)\n .addClass(placement)\n }\n\n var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n this.applyPlacement(calculatedOffset, placement)\n\n var complete = function () {\n var prevHoverState = that.hoverState\n that.$element.trigger('shown.bs.' + that.type)\n that.hoverState = null\n\n if (prevHoverState == 'out') that.leave(that)\n }\n\n $.support.transition && this.$tip.hasClass('fade') ?\n $tip\n .one('bsTransitionEnd', complete)\n .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n complete()\n }\n }\n\n Tooltip.prototype.applyPlacement = function (offset, placement) {\n var $tip = this.tip()\n var width = $tip[0].offsetWidth\n var height = $tip[0].offsetHeight\n\n // manually read margins because getBoundingClientRect includes difference\n var marginTop = parseInt($tip.css('margin-top'), 10)\n var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n // we must check for NaN for ie 8/9\n if (isNaN(marginTop)) marginTop = 0\n if (isNaN(marginLeft)) marginLeft = 0\n\n offset.top += marginTop\n offset.left += marginLeft\n\n // $.fn.offset doesn't round pixel values\n // so we use setOffset directly with our own function B-0\n $.offset.setOffset($tip[0], $.extend({\n using: function (props) {\n $tip.css({\n top: Math.round(props.top),\n left: Math.round(props.left)\n })\n }\n }, offset), 0)\n\n $tip.addClass('in')\n\n // check to see if placing tip in new offset caused the tip to resize itself\n var actualWidth = $tip[0].offsetWidth\n var actualHeight = $tip[0].offsetHeight\n\n if (placement == 'top' && actualHeight != height) {\n offset.top = offset.top + height - actualHeight\n }\n\n var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n if (delta.left) offset.left += delta.left\n else offset.top += delta.top\n\n var isVertical = /top|bottom/.test(placement)\n var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n $tip.offset(offset)\n this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n }\n\n Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {\n this.arrow()\n .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n .css(isVertical ? 'top' : 'left', '')\n }\n\n Tooltip.prototype.setContent = function () {\n var $tip = this.tip()\n var title = this.getTitle()\n\n if (this.options.html) {\n if (this.options.sanitize) {\n title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn)\n }\n\n $tip.find('.tooltip-inner').html(title)\n } else {\n $tip.find('.tooltip-inner').text(title)\n }\n\n $tip.removeClass('fade in top bottom left right')\n }\n\n Tooltip.prototype.hide = function (callback) {\n var that = this\n var $tip = $(this.$tip)\n var e = $.Event('hide.bs.' + this.type)\n\n function complete() {\n if (that.hoverState != 'in') $tip.detach()\n if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.\n that.$element\n .removeAttr('aria-describedby')\n .trigger('hidden.bs.' + that.type)\n }\n callback && callback()\n }\n\n this.$element.trigger(e)\n\n if (e.isDefaultPrevented()) return\n\n $tip.removeClass('in')\n\n $.support.transition && $tip.hasClass('fade') ?\n $tip\n .one('bsTransitionEnd', complete)\n .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n complete()\n\n this.hoverState = null\n\n return this\n }\n\n Tooltip.prototype.fixTitle = function () {\n var $e = this.$element\n if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {\n $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n }\n }\n\n Tooltip.prototype.hasContent = function () {\n return this.getTitle()\n }\n\n Tooltip.prototype.getPosition = function ($element) {\n $element = $element || this.$element\n\n var el = $element[0]\n var isBody = el.tagName == 'BODY'\n\n var elRect = el.getBoundingClientRect()\n if (elRect.width == null) {\n // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n }\n var isSvg = window.SVGElement && el instanceof window.SVGElement\n // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.\n // See https://github.com/twbs/bootstrap/issues/20280\n var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())\n var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n return $.extend({}, elRect, scroll, outerDims, elOffset)\n }\n\n Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :\n placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :\n placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }\n\n }\n\n Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n var delta = { top: 0, left: 0 }\n if (!this.$viewport) return delta\n\n var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n var viewportDimensions = this.getPosition(this.$viewport)\n\n if (/right|left/.test(placement)) {\n var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll\n var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n if (topEdgeOffset < viewportDimensions.top) { // top overflow\n delta.top = viewportDimensions.top - topEdgeOffset\n } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n }\n } else {\n var leftEdgeOffset = pos.left - viewportPadding\n var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n delta.left = viewportDimensions.left - leftEdgeOffset\n } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow\n delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n }\n }\n\n return delta\n }\n\n Tooltip.prototype.getTitle = function () {\n var title\n var $e = this.$element\n var o = this.options\n\n title = $e.attr('data-original-title')\n || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)\n\n return title\n }\n\n Tooltip.prototype.getUID = function (prefix) {\n do prefix += ~~(Math.random() * 1000000)\n while (document.getElementById(prefix))\n return prefix\n }\n\n Tooltip.prototype.tip = function () {\n if (!this.$tip) {\n this.$tip = $(this.options.template)\n if (this.$tip.length != 1) {\n throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')\n }\n }\n return this.$tip\n }\n\n Tooltip.prototype.arrow = function () {\n return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n }\n\n Tooltip.prototype.enable = function () {\n this.enabled = true\n }\n\n Tooltip.prototype.disable = function () {\n this.enabled = false\n }\n\n Tooltip.prototype.toggleEnabled = function () {\n this.enabled = !this.enabled\n }\n\n Tooltip.prototype.toggle = function (e) {\n var self = this\n if (e) {\n self = $(e.currentTarget).data('bs.' + this.type)\n if (!self) {\n self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n $(e.currentTarget).data('bs.' + this.type, self)\n }\n }\n\n if (e) {\n self.inState.click = !self.inState.click\n if (self.isInStateTrue()) self.enter(self)\n else self.leave(self)\n } else {\n self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n }\n }\n\n Tooltip.prototype.destroy = function () {\n var that = this\n clearTimeout(this.timeout)\n this.hide(function () {\n that.$element.off('.' + that.type).removeData('bs.' + that.type)\n if (that.$tip) {\n that.$tip.detach()\n }\n that.$tip = null\n that.$arrow = null\n that.$viewport = null\n that.$element = null\n })\n }\n\n Tooltip.prototype.sanitizeHtml = function (unsafeHtml) {\n return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn)\n }\n\n // TOOLTIP PLUGIN DEFINITION\n // =========================\n\n function Plugin(option) {\n return this.each(function () {\n var $this = $(this)\n var data = $this.data('bs.tooltip')\n var options = typeof option == 'object' && option\n\n if (!data && /destroy|hide/.test(option)) return\n if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n if (typeof option == 'string') data[option]()\n })\n }\n\n var old = $.fn.tooltip\n\n $.fn.tooltip = Plugin\n $.fn.tooltip.Constructor = Tooltip\n\n\n // TOOLTIP NO CONFLICT\n // ===================\n\n $.fn.tooltip.noConflict = function () {\n $.fn.tooltip = old\n return this\n }\n\n}(jQuery);\n","/* ========================================================================\n * Bootstrap: transition.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n 'use strict';\n\n // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)\n // ============================================================\n\n function transitionEnd() {\n var el = document.createElement('bootstrap')\n\n var transEndEventNames = {\n WebkitTransition : 'webkitTransitionEnd',\n MozTransition : 'transitionend',\n OTransition : 'oTransitionEnd otransitionend',\n transition : 'transitionend'\n }\n\n for (var name in transEndEventNames) {\n if (el.style[name] !== undefined) {\n return { end: transEndEventNames[name] }\n }\n }\n\n return false // explicit for ie8 ( ._.)\n }\n\n // https://blog.alexmaccaw.com/css-transitions\n $.fn.emulateTransitionEnd = function (duration) {\n var called = false\n var $el = this\n $(this).one('bsTransitionEnd', function () { called = true })\n var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n setTimeout(callback, duration)\n return this\n }\n\n $(function () {\n $.support.transition = transitionEnd()\n\n if (!$.support.transition) return\n\n $.event.special.bsTransitionEnd = {\n bindType: $.support.transition.end,\n delegateType: $.support.transition.end,\n handle: function (e) {\n if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n }\n }\n })\n\n}(jQuery);\n","/*jslint browser: true*/\r\n/*jslint jquery: true*/\r\n\r\n/*\r\n * jQuery Hotkeys Plugin\r\n * Copyright 2010, John Resig\r\n * Dual licensed under the MIT or GPL Version 2 licenses.\r\n *\r\n * Based upon the plugin by Tzury Bar Yochay:\r\n * https://github.com/tzuryby/jquery.hotkeys\r\n *\r\n * Original idea by:\r\n * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/\r\n */\r\n\r\n/*\r\n * One small change is: now keys are passed by object { keys: '...' }\r\n * Might be useful, when you want to pass some other data to your handler\r\n */\r\n\r\n(function(jQuery) {\r\n\r\n jQuery.hotkeys = {\r\n version: \"0.2.0\",\r\n\r\n specialKeys: {\r\n 8: \"backspace\",\r\n 9: \"tab\",\r\n 10: \"return\",\r\n 13: \"return\",\r\n 16: \"shift\",\r\n 17: \"ctrl\",\r\n 18: \"alt\",\r\n 19: \"pause\",\r\n 20: \"capslock\",\r\n 27: \"esc\",\r\n 32: \"space\",\r\n 33: \"pageup\",\r\n 34: \"pagedown\",\r\n 35: \"end\",\r\n 36: \"home\",\r\n 37: \"left\",\r\n 38: \"up\",\r\n 39: \"right\",\r\n 40: \"down\",\r\n 45: \"insert\",\r\n 46: \"del\",\r\n 59: \";\",\r\n 61: \"=\",\r\n 96: \"0\",\r\n 97: \"1\",\r\n 98: \"2\",\r\n 99: \"3\",\r\n 100: \"4\",\r\n 101: \"5\",\r\n 102: \"6\",\r\n 103: \"7\",\r\n 104: \"8\",\r\n 105: \"9\",\r\n 106: \"*\",\r\n 107: \"+\",\r\n 109: \"-\",\r\n 110: \".\",\r\n 111: \"/\",\r\n 112: \"f1\",\r\n 113: \"f2\",\r\n 114: \"f3\",\r\n 115: \"f4\",\r\n 116: \"f5\",\r\n 117: \"f6\",\r\n 118: \"f7\",\r\n 119: \"f8\",\r\n 120: \"f9\",\r\n 121: \"f10\",\r\n 122: \"f11\",\r\n 123: \"f12\",\r\n 144: \"numlock\",\r\n 145: \"scroll\",\r\n 173: \"-\",\r\n 186: \";\",\r\n 187: \"=\",\r\n 188: \",\",\r\n 189: \"-\",\r\n 190: \".\",\r\n 191: \"/\",\r\n 192: \"`\",\r\n 219: \"[\",\r\n 220: \"\\\\\",\r\n 221: \"]\",\r\n 222: \"'\"\r\n },\r\n\r\n shiftNums: {\r\n \"`\": \"~\",\r\n \"1\": \"!\",\r\n \"2\": \"@\",\r\n \"3\": \"#\",\r\n \"4\": \"$\",\r\n \"5\": \"%\",\r\n \"6\": \"^\",\r\n \"7\": \"&\",\r\n \"8\": \"*\",\r\n \"9\": \"(\",\r\n \"0\": \")\",\r\n \"-\": \"_\",\r\n \"=\": \"+\",\r\n \";\": \": \",\r\n \"'\": \"\\\"\",\r\n \",\": \"<\",\r\n \".\": \">\",\r\n \"/\": \"?\",\r\n \"\\\\\": \"|\"\r\n },\r\n\r\n // excludes: button, checkbox, file, hidden, image, password, radio, reset, search, submit, url\r\n textAcceptingInputTypes: [\r\n \"text\", \"password\", \"number\", \"email\", \"url\", \"range\", \"date\", \"month\", \"week\", \"time\", \"datetime\",\r\n \"datetime-local\", \"search\", \"color\", \"tel\"],\r\n\r\n // default input types not to bind to unless bound directly\r\n textInputTypes: /textarea|input|select/i,\r\n\r\n options: {\r\n filterInputAcceptingElements: true,\r\n filterTextInputs: true,\r\n filterContentEditable: true\r\n }\r\n };\r\n\r\n function keyHandler(handleObj) {\r\n if (typeof handleObj.data === \"string\") {\r\n handleObj.data = {\r\n keys: handleObj.data\r\n };\r\n }\r\n\r\n // Only care when a possible input has been specified\r\n if (!handleObj.data || !handleObj.data.keys || typeof handleObj.data.keys !== \"string\") {\r\n return;\r\n }\r\n\r\n var origHandler = handleObj.handler,\r\n keys = handleObj.data.keys.toLowerCase().split(\" \");\r\n\r\n handleObj.handler = function(event) {\r\n // Don't fire in text-accepting inputs that we didn't directly bind to\r\n if (this !== event.target &&\r\n (jQuery.hotkeys.options.filterInputAcceptingElements &&\r\n jQuery.hotkeys.textInputTypes.test(event.target.nodeName) ||\r\n (jQuery.hotkeys.options.filterContentEditable && jQuery(event.target).attr('contenteditable')) ||\r\n (jQuery.hotkeys.options.filterTextInputs &&\r\n jQuery.inArray(event.target.type, jQuery.hotkeys.textAcceptingInputTypes) > -1))) {\r\n return;\r\n }\r\n\r\n var special = event.type !== \"keypress\" && jQuery.hotkeys.specialKeys[event.which],\r\n character = String.fromCharCode(event.which).toLowerCase(),\r\n modif = \"\",\r\n possible = {};\r\n\r\n jQuery.each([\"alt\", \"ctrl\", \"shift\"], function(index, specialKey) {\r\n\r\n if (event[specialKey + 'Key'] && special !== specialKey) {\r\n modif += specialKey + '+';\r\n }\r\n });\r\n\r\n // metaKey is triggered off ctrlKey erronously\r\n if (event.metaKey && !event.ctrlKey && special !== \"meta\") {\r\n modif += \"meta+\";\r\n }\r\n\r\n if (event.metaKey && special !== \"meta\" && modif.indexOf(\"alt+ctrl+shift+\") > -1) {\r\n modif = modif.replace(\"alt+ctrl+shift+\", \"hyper+\");\r\n }\r\n\r\n if (special) {\r\n possible[modif + special] = true;\r\n }\r\n else {\r\n possible[modif + character] = true;\r\n possible[modif + jQuery.hotkeys.shiftNums[character]] = true;\r\n\r\n // \"$\" can be triggered as \"Shift+4\" or \"Shift+$\" or just \"$\"\r\n if (modif === \"shift+\") {\r\n possible[jQuery.hotkeys.shiftNums[character]] = true;\r\n }\r\n }\r\n\r\n for (var i = 0, l = keys.length; i < l; i++) {\r\n if (possible[keys[i]]) {\r\n return origHandler.apply(this, arguments);\r\n }\r\n }\r\n };\r\n }\r\n\r\n jQuery.each([\"keydown\", \"keyup\", \"keypress\"], function() {\r\n jQuery.event.special[this] = {\r\n add: keyHandler\r\n };\r\n });\r\n\r\n})(jQuery || this.jQuery || window.jQuery);\r\n","module.exports = global[\"punycode\"] = require(\"-!./punycode.js\");","/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t counter = 0,\n\t\t length = string.length,\n\t\t value,\n\t\t extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t// 0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t inputLength = input.length,\n\t\t out,\n\t\t i = 0,\n\t\t n = initialN,\n\t\t bias = initialBias,\n\t\t basic,\n\t\t j,\n\t\t index,\n\t\t oldi,\n\t\t w,\n\t\t k,\n\t\t digit,\n\t\t t,\n\t\t /** Cached calculation results */\n\t\t baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t delta,\n\t\t handledCPCount,\n\t\t basicLength,\n\t\t bias,\n\t\t j,\n\t\t m,\n\t\t q,\n\t\t k,\n\t\t t,\n\t\t currentValue,\n\t\t output = [],\n\t\t /** `inputLength` will hold the number of code points in `input`. */\n\t\t inputLength,\n\t\t /** Cached calculation results */\n\t\t handledCPCountPlusOne,\n\t\t baseMinusT,\n\t\t qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n","module.exports = global[\"ColorThief\"] = require(\"-!./color-thief.min.js\");","/*!\r\n * Color Thief v2.0\r\n * by Lokesh Dhakar - http://www.lokeshdhakar.com\r\n *\r\n * Thanks\r\n * ------\r\n * Nick Rabinowitz - For creating quantize.js.\r\n * John Schulz - For clean up and optimization. @JFSIII\r\n * Nathan Spady - For adding drag and drop support to the demo page.\r\n *\r\n * License\r\n * -------\r\n * Copyright 2011, 2015 Lokesh Dhakar\r\n * Released under the MIT license\r\n * https://raw.githubusercontent.com/lokesh/color-thief/master/LICENSE\r\n *\r\n */\r\nvar CanvasImage=function(a){this.canvas=document.createElement(\"canvas\"),this.context=this.canvas.getContext(\"2d\"),document.body.appendChild(this.canvas),this.width=this.canvas.width=a.width,this.height=this.canvas.height=a.height,this.context.drawImage(a,0,0,this.width,this.height)};CanvasImage.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},CanvasImage.prototype.update=function(a){this.context.putImageData(a,0,0)},CanvasImage.prototype.getPixelCount=function(){return this.width*this.height},CanvasImage.prototype.getImageData=function(){return this.context.getImageData(0,0,this.width,this.height)},CanvasImage.prototype.removeCanvas=function(){this.canvas.parentNode.removeChild(this.canvas)};var ColorThief=function(){};/*!\r\n * quantize.js Copyright 2008 Nick Rabinowitz.\r\n * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php\r\n */\r\n/*!\r\n * Block below copied from Protovis: http://mbostock.github.com/protovis/\r\n * Copyright 2010 Stanford Visualization Group\r\n * Licensed under the BSD License: http://www.opensource.org/licenses/bsd-license.php\r\n */\r\nif(ColorThief.prototype.getColor=function(a,b){var c=this.getPalette(a,5,b),d=c[0];return d},ColorThief.prototype.getPalette=function(a,b,c){\"undefined\"==typeof b&&(b=10),(\"undefined\"==typeof c||1>c)&&(c=10);for(var d,e,f,g,h,i=new CanvasImage(a),j=i.getImageData(),k=j.data,l=i.getPixelCount(),m=[],n=0;l>n;n+=c)d=4*n,e=k[d+0],f=k[d+1],g=k[d+2],h=k[d+3],h>=125&&(e>250&&f>250&&g>250||m.push([e,f,g]));var o=MMCQ.quantize(m,b),p=o?o.palette():null;return i.removeCanvas(),p},!pv)var pv={map:function(a,b){var c={};return b?a.map(function(a,d){return c.index=d,b.call(c,a)}):a.slice()},naturalOrder:function(a,b){return b>a?-1:a>b?1:0},sum:function(a,b){var c={};return a.reduce(b?function(a,d,e){return c.index=e,a+b.call(c,d)}:function(a,b){return a+b},0)},max:function(a,b){return Math.max.apply(null,b?pv.map(a,b):a)}};var MMCQ=function(){function a(a,b,c){return(a<<2*i)+(b<<i)+c}function b(a){function b(){c.sort(a),d=!0}var c=[],d=!1;return{push:function(a){c.push(a),d=!1},peek:function(a){return d||b(),void 0===a&&(a=c.length-1),c[a]},pop:function(){return d||b(),c.pop()},size:function(){return c.length},map:function(a){return c.map(a)},debug:function(){return d||b(),c}}}function c(a,b,c,d,e,f,g){var h=this;h.r1=a,h.r2=b,h.g1=c,h.g2=d,h.b1=e,h.b2=f,h.histo=g}function d(){this.vboxes=new b(function(a,b){return pv.naturalOrder(a.vbox.count()*a.vbox.volume(),b.vbox.count()*b.vbox.volume())})}function e(b){var c,d,e,f,g=1<<3*i,h=new Array(g);return b.forEach(function(b){d=b[0]>>j,e=b[1]>>j,f=b[2]>>j,c=a(d,e,f),h[c]=(h[c]||0)+1}),h}function f(a,b){var d,e,f,g=1e6,h=0,i=1e6,k=0,l=1e6,m=0;return a.forEach(function(a){d=a[0]>>j,e=a[1]>>j,f=a[2]>>j,g>d?g=d:d>h&&(h=d),i>e?i=e:e>k&&(k=e),l>f?l=f:f>m&&(m=f)}),new c(g,h,i,k,l,m,b)}function g(b,c){function d(a){var b,d,e,f,g,h=a+\"1\",j=a+\"2\",k=0;for(i=c[h];i<=c[j];i++)if(o[i]>n/2){for(e=c.copy(),f=c.copy(),b=i-c[h],d=c[j]-i,g=d>=b?Math.min(c[j]-1,~~(i+d/2)):Math.max(c[h],~~(i-1-b/2));!o[g];)g++;for(k=p[g];!k&&o[g-1];)k=p[--g];return e[j]=g,f[h]=e[j]+1,[e,f]}}if(c.count()){var e=c.r2-c.r1+1,f=c.g2-c.g1+1,g=c.b2-c.b1+1,h=pv.max([e,f,g]);if(1==c.count())return[c.copy()];var i,j,k,l,m,n=0,o=[],p=[];if(h==e)for(i=c.r1;i<=c.r2;i++){for(l=0,j=c.g1;j<=c.g2;j++)for(k=c.b1;k<=c.b2;k++)m=a(i,j,k),l+=b[m]||0;n+=l,o[i]=n}else if(h==f)for(i=c.g1;i<=c.g2;i++){for(l=0,j=c.r1;j<=c.r2;j++)for(k=c.b1;k<=c.b2;k++)m=a(j,i,k),l+=b[m]||0;n+=l,o[i]=n}else for(i=c.b1;i<=c.b2;i++){for(l=0,j=c.r1;j<=c.r2;j++)for(k=c.g1;k<=c.g2;k++)m=a(j,k,i),l+=b[m]||0;n+=l,o[i]=n}return o.forEach(function(a,b){p[b]=n-a}),d(h==e?\"r\":h==f?\"g\":\"b\")}}function h(a,c){function h(a,b){for(var c,d=1,e=0;k>e;)if(c=a.pop(),c.count()){var f=g(i,c),h=f[0],j=f[1];if(!h)return;if(a.push(h),j&&(a.push(j),d++),d>=b)return;if(e++>k)return}else a.push(c),e++}if(!a.length||2>c||c>256)return!1;var i=e(a),j=0;i.forEach(function(){j++});var m=f(a,i),n=new b(function(a,b){return pv.naturalOrder(a.count(),b.count())});n.push(m),h(n,l*c);for(var o=new b(function(a,b){return pv.naturalOrder(a.count()*a.volume(),b.count()*b.volume())});n.size();)o.push(n.pop());h(o,c-o.size());for(var p=new d;o.size();)p.push(o.pop());return p}var i=5,j=8-i,k=1e3,l=.75;return c.prototype={volume:function(a){var b=this;return(!b._volume||a)&&(b._volume=(b.r2-b.r1+1)*(b.g2-b.g1+1)*(b.b2-b.b1+1)),b._volume},count:function(b){var c=this,d=c.histo;if(!c._count_set||b){var e,f,g,h=0;for(e=c.r1;e<=c.r2;e++)for(f=c.g1;f<=c.g2;f++)for(g=c.b1;g<=c.b2;g++)index=a(e,f,g),h+=d[index]||0;c._count=h,c._count_set=!0}return c._count},copy:function(){var a=this;return new c(a.r1,a.r2,a.g1,a.g2,a.b1,a.b2,a.histo)},avg:function(b){var c=this,d=c.histo;if(!c._avg||b){var e,f,g,h,j,k=0,l=1<<8-i,m=0,n=0,o=0;for(f=c.r1;f<=c.r2;f++)for(g=c.g1;g<=c.g2;g++)for(h=c.b1;h<=c.b2;h++)j=a(f,g,h),e=d[j]||0,k+=e,m+=e*(f+.5)*l,n+=e*(g+.5)*l,o+=e*(h+.5)*l;k?c._avg=[~~(m/k),~~(n/k),~~(o/k)]:c._avg=[~~(l*(c.r1+c.r2+1)/2),~~(l*(c.g1+c.g2+1)/2),~~(l*(c.b1+c.b2+1)/2)]}return c._avg},contains:function(a){var b=this,c=a[0]>>j;return gval=a[1]>>j,bval=a[2]>>j,c>=b.r1&&c<=b.r2&&gval>=b.g1&&gval<=b.g2&&bval>=b.b1&&bval<=b.b2}},d.prototype={push:function(a){this.vboxes.push({vbox:a,color:a.avg()})},palette:function(){return this.vboxes.map(function(a){return a.color})},size:function(){return this.vboxes.size()},map:function(a){for(var b=this.vboxes,c=0;c<b.size();c++)if(b.peek(c).vbox.contains(a))return b.peek(c).color;return this.nearest(a)},nearest:function(a){for(var b,c,d,e=this.vboxes,f=0;f<e.size();f++)c=Math.sqrt(Math.pow(a[0]-e.peek(f).color[0],2)+Math.pow(a[1]-e.peek(f).color[1],2)+Math.pow(a[2]-e.peek(f).color[2],2)),(b>c||void 0===b)&&(b=c,d=e.peek(f).color);return d},forcebw:function(){var a=this.vboxes;a.sort(function(a,b){return pv.naturalOrder(pv.sum(a.color),pv.sum(b.color))});var b=a[0].color;b[0]<5&&b[1]<5&&b[2]<5&&(a[0].color=[0,0,0]);var c=a.length-1,d=a[c].color;d[0]>251&&d[1]>251&&d[2]>251&&(a[c].color=[255,255,255])}},{quantize:h}}();\r\nmodule.exports = ColorThief;\r\n","/**\n * The `History` class keeps track and manages a stack of routes that the user\n * has navigated to in their session.\n *\n * An item can be pushed to the top of the stack using the `push` method. An\n * item in the stack has a name and a URL. The name need not be unique; if it is\n * the same as the item before it, that will be overwritten with the new URL. In\n * this way, if a user visits a discussion, and then visits another discussion,\n * popping the history stack will still take them back to the discussion list\n * rather than the previous discussion.\n */\nexport default class History {\n constructor(defaultRoute) {\n /**\n * The stack of routes that have been navigated to.\n *\n * @type {Array}\n * @protected\n */\n this.stack = [];\n }\n\n /**\n * Get the item on the top of the stack.\n *\n * @return {Object}\n * @public\n */\n getCurrent() {\n return this.stack[this.stack.length - 1];\n }\n\n /**\n * Get the previous item on the stack.\n *\n * @return {Object}\n * @public\n */\n getPrevious() {\n return this.stack[this.stack.length - 2];\n }\n\n /**\n * Push an item to the top of the stack.\n *\n * @param {String} name The name of the route.\n * @param {String} title The title of the route.\n * @param {String} [url] The URL of the route. The current URL will be used if\n * not provided.\n * @public\n */\n push(name, title, url = m.route()) {\n // If we're pushing an item with the same name as second-to-top item in the\n // stack, we will assume that the user has clicked the 'back' button in\n // their browser. In this case, we don't want to push a new item, so we will\n // pop off the top item, and then the second-to-top item will be overwritten\n // below.\n const secondTop = this.stack[this.stack.length - 2];\n if (secondTop && secondTop.name === name) {\n this.stack.pop();\n }\n\n // If we're pushing an item with the same name as the top item in the stack,\n // then we'll overwrite it with the new URL.\n const top = this.getCurrent();\n if (top && top.name === name) {\n Object.assign(top, { url, title });\n } else {\n this.stack.push({ name, url, title });\n }\n }\n\n /**\n * Check whether or not the history stack is able to be popped.\n *\n * @return {Boolean}\n * @public\n */\n canGoBack() {\n return this.stack.length > 1;\n }\n\n /**\n * Go back to the previous route in the history stack.\n *\n * @public\n */\n back() {\n if (!this.canGoBack()) {\n return this.home();\n }\n\n this.stack.pop();\n\n m.route(this.getCurrent().url);\n }\n\n /**\n * Get the URL of the previous page.\n *\n * @public\n */\n backUrl() {\n const secondTop = this.stack[this.stack.length - 2];\n\n return secondTop.url;\n }\n\n /**\n * Go to the first route in the history stack.\n *\n * @public\n */\n home() {\n this.stack.splice(0);\n\n m.route('/');\n }\n}\n","/**\n * The `Pane` class manages the page's discussion list sidepane. The pane is a\n * part of the content view (DiscussionPage component), but its visibility is\n * determined by CSS classes applied to the outer page element. This class\n * manages the application of those CSS classes.\n */\nexport default class Pane {\n constructor(element) {\n /**\n * The localStorage key to store the pane's pinned state with.\n *\n * @type {String}\n * @protected\n */\n this.pinnedKey = 'panePinned';\n\n /**\n * The page element.\n *\n * @type {jQuery}\n * @protected\n */\n this.$element = $(element);\n\n /**\n * Whether or not the pane is currently pinned.\n *\n * @type {Boolean}\n * @protected\n */\n this.pinned = localStorage.getItem(this.pinnedKey) === 'true';\n\n /**\n * Whether or not the pane is currently exists.\n *\n * @type {Boolean}\n * @protected\n */\n this.active = false;\n\n /**\n * Whether or not the pane is currently showing, or is hidden off the edge\n * of the screen.\n *\n * @type {Boolean}\n * @protected\n */\n this.showing = false;\n\n this.render();\n }\n\n /**\n * Enable the pane.\n *\n * @public\n */\n enable() {\n this.active = true;\n this.render();\n }\n\n /**\n * Disable the pane.\n *\n * @public\n */\n disable() {\n this.active = false;\n this.showing = false;\n this.render();\n }\n\n /**\n * Show the pane.\n *\n * @public\n */\n show() {\n clearTimeout(this.hideTimeout);\n this.showing = true;\n this.render();\n }\n\n /**\n * Hide the pane.\n *\n * @public\n */\n hide() {\n this.showing = false;\n this.render();\n }\n\n /**\n * Begin a timeout to hide the pane, which can be cancelled by showing the\n * pane.\n *\n * @public\n */\n onmouseleave() {\n this.hideTimeout = setTimeout(this.hide.bind(this), 250);\n }\n\n /**\n * Toggle whether or not the pane is pinned.\n *\n * @public\n */\n togglePinned() {\n this.pinned = !this.pinned;\n\n localStorage.setItem(this.pinnedKey, this.pinned ? 'true' : 'false');\n\n this.render();\n }\n\n /**\n * Apply the appropriate CSS classes to the page element.\n *\n * @protected\n */\n render() {\n this.$element.toggleClass('panePinned', this.pinned).toggleClass('hasPane', this.active).toggleClass('paneShowing', this.showing);\n }\n}\n","import Component from '../../common/Component';\nimport ItemList from '../../common/utils/ItemList';\nimport listItems from '../../common/helpers/listItems';\nimport Button from '../../common/components/Button';\n\n/**\n * The `TextEditor` component displays a textarea with controls, including a\n * submit button.\n *\n * ### Props\n *\n * - `submitLabel`\n * - `value`\n * - `placeholder`\n * - `disabled`\n */\nexport default class TextEditor extends Component {\n init() {\n /**\n * The value of the textarea.\n *\n * @type {String}\n */\n this.value = m.prop(this.props.value || '');\n }\n\n view() {\n return (\n <div className=\"TextEditor\">\n <textarea\n className=\"FormControl Composer-flexible\"\n config={this.configTextarea.bind(this)}\n oninput={m.withAttr('value', this.oninput.bind(this))}\n placeholder={this.props.placeholder || ''}\n disabled={!!this.props.disabled}\n value={this.value()}\n />\n\n <ul className=\"TextEditor-controls Composer-footer\">\n {listItems(this.controlItems().toArray())}\n <li className=\"TextEditor-toolbar\">{this.toolbarItems().toArray()}</li>\n </ul>\n </div>\n );\n }\n\n /**\n * Configure the textarea element.\n *\n * @param {DOMElement} element\n * @param {Boolean} isInitialized\n */\n configTextarea(element, isInitialized) {\n if (isInitialized) return;\n\n const handler = () => {\n this.onsubmit();\n m.redraw();\n };\n\n $(element).bind('keydown', 'meta+return', handler);\n $(element).bind('keydown', 'ctrl+return', handler);\n }\n\n /**\n * Build an item list for the text editor controls.\n *\n * @return {ItemList}\n */\n controlItems() {\n const items = new ItemList();\n\n items.add(\n 'submit',\n Button.component({\n children: this.props.submitLabel,\n icon: 'fas fa-paper-plane',\n className: 'Button Button--primary',\n itemClassName: 'App-primaryControl',\n onclick: this.onsubmit.bind(this),\n })\n );\n\n if (this.props.preview) {\n items.add(\n 'preview',\n Button.component({\n icon: 'far fa-eye',\n className: 'Button Button--icon',\n onclick: this.props.preview,\n title: app.translator.trans('core.forum.composer.preview_tooltip'),\n config: (elm) => $(elm).tooltip(),\n })\n );\n }\n\n return items;\n }\n\n /**\n * Build an item list for the toolbar controls.\n *\n * @return {ItemList}\n */\n toolbarItems() {\n return new ItemList();\n }\n\n /**\n * Set the value of the text editor.\n *\n * @param {String} value\n */\n setValue(value) {\n this.$('textarea').val(value).trigger('input');\n }\n\n /**\n * Set the selected range of the textarea.\n *\n * @param {Integer} start\n * @param {Integer} end\n */\n setSelectionRange(start, end) {\n const $textarea = this.$('textarea');\n\n if (!$textarea.length) return;\n\n $textarea[0].setSelectionRange(start, end);\n $textarea.focus();\n }\n\n /**\n * Get the selected range of the textarea.\n *\n * @return {Array}\n */\n getSelectionRange() {\n const $textarea = this.$('textarea');\n\n if (!$textarea.length) return [0, 0];\n\n return [$textarea[0].selectionStart, $textarea[0].selectionEnd];\n }\n\n /**\n * Insert content into the textarea at the position of the cursor.\n *\n * @param {String} insert\n */\n insertAtCursor(insert) {\n const textarea = this.$('textarea')[0];\n const value = this.value();\n const index = textarea ? textarea.selectionStart : value.length;\n\n this.setValue(value.slice(0, index) + insert + value.slice(index));\n\n // Move the textarea cursor to the end of the content we just inserted.\n if (textarea) {\n const pos = index + insert.length;\n this.setSelectionRange(pos, pos);\n }\n\n textarea.dispatchEvent(new CustomEvent('input', { bubbles: true, cancelable: true }));\n }\n\n /**\n * Handle input into the textarea.\n *\n * @param {String} value\n */\n oninput(value) {\n this.value(value);\n\n this.props.onchange(this.value());\n\n m.redraw.strategy('none');\n }\n\n /**\n * Handle the submit button being clicked.\n */\n onsubmit() {\n this.props.onsubmit(this.value());\n }\n}\n","import Component from '../../common/Component';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport TextEditor from './TextEditor';\nimport avatar from '../../common/helpers/avatar';\nimport listItems from '../../common/helpers/listItems';\nimport ItemList from '../../common/utils/ItemList';\n\n/**\n * The `ComposerBody` component handles the body, or the content, of the\n * composer. Subclasses should implement the `onsubmit` method and override\n * `headerTimes`.\n *\n * ### Props\n *\n * - `originalContent`\n * - `submitLabel`\n * - `placeholder`\n * - `user`\n * - `confirmExit`\n * - `disabled`\n *\n * @abstract\n */\nexport default class ComposerBody extends Component {\n init() {\n /**\n * Whether or not the component is loading.\n *\n * @type {Boolean}\n */\n this.loading = false;\n\n /**\n * The content of the text editor.\n *\n * @type {Function}\n */\n this.content = m.prop(this.props.originalContent);\n\n /**\n * The text editor component instance.\n *\n * @type {TextEditor}\n */\n this.editor = new TextEditor({\n submitLabel: this.props.submitLabel,\n placeholder: this.props.placeholder,\n onchange: this.content,\n onsubmit: this.onsubmit.bind(this),\n value: this.content(),\n });\n }\n\n view() {\n // If the component is loading, we should disable the text editor.\n this.editor.props.disabled = this.loading;\n\n return (\n <div className={'ComposerBody ' + (this.props.className || '')}>\n {avatar(this.props.user, { className: 'ComposerBody-avatar' })}\n <div className=\"ComposerBody-content\">\n <ul className=\"ComposerBody-header\">{listItems(this.headerItems().toArray())}</ul>\n <div className=\"ComposerBody-editor\">{this.editor.render()}</div>\n </div>\n {LoadingIndicator.component({ className: 'ComposerBody-loading' + (this.loading ? ' active' : '') })}\n </div>\n );\n }\n\n /**\n * Draw focus to the text editor.\n */\n focus() {\n this.$(':input:enabled:visible:first').focus();\n }\n\n /**\n * Check if there is any unsaved data – if there is, return a confirmation\n * message to prompt the user with.\n *\n * @return {String}\n */\n preventExit() {\n const content = this.content();\n\n return content && content !== this.props.originalContent && this.props.confirmExit;\n }\n\n /**\n * Build an item list for the composer's header.\n *\n * @return {ItemList}\n */\n headerItems() {\n return new ItemList();\n }\n\n /**\n * Handle the submit event of the text editor.\n *\n * @abstract\n */\n onsubmit() {}\n\n /**\n * Stop loading.\n */\n loaded() {\n this.loading = false;\n m.redraw();\n }\n}\n","import ComposerBody from './ComposerBody';\nimport Alert from '../../common/components/Alert';\nimport Button from '../../common/components/Button';\nimport icon from '../../common/helpers/icon';\nimport extractText from '../../common/utils/extractText';\n\nfunction minimizeComposerIfFullScreen(e) {\n if (app.composer.isFullScreen()) {\n app.composer.minimize();\n e.stopPropagation();\n }\n}\n\n/**\n * The `ReplyComposer` component displays the composer content for replying to a\n * discussion.\n *\n * ### Props\n *\n * - All of the props of ComposerBody\n * - `discussion`\n */\nexport default class ReplyComposer extends ComposerBody {\n init() {\n super.init();\n\n this.editor.props.preview = (e) => {\n minimizeComposerIfFullScreen(e);\n\n m.route(app.route.discussion(this.props.discussion, 'reply'));\n };\n }\n\n static initProps(props) {\n super.initProps(props);\n\n props.placeholder = props.placeholder || extractText(app.translator.trans('core.forum.composer_reply.body_placeholder'));\n props.submitLabel = props.submitLabel || app.translator.trans('core.forum.composer_reply.submit_button');\n props.confirmExit = props.confirmExit || extractText(app.translator.trans('core.forum.composer_reply.discard_confirmation'));\n }\n\n headerItems() {\n const items = super.headerItems();\n const discussion = this.props.discussion;\n\n const routeAndMinimize = function (element, isInitialized) {\n if (isInitialized) return;\n $(element).on('click', minimizeComposerIfFullScreen);\n m.route.apply(this, arguments);\n };\n\n items.add(\n 'title',\n <h3>\n {icon('fas fa-reply')}{' '}\n <a href={app.route.discussion(discussion)} config={routeAndMinimize}>\n {discussion.title()}\n </a>\n </h3>\n );\n\n return items;\n }\n\n /**\n * Get the data to submit to the server when the reply is saved.\n *\n * @return {Object}\n */\n data() {\n return {\n content: this.content(),\n relationships: { discussion: this.props.discussion },\n };\n }\n\n onsubmit() {\n const discussion = this.props.discussion;\n\n this.loading = true;\n m.redraw();\n\n const data = this.data();\n\n app.store\n .createRecord('posts')\n .save(data)\n .then((post) => {\n // If we're currently viewing the discussion which this reply was made\n // in, then we can update the post stream and scroll to the post.\n if (app.viewingDiscussion(discussion)) {\n const stream = app.current.get('stream');\n stream.update().then(() => stream.goToNumber(post.number()));\n } else {\n // Otherwise, we'll create an alert message to inform the user that\n // their reply has been posted, containing a button which will\n // transition to their new post when clicked.\n let alert;\n const viewButton = Button.component({\n className: 'Button Button--link',\n children: app.translator.trans('core.forum.composer_reply.view_button'),\n onclick: () => {\n m.route(app.route.post(post));\n app.alerts.dismiss(alert);\n },\n });\n app.alerts.show(\n (alert = new Alert({\n type: 'success',\n children: app.translator.trans('core.forum.composer_reply.posted_message'),\n controls: [viewButton],\n }))\n );\n }\n\n app.composer.hide();\n }, this.loaded.bind(this));\n }\n}\n","import Component from '../../common/Component';\nimport ItemList from '../../common/utils/ItemList';\nimport listItems from '../../common/helpers/listItems';\n\n/**\n * The `DiscussionHero` component displays the hero on a discussion page.\n *\n * ### Props\n *\n * - `discussion`\n */\nexport default class DiscussionHero extends Component {\n view() {\n return (\n <header className=\"Hero DiscussionHero\">\n <div className=\"container\">\n <ul className=\"DiscussionHero-items\">{listItems(this.items().toArray())}</ul>\n </div>\n </header>\n );\n }\n\n /**\n * Build an item list for the contents of the discussion hero.\n *\n * @return {ItemList}\n */\n items() {\n const items = new ItemList();\n const discussion = this.props.discussion;\n const badges = discussion.badges().toArray();\n\n if (badges.length) {\n items.add('badges', <ul className=\"DiscussionHero-badges badges\">{listItems(badges)}</ul>, 10);\n }\n\n items.add('title', <h2 className=\"DiscussionHero-title\">{discussion.title()}</h2>);\n\n return items;\n }\n}\n","import Component from '../../common/Component';\nimport avatar from '../../common/helpers/avatar';\n\n/**\n * The `LoadingPost` component shows a placeholder that looks like a post,\n * indicating that the post is loading.\n */\nexport default class LoadingPost extends Component {\n view() {\n return (\n <div className=\"Post CommentPost LoadingPost\">\n <header className=\"Post-header\">\n {avatar(null, { className: 'PostUser-avatar' })}\n <div className=\"fakeText\" />\n </header>\n\n <div className=\"Post-body\">\n <div className=\"fakeText\" />\n <div className=\"fakeText\" />\n <div className=\"fakeText\" />\n </div>\n </div>\n );\n }\n}\n","import Modal from '../../common/components/Modal';\nimport Alert from '../../common/components/Alert';\nimport Button from '../../common/components/Button';\nimport extractText from '../../common/utils/extractText';\n\n/**\n * The `ForgotPasswordModal` component displays a modal which allows the user to\n * enter their email address and request a link to reset their password.\n *\n * ### Props\n *\n * - `email`\n */\nexport default class ForgotPasswordModal extends Modal {\n init() {\n super.init();\n\n /**\n * The value of the email input.\n *\n * @type {Function}\n */\n this.email = m.prop(this.props.email || '');\n\n /**\n * Whether or not the password reset email was sent successfully.\n *\n * @type {Boolean}\n */\n this.success = false;\n }\n\n className() {\n return 'ForgotPasswordModal Modal--small';\n }\n\n title() {\n return app.translator.trans('core.forum.forgot_password.title');\n }\n\n content() {\n if (this.success) {\n return (\n <div className=\"Modal-body\">\n <div className=\"Form Form--centered\">\n <p className=\"helpText\">{app.translator.trans('core.forum.forgot_password.email_sent_message')}</p>\n <div className=\"Form-group\">\n <Button className=\"Button Button--primary Button--block\" onclick={this.hide.bind(this)}>\n {app.translator.trans('core.forum.forgot_password.dismiss_button')}\n </Button>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"Modal-body\">\n <div className=\"Form Form--centered\">\n <p className=\"helpText\">{app.translator.trans('core.forum.forgot_password.text')}</p>\n <div className=\"Form-group\">\n <input\n className=\"FormControl\"\n name=\"email\"\n type=\"email\"\n placeholder={extractText(app.translator.trans('core.forum.forgot_password.email_placeholder'))}\n value={this.email()}\n onchange={m.withAttr('value', this.email)}\n disabled={this.loading}\n />\n </div>\n <div className=\"Form-group\">\n {Button.component({\n className: 'Button Button--primary Button--block',\n type: 'submit',\n loading: this.loading,\n children: app.translator.trans('core.forum.forgot_password.submit_button'),\n })}\n </div>\n </div>\n </div>\n );\n }\n\n onsubmit(e) {\n e.preventDefault();\n\n this.loading = true;\n\n app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/forgot',\n data: { email: this.email() },\n errorHandler: this.onerror.bind(this),\n })\n .then(() => {\n this.success = true;\n this.alert = null;\n })\n .catch(() => {})\n .then(this.loaded.bind(this));\n }\n\n onerror(error) {\n if (error.status === 404) {\n error.alert.props.children = app.translator.trans('core.forum.forgot_password.not_found_message');\n }\n\n super.onerror(error);\n }\n}\n","import Component from '../../common/Component';\nimport ItemList from '../../common/utils/ItemList';\n\n/**\n * The `LogInButtons` component displays a collection of social login buttons.\n */\nexport default class LogInButtons extends Component {\n view() {\n return <div className=\"LogInButtons\">{this.items().toArray()}</div>;\n }\n\n /**\n * Build a list of LogInButton components.\n *\n * @return {ItemList}\n * @public\n */\n items() {\n return new ItemList();\n }\n}\n","import Modal from '../../common/components/Modal';\nimport LogInModal from './LogInModal';\nimport Button from '../../common/components/Button';\nimport LogInButtons from './LogInButtons';\nimport extractText from '../../common/utils/extractText';\nimport ItemList from '../../common/utils/ItemList';\n\n/**\n * The `SignUpModal` component displays a modal dialog with a singup form.\n *\n * ### Props\n *\n * - `username`\n * - `email`\n * - `password`\n * - `token` An email token to sign up with.\n */\nexport default class SignUpModal extends Modal {\n init() {\n super.init();\n\n /**\n * The value of the username input.\n *\n * @type {Function}\n */\n this.username = m.prop(this.props.username || '');\n\n /**\n * The value of the email input.\n *\n * @type {Function}\n */\n this.email = m.prop(this.props.email || '');\n\n /**\n * The value of the password input.\n *\n * @type {Function}\n */\n this.password = m.prop(this.props.password || '');\n }\n\n className() {\n return 'Modal--small SignUpModal';\n }\n\n title() {\n return app.translator.trans('core.forum.sign_up.title');\n }\n\n content() {\n return [<div className=\"Modal-body\">{this.body()}</div>, <div className=\"Modal-footer\">{this.footer()}</div>];\n }\n\n isProvided(field) {\n return this.props.provided && this.props.provided.indexOf(field) !== -1;\n }\n\n body() {\n return [this.props.token ? '' : <LogInButtons />, <div className=\"Form Form--centered\">{this.fields().toArray()}</div>];\n }\n\n fields() {\n const items = new ItemList();\n\n items.add(\n 'username',\n <div className=\"Form-group\">\n <input\n className=\"FormControl\"\n name=\"username\"\n type=\"text\"\n placeholder={extractText(app.translator.trans('core.forum.sign_up.username_placeholder'))}\n value={this.username()}\n onchange={m.withAttr('value', this.username)}\n disabled={this.loading || this.isProvided('username')}\n />\n </div>,\n 30\n );\n\n items.add(\n 'email',\n <div className=\"Form-group\">\n <input\n className=\"FormControl\"\n name=\"email\"\n type=\"email\"\n placeholder={extractText(app.translator.trans('core.forum.sign_up.email_placeholder'))}\n value={this.email()}\n onchange={m.withAttr('value', this.email)}\n disabled={this.loading || this.isProvided('email')}\n />\n </div>,\n 20\n );\n\n if (!this.props.token) {\n items.add(\n 'password',\n <div className=\"Form-group\">\n <input\n className=\"FormControl\"\n name=\"password\"\n type=\"password\"\n placeholder={extractText(app.translator.trans('core.forum.sign_up.password_placeholder'))}\n value={this.password()}\n onchange={m.withAttr('value', this.password)}\n disabled={this.loading}\n />\n </div>,\n 10\n );\n }\n\n items.add(\n 'submit',\n <div className=\"Form-group\">\n <Button className=\"Button Button--primary Button--block\" type=\"submit\" loading={this.loading}>\n {app.translator.trans('core.forum.sign_up.submit_button')}\n </Button>\n </div>,\n -10\n );\n\n return items;\n }\n\n footer() {\n return [\n <p className=\"SignUpModal-logIn\">{app.translator.trans('core.forum.sign_up.log_in_text', { a: <a onclick={this.logIn.bind(this)} /> })}</p>,\n ];\n }\n\n /**\n * Open the log in modal, prefilling it with an email/username/password if\n * the user has entered one.\n *\n * @public\n */\n logIn() {\n const props = {\n identification: this.email() || this.username(),\n password: this.password(),\n };\n\n app.modal.show(new LogInModal(props));\n }\n\n onready() {\n if (this.props.username && !this.props.email) {\n this.$('[name=email]').select();\n } else {\n this.$('[name=username]').select();\n }\n }\n\n onsubmit(e) {\n e.preventDefault();\n\n this.loading = true;\n\n const data = this.submitData();\n\n app\n .request({\n url: app.forum.attribute('baseUrl') + '/register',\n method: 'POST',\n data,\n errorHandler: this.onerror.bind(this),\n })\n .then(() => window.location.reload(), this.loaded.bind(this));\n }\n\n /**\n * Get the data that should be submitted in the sign-up request.\n *\n * @return {Object}\n * @public\n */\n submitData() {\n const data = {\n username: this.username(),\n email: this.email(),\n };\n\n if (this.props.token) {\n data.token = this.props.token;\n } else {\n data.password = this.password();\n }\n\n return data;\n }\n}\n","import Modal from '../../common/components/Modal';\nimport ForgotPasswordModal from './ForgotPasswordModal';\nimport SignUpModal from './SignUpModal';\nimport Button from '../../common/components/Button';\nimport LogInButtons from './LogInButtons';\nimport extractText from '../../common/utils/extractText';\nimport ItemList from '../../common/utils/ItemList';\n\n/**\n * The `LogInModal` component displays a modal dialog with a login form.\n *\n * ### Props\n *\n * - `identification`\n * - `password`\n */\nexport default class LogInModal extends Modal {\n init() {\n super.init();\n\n /**\n * The value of the identification input.\n *\n * @type {Function}\n */\n this.identification = m.prop(this.props.identification || '');\n\n /**\n * The value of the password input.\n *\n * @type {Function}\n */\n this.password = m.prop(this.props.password || '');\n\n /**\n * The value of the remember me input.\n *\n * @type {Function}\n */\n this.remember = m.prop(!!this.props.remember);\n }\n\n className() {\n return 'LogInModal Modal--small';\n }\n\n title() {\n return app.translator.trans('core.forum.log_in.title');\n }\n\n content() {\n return [<div className=\"Modal-body\">{this.body()}</div>, <div className=\"Modal-footer\">{this.footer()}</div>];\n }\n\n body() {\n return [<LogInButtons />, <div className=\"Form Form--centered\">{this.fields().toArray()}</div>];\n }\n\n fields() {\n const items = new ItemList();\n\n items.add(\n 'identification',\n <div className=\"Form-group\">\n <input\n className=\"FormControl\"\n name=\"identification\"\n type=\"text\"\n placeholder={extractText(app.translator.trans('core.forum.log_in.username_or_email_placeholder'))}\n bidi={this.identification}\n disabled={this.loading}\n />\n </div>,\n 30\n );\n\n items.add(\n 'password',\n <div className=\"Form-group\">\n <input\n className=\"FormControl\"\n name=\"password\"\n type=\"password\"\n placeholder={extractText(app.translator.trans('core.forum.log_in.password_placeholder'))}\n bidi={this.password}\n disabled={this.loading}\n />\n </div>,\n 20\n );\n\n items.add(\n 'remember',\n <div className=\"Form-group\">\n <div>\n <label className=\"checkbox\">\n <input type=\"checkbox\" bidi={this.remember} disabled={this.loading} />\n {app.translator.trans('core.forum.log_in.remember_me_label')}\n </label>\n </div>\n </div>,\n 10\n );\n\n items.add(\n 'submit',\n <div className=\"Form-group\">\n {Button.component({\n className: 'Button Button--primary Button--block',\n type: 'submit',\n loading: this.loading,\n children: app.translator.trans('core.forum.log_in.submit_button'),\n })}\n </div>,\n -10\n );\n\n return items;\n }\n\n footer() {\n return [\n <p className=\"LogInModal-forgotPassword\">\n <a onclick={this.forgotPassword.bind(this)}>{app.translator.trans('core.forum.log_in.forgot_password_link')}</a>\n </p>,\n\n app.forum.attribute('allowSignUp') ? (\n <p className=\"LogInModal-signUp\">{app.translator.trans('core.forum.log_in.sign_up_text', { a: <a onclick={this.signUp.bind(this)} /> })}</p>\n ) : (\n ''\n ),\n ];\n }\n\n /**\n * Open the forgot password modal, prefilling it with an email if the user has\n * entered one.\n *\n * @public\n */\n forgotPassword() {\n const email = this.identification();\n const props = email.indexOf('@') !== -1 ? { email } : undefined;\n\n app.modal.show(new ForgotPasswordModal(props));\n }\n\n /**\n * Open the sign up modal, prefilling it with an email/username/password if\n * the user has entered one.\n *\n * @public\n */\n signUp() {\n const props = { password: this.password() };\n const identification = this.identification();\n props[identification.indexOf('@') !== -1 ? 'email' : 'username'] = identification;\n\n app.modal.show(new SignUpModal(props));\n }\n\n onready() {\n this.$('[name=' + (this.identification() ? 'password' : 'identification') + ']').select();\n }\n\n onsubmit(e) {\n e.preventDefault();\n\n this.loading = true;\n\n const identification = this.identification();\n const password = this.password();\n const remember = this.remember();\n\n app.session\n .login({ identification, password, remember }, { errorHandler: this.onerror.bind(this) })\n .then(() => window.location.reload(), this.loaded.bind(this));\n }\n\n onerror(error) {\n if (error.status === 401) {\n error.alert.props.children = app.translator.trans('core.forum.log_in.invalid_login_message');\n }\n\n super.onerror(error);\n }\n}\n","import Modal from '../../common/components/Modal';\nimport Button from '../../common/components/Button';\n\n/**\n * The 'RenameDiscussionModal' displays a modal dialog with an input to rename a discussion\n */\nexport default class RenameDiscussionModal extends Modal {\n init() {\n super.init();\n\n this.discussion = this.props.discussion;\n this.currentTitle = this.props.currentTitle;\n this.newTitle = m.prop(this.currentTitle);\n }\n\n className() {\n return 'RenameDiscussionModal Modal--small';\n }\n\n title() {\n return app.translator.trans('core.forum.rename_discussion.title');\n }\n\n content() {\n return (\n <div className=\"Modal-body\">\n <div className=\"Form Form--centered\">\n <div className=\"Form-group\">\n <input className=\"FormControl\" bidi={this.newTitle} type=\"text\" />\n </div>\n <div className=\"Form-group\">\n {Button.component({\n className: 'Button Button--primary Button--block',\n type: 'submit',\n loading: this.loading,\n children: app.translator.trans('core.forum.rename_discussion.submit_button'),\n })}\n </div>\n </div>\n </div>\n );\n }\n\n onsubmit(e) {\n e.preventDefault();\n\n this.loading = true;\n\n const title = this.newTitle;\n const currentTitle = this.currentTitle;\n\n // If the title is different to what it was before, then save it. After the\n // save has completed, update the post stream as there will be a new post\n // indicating that the discussion was renamed.\n if (title && title !== currentTitle) {\n return this.discussion\n .save({ title })\n .then(() => {\n if (app.viewingDiscussion(this.discussion)) {\n app.current.get('stream').update();\n }\n m.redraw();\n this.hide();\n })\n .catch(() => {\n this.loading = false;\n m.redraw();\n });\n } else {\n this.hide();\n }\n }\n}\n","import DiscussionPage from '../components/DiscussionPage';\nimport ReplyComposer from '../components/ReplyComposer';\nimport LogInModal from '../components/LogInModal';\nimport Button from '../../common/components/Button';\nimport Separator from '../../common/components/Separator';\nimport RenameDiscussionModal from '../components/RenameDiscussionModal';\nimport ItemList from '../../common/utils/ItemList';\nimport extractText from '../../common/utils/extractText';\n\n/**\n * The `DiscussionControls` utility constructs a list of buttons for a\n * discussion which perform actions on it.\n */\nexport default {\n /**\n * Get a list of controls for a discussion.\n *\n * @param {Discussion} discussion\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @public\n */\n controls(discussion, context) {\n const items = new ItemList();\n\n ['user', 'moderation', 'destructive'].forEach((section) => {\n const controls = this[section + 'Controls'](discussion, context).toArray();\n if (controls.length) {\n controls.forEach((item) => items.add(item.itemName, item));\n items.add(section + 'Separator', Separator.component());\n }\n });\n\n return items;\n },\n\n /**\n * Get controls for a discussion pertaining to the current user (e.g. reply,\n * follow).\n *\n * @param {Discussion} discussion\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @protected\n */\n userControls(discussion, context) {\n const items = new ItemList();\n\n // Only add a reply control if this is the discussion's controls dropdown\n // for the discussion page itself. We don't want it to show up for\n // discussions in the discussion list, etc.\n if (context instanceof DiscussionPage) {\n items.add(\n 'reply',\n !app.session.user || discussion.canReply()\n ? Button.component({\n icon: 'fas fa-reply',\n children: app.translator.trans(\n app.session.user ? 'core.forum.discussion_controls.reply_button' : 'core.forum.discussion_controls.log_in_to_reply_button'\n ),\n onclick: this.replyAction.bind(discussion, true, false),\n })\n : Button.component({\n icon: 'fas fa-reply',\n children: app.translator.trans('core.forum.discussion_controls.cannot_reply_button'),\n className: 'disabled',\n title: app.translator.trans('core.forum.discussion_controls.cannot_reply_text'),\n })\n );\n }\n\n return items;\n },\n\n /**\n * Get controls for a discussion pertaining to moderation (e.g. rename, lock).\n *\n * @param {Discussion} discussion\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @protected\n */\n moderationControls(discussion) {\n const items = new ItemList();\n\n if (discussion.canRename()) {\n items.add(\n 'rename',\n Button.component({\n icon: 'fas fa-pencil-alt',\n children: app.translator.trans('core.forum.discussion_controls.rename_button'),\n onclick: this.renameAction.bind(discussion),\n })\n );\n }\n\n return items;\n },\n\n /**\n * Get controls for a discussion which are destructive (e.g. delete).\n *\n * @param {Discussion} discussion\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @protected\n */\n destructiveControls(discussion) {\n const items = new ItemList();\n\n if (!discussion.isHidden()) {\n if (discussion.canHide()) {\n items.add(\n 'hide',\n Button.component({\n icon: 'far fa-trash-alt',\n children: app.translator.trans('core.forum.discussion_controls.delete_button'),\n onclick: this.hideAction.bind(discussion),\n })\n );\n }\n } else {\n if (discussion.canHide()) {\n items.add(\n 'restore',\n Button.component({\n icon: 'fas fa-reply',\n children: app.translator.trans('core.forum.discussion_controls.restore_button'),\n onclick: this.restoreAction.bind(discussion),\n })\n );\n }\n\n if (discussion.canDelete()) {\n items.add(\n 'delete',\n Button.component({\n icon: 'fas fa-times',\n children: app.translator.trans('core.forum.discussion_controls.delete_forever_button'),\n onclick: this.deleteAction.bind(discussion),\n })\n );\n }\n }\n\n return items;\n },\n\n /**\n * Open the reply composer for the discussion. A promise will be returned,\n * which resolves when the composer opens successfully. If the user is not\n * logged in, they will be prompted. If they don't have permission to\n * reply, the promise will be rejected.\n *\n * @param {Boolean} goToLast Whether or not to scroll down to the last post if\n * the discussion is being viewed.\n * @param {Boolean} forceRefresh Whether or not to force a reload of the\n * composer component, even if it is already open for this discussion.\n * @return {Promise}\n */\n replyAction(goToLast, forceRefresh) {\n const deferred = m.deferred();\n\n if (app.session.user) {\n if (this.canReply()) {\n let component = app.composer.component;\n if (!app.composingReplyTo(this) || forceRefresh) {\n component = new ReplyComposer({\n user: app.session.user,\n discussion: this,\n });\n app.composer.load(component);\n }\n app.composer.show();\n\n if (goToLast && app.viewingDiscussion(this) && !app.composer.isFullScreen()) {\n app.current.get('stream').goToNumber('reply');\n }\n\n deferred.resolve(component);\n } else {\n deferred.reject();\n }\n } else {\n deferred.reject();\n\n app.modal.show(new LogInModal());\n }\n\n return deferred.promise;\n },\n\n /**\n * Hide a discussion.\n *\n * @return {Promise}\n */\n hideAction() {\n this.pushAttributes({ hiddenAt: new Date(), hiddenUser: app.session.user });\n\n return this.save({ isHidden: true });\n },\n\n /**\n * Restore a discussion.\n *\n * @return {Promise}\n */\n restoreAction() {\n this.pushAttributes({ hiddenAt: null, hiddenUser: null });\n\n return this.save({ isHidden: false });\n },\n\n /**\n * Delete the discussion after confirming with the user.\n *\n * @return {Promise}\n */\n deleteAction() {\n if (confirm(extractText(app.translator.trans('core.forum.discussion_controls.delete_confirmation')))) {\n // If we're currently viewing the discussion that was deleted, go back\n // to the previous page.\n if (app.viewingDiscussion(this)) {\n app.history.back();\n }\n\n return this.delete().then(() => app.discussions.removeDiscussion(this));\n }\n },\n\n /**\n * Rename the discussion.\n *\n * @return {Promise}\n */\n renameAction() {\n return app.modal.show(\n new RenameDiscussionModal({\n currentTitle: this.title(),\n discussion: this,\n })\n );\n },\n};\n","/*global s9e*/\n\nimport Component from '../../common/Component';\nimport avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport DiscussionControls from '../utils/DiscussionControls';\n\n/**\n * The `ReplyPlaceholder` component displays a placeholder for a reply, which,\n * when clicked, opens the reply composer.\n *\n * ### Props\n *\n * - `discussion`\n */\nexport default class ReplyPlaceholder extends Component {\n view() {\n if (app.composingReplyTo(this.props.discussion)) {\n return (\n <article className=\"Post CommentPost editing\">\n <header className=\"Post-header\">\n <div className=\"PostUser\">\n <h3>\n {avatar(app.session.user, { className: 'PostUser-avatar' })}\n {username(app.session.user)}\n </h3>\n </div>\n </header>\n <div className=\"Post-body\" config={this.configPreview.bind(this)} />\n </article>\n );\n }\n\n const reply = () => {\n DiscussionControls.replyAction.call(this.props.discussion, true);\n };\n\n return (\n <article className=\"Post ReplyPlaceholder\" onclick={reply}>\n <header className=\"Post-header\">\n {avatar(app.session.user, { className: 'PostUser-avatar' })} {app.translator.trans('core.forum.post_stream.reply_placeholder')}\n </header>\n </article>\n );\n }\n\n configPreview(element, isInitialized, context) {\n if (isInitialized) return;\n\n // Every 50ms, if the composer content has changed, then update the post's\n // body with a preview.\n let preview;\n const updateInterval = setInterval(() => {\n // Since we're polling, the composer may have been closed in the meantime,\n // so we bail in that case.\n if (!app.composer.component) return;\n\n const content = app.composer.component.content();\n\n if (preview === content) return;\n\n preview = content;\n\n const anchorToBottom = $(window).scrollTop() + $(window).height() >= $(document).height();\n\n s9e.TextFormatter.preview(preview || '', element);\n\n if (anchorToBottom) {\n $(window).scrollTop($(document).height());\n }\n }, 50);\n\n context.onunload = () => clearInterval(updateInterval);\n }\n}\n","import Component from '../../common/Component';\nimport ScrollListener from '../../common/utils/ScrollListener';\nimport PostLoading from './LoadingPost';\nimport anchorScroll from '../../common/utils/anchorScroll';\nimport evented from '../../common/utils/evented';\nimport ReplyPlaceholder from './ReplyPlaceholder';\nimport Button from '../../common/components/Button';\n\n/**\n * The `PostStream` component displays an infinitely-scrollable wall of posts in\n * a discussion. Posts that have not loaded will be displayed as placeholders.\n *\n * ### Props\n *\n * - `discussion`\n * - `includedPosts`\n */\nclass PostStream extends Component {\n init() {\n /**\n * The discussion to display the post stream for.\n *\n * @type {Discussion}\n */\n this.discussion = this.props.discussion;\n\n /**\n * Whether or not the infinite-scrolling auto-load functionality is\n * disabled.\n *\n * @type {Boolean}\n */\n this.paused = false;\n\n this.scrollListener = new ScrollListener(this.onscroll.bind(this));\n this.loadPageTimeouts = {};\n this.pagesLoading = 0;\n\n this.show(this.props.includedPosts);\n }\n\n /**\n * Load and scroll to a post with a certain number.\n *\n * @param {Integer|String} number The post number to go to. If 'reply', go to\n * the last post and scroll the reply preview into view.\n * @param {Boolean} noAnimation\n * @return {Promise}\n */\n goToNumber(number, noAnimation) {\n // If we want to go to the reply preview, then we will go to the end of the\n // discussion and then scroll to the very bottom of the page.\n if (number === 'reply') {\n return this.goToLast().then(() => {\n $('html,body')\n .stop(true)\n .animate(\n {\n scrollTop: $(document).height() - $(window).height(),\n },\n 'fast',\n () => {\n this.flashItem(this.$('.PostStream-item:last-child'));\n }\n );\n });\n }\n\n this.paused = true;\n\n const promise = this.loadNearNumber(number);\n\n m.redraw(true);\n\n return promise.then(() => {\n m.redraw(true);\n\n this.scrollToNumber(number, noAnimation).done(this.unpause.bind(this));\n });\n }\n\n /**\n * Load and scroll to a certain index within the discussion.\n *\n * @param {Integer} index\n * @param {Boolean} backwards Whether or not to load backwards from the given\n * index.\n * @param {Boolean} noAnimation\n * @return {Promise}\n */\n goToIndex(index, backwards, noAnimation) {\n this.paused = true;\n\n const promise = this.loadNearIndex(index);\n\n m.redraw(true);\n\n return promise.then(() => {\n anchorScroll(this.$('.PostStream-item:' + (backwards ? 'last' : 'first')), () => m.redraw(true));\n\n this.scrollToIndex(index, noAnimation, backwards).done(this.unpause.bind(this));\n });\n }\n\n /**\n * Load and scroll up to the first post in the discussion.\n *\n * @return {Promise}\n */\n goToFirst() {\n return this.goToIndex(0);\n }\n\n /**\n * Load and scroll down to the last post in the discussion.\n *\n * @return {Promise}\n */\n goToLast() {\n return this.goToIndex(this.count() - 1, true);\n }\n\n /**\n * Update the stream so that it loads and includes the latest posts in the\n * discussion, if the end is being viewed.\n *\n * @public\n */\n update() {\n if (!this.viewingEnd) return m.deferred().resolve().promise;\n\n this.visibleEnd = this.count();\n\n return this.loadRange(this.visibleStart, this.visibleEnd).then(() => m.redraw());\n }\n\n /**\n * Get the total number of posts in the discussion.\n *\n * @return {Integer}\n */\n count() {\n return this.discussion.postIds().length;\n }\n\n /**\n * Make sure that the given index is not outside of the possible range of\n * indexes in the discussion.\n *\n * @param {Integer} index\n * @protected\n */\n sanitizeIndex(index) {\n return Math.max(0, Math.min(this.count(), index));\n }\n\n /**\n * Set up the stream with the given array of posts.\n *\n * @param {Post[]} posts\n */\n show(posts) {\n this.visibleStart = posts.length ? this.discussion.postIds().indexOf(posts[0].id()) : 0;\n this.visibleEnd = this.visibleStart + posts.length;\n }\n\n /**\n * Reset the stream so that a specific range of posts is displayed. If a range\n * is not specified, the first page of posts will be displayed.\n *\n * @param {Integer} [start]\n * @param {Integer} [end]\n */\n reset(start, end) {\n this.visibleStart = start || 0;\n this.visibleEnd = this.sanitizeIndex(end || this.constructor.loadCount);\n }\n\n /**\n * Get the visible page of posts.\n *\n * @return {Post[]}\n */\n posts() {\n return this.discussion\n .postIds()\n .slice(this.visibleStart, this.visibleEnd)\n .map((id) => {\n const post = app.store.getById('posts', id);\n\n return post && post.discussion() && typeof post.canEdit() !== 'undefined' ? post : null;\n });\n }\n\n view() {\n function fadeIn(element, isInitialized, context) {\n if (!context.fadedIn) $(element).hide().fadeIn();\n context.fadedIn = true;\n }\n\n let lastTime;\n\n this.visibleEnd = this.sanitizeIndex(this.visibleEnd);\n this.viewingEnd = this.visibleEnd === this.count();\n\n const posts = this.posts();\n const postIds = this.discussion.postIds();\n\n const items = posts.map((post, i) => {\n let content;\n const attrs = { 'data-index': this.visibleStart + i };\n\n if (post) {\n const time = post.createdAt();\n const PostComponent = app.postComponents[post.contentType()];\n content = PostComponent ? PostComponent.component({ post }) : '';\n\n attrs.key = 'post' + post.id();\n attrs.config = fadeIn;\n attrs['data-time'] = time.toISOString();\n attrs['data-number'] = post.number();\n attrs['data-id'] = post.id();\n attrs['data-type'] = post.contentType();\n\n // If the post before this one was more than 4 hours ago, we will\n // display a 'time gap' indicating how long it has been in between\n // the posts.\n const dt = time - lastTime;\n\n if (dt > 1000 * 60 * 60 * 24 * 4) {\n content = [\n <div className=\"PostStream-timeGap\">\n <span>{app.translator.trans('core.forum.post_stream.time_lapsed_text', { period: moment.duration(dt).humanize() })}</span>\n </div>,\n content,\n ];\n }\n\n lastTime = time;\n } else {\n attrs.key = 'post' + postIds[this.visibleStart + i];\n\n content = PostLoading.component();\n }\n\n return (\n <div className=\"PostStream-item\" {...attrs}>\n {content}\n </div>\n );\n });\n\n if (!this.viewingEnd && posts[this.visibleEnd - this.visibleStart - 1]) {\n items.push(\n <div className=\"PostStream-loadMore\" key=\"loadMore\">\n <Button className=\"Button\" onclick={this.loadNext.bind(this)}>\n {app.translator.trans('core.forum.post_stream.load_more_button')}\n </Button>\n </div>\n );\n }\n\n // If we're viewing the end of the discussion, the user can reply, and\n // is not already doing so, then show a 'write a reply' placeholder.\n if (this.viewingEnd && (!app.session.user || this.discussion.canReply())) {\n items.push(\n <div className=\"PostStream-item\" key=\"reply\">\n {ReplyPlaceholder.component({ discussion: this.discussion })}\n </div>\n );\n }\n\n return <div className=\"PostStream\">{items}</div>;\n }\n\n config(isInitialized, context) {\n if (isInitialized) return;\n\n // This is wrapped in setTimeout due to the following Mithril issue:\n // https://github.com/lhorie/mithril.js/issues/637\n setTimeout(() => this.scrollListener.start());\n\n context.onunload = () => {\n this.scrollListener.stop();\n clearTimeout(this.calculatePositionTimeout);\n };\n }\n\n /**\n * When the window is scrolled, check if either extreme of the post stream is\n * in the viewport, and if so, trigger loading the next/previous page.\n *\n * @param {Integer} top\n */\n onscroll(top) {\n if (this.paused) return;\n\n const marginTop = this.getMarginTop();\n const viewportHeight = $(window).height() - marginTop;\n const viewportTop = top + marginTop;\n const loadAheadDistance = 300;\n\n if (this.visibleStart > 0) {\n const $item = this.$('.PostStream-item[data-index=' + this.visibleStart + ']');\n\n if ($item.length && $item.offset().top > viewportTop - loadAheadDistance) {\n this.loadPrevious();\n }\n }\n\n if (this.visibleEnd < this.count()) {\n const $item = this.$('.PostStream-item[data-index=' + (this.visibleEnd - 1) + ']');\n\n if ($item.length && $item.offset().top + $item.outerHeight(true) < viewportTop + viewportHeight + loadAheadDistance) {\n this.loadNext();\n }\n }\n\n // Throttle calculation of our position (start/end numbers of posts in the\n // viewport) to 100ms.\n clearTimeout(this.calculatePositionTimeout);\n this.calculatePositionTimeout = setTimeout(this.calculatePosition.bind(this), 100);\n }\n\n /**\n * Load the next page of posts.\n */\n loadNext() {\n const start = this.visibleEnd;\n const end = (this.visibleEnd = this.sanitizeIndex(this.visibleEnd + this.constructor.loadCount));\n\n // Unload the posts which are two pages back from the page we're currently\n // loading.\n const twoPagesAway = start - this.constructor.loadCount * 2;\n if (twoPagesAway > this.visibleStart && twoPagesAway >= 0) {\n this.visibleStart = twoPagesAway + this.constructor.loadCount + 1;\n\n if (this.loadPageTimeouts[twoPagesAway]) {\n clearTimeout(this.loadPageTimeouts[twoPagesAway]);\n this.loadPageTimeouts[twoPagesAway] = null;\n this.pagesLoading--;\n }\n }\n\n this.loadPage(start, end);\n }\n\n /**\n * Load the previous page of posts.\n */\n loadPrevious() {\n const end = this.visibleStart;\n const start = (this.visibleStart = this.sanitizeIndex(this.visibleStart - this.constructor.loadCount));\n\n // Unload the posts which are two pages back from the page we're currently\n // loading.\n const twoPagesAway = start + this.constructor.loadCount * 2;\n if (twoPagesAway < this.visibleEnd && twoPagesAway <= this.count()) {\n this.visibleEnd = twoPagesAway;\n\n if (this.loadPageTimeouts[twoPagesAway]) {\n clearTimeout(this.loadPageTimeouts[twoPagesAway]);\n this.loadPageTimeouts[twoPagesAway] = null;\n this.pagesLoading--;\n }\n }\n\n this.loadPage(start, end, true);\n }\n\n /**\n * Load a page of posts into the stream and redraw.\n *\n * @param {Integer} start\n * @param {Integer} end\n * @param {Boolean} backwards\n */\n loadPage(start, end, backwards) {\n const redraw = () => {\n if (start < this.visibleStart || end > this.visibleEnd) return;\n\n const anchorIndex = backwards ? this.visibleEnd - 1 : this.visibleStart;\n anchorScroll(`.PostStream-item[data-index=\"${anchorIndex}\"]`, () => m.redraw(true));\n\n this.unpause();\n };\n redraw();\n\n this.loadPageTimeouts[start] = setTimeout(\n () => {\n this.loadRange(start, end).then(() => {\n redraw();\n this.pagesLoading--;\n });\n this.loadPageTimeouts[start] = null;\n },\n this.pagesLoading ? 1000 : 0\n );\n\n this.pagesLoading++;\n }\n\n /**\n * Load and inject the specified range of posts into the stream, without\n * clearing it.\n *\n * @param {Integer} start\n * @param {Integer} end\n * @return {Promise}\n */\n loadRange(start, end) {\n const loadIds = [];\n const loaded = [];\n\n this.discussion\n .postIds()\n .slice(start, end)\n .forEach((id) => {\n const post = app.store.getById('posts', id);\n\n if (post && post.discussion() && typeof post.canEdit() !== 'undefined') {\n loaded.push(post);\n } else {\n loadIds.push(id);\n }\n });\n\n return loadIds.length ? app.store.find('posts', loadIds) : m.deferred().resolve(loaded).promise;\n }\n\n /**\n * Clear the stream and load posts near a certain number. Returns a promise.\n * If the post with the given number is already loaded, the promise will be\n * resolved immediately.\n *\n * @param {Integer} number\n * @return {Promise}\n */\n loadNearNumber(number) {\n if (this.posts().some((post) => post && Number(post.number()) === Number(number))) {\n return m.deferred().resolve().promise;\n }\n\n this.reset();\n\n return app.store\n .find('posts', {\n filter: { discussion: this.discussion.id() },\n page: { near: number },\n })\n .then(this.show.bind(this));\n }\n\n /**\n * Clear the stream and load posts near a certain index. A page of posts\n * surrounding the given index will be loaded. Returns a promise. If the given\n * index is already loaded, the promise will be resolved immediately.\n *\n * @param {Integer} index\n * @return {Promise}\n */\n loadNearIndex(index) {\n if (index >= this.visibleStart && index <= this.visibleEnd) {\n return m.deferred().resolve().promise;\n }\n\n const start = this.sanitizeIndex(index - this.constructor.loadCount / 2);\n const end = start + this.constructor.loadCount;\n\n this.reset(start, end);\n\n return this.loadRange(start, end).then(this.show.bind(this));\n }\n\n /**\n * Work out which posts (by number) are currently visible in the viewport, and\n * fire an event with the information.\n */\n calculatePosition() {\n const marginTop = this.getMarginTop();\n const $window = $(window);\n const viewportHeight = $window.height() - marginTop;\n const scrollTop = $window.scrollTop() + marginTop;\n let startNumber;\n let endNumber;\n\n this.$('.PostStream-item').each(function () {\n const $item = $(this);\n const top = $item.offset().top;\n const height = $item.outerHeight(true);\n\n if (top + height > scrollTop) {\n if (!startNumber) {\n startNumber = endNumber = $item.data('number');\n }\n\n if (top + height < scrollTop + viewportHeight) {\n if ($item.data('number')) {\n endNumber = $item.data('number');\n }\n } else return false;\n }\n });\n\n if (startNumber) {\n this.trigger('positionChanged', startNumber || 1, endNumber);\n }\n }\n\n /**\n * Get the distance from the top of the viewport to the point at which we\n * would consider a post to be the first one visible.\n *\n * @return {Integer}\n */\n getMarginTop() {\n return this.$() && $('#header').outerHeight() + parseInt(this.$().css('margin-top'), 10);\n }\n\n /**\n * Scroll down to a certain post by number and 'flash' it.\n *\n * @param {Integer} number\n * @param {Boolean} noAnimation\n * @return {jQuery.Deferred}\n */\n scrollToNumber(number, noAnimation) {\n const $item = this.$(`.PostStream-item[data-number=${number}]`);\n\n return this.scrollToItem($item, noAnimation).done(this.flashItem.bind(this, $item));\n }\n\n /**\n * Scroll down to a certain post by index.\n *\n * @param {Integer} index\n * @param {Boolean} noAnimation\n * @param {Boolean} bottom Whether or not to scroll to the bottom of the post\n * at the given index, instead of the top of it.\n * @return {jQuery.Deferred}\n */\n scrollToIndex(index, noAnimation, bottom) {\n const $item = this.$(`.PostStream-item[data-index=${index}]`);\n\n return this.scrollToItem($item, noAnimation, true, bottom);\n }\n\n /**\n * Scroll down to the given post.\n *\n * @param {jQuery} $item\n * @param {Boolean} noAnimation\n * @param {Boolean} force Whether or not to force scrolling to the item, even\n * if it is already in the viewport.\n * @param {Boolean} bottom Whether or not to scroll to the bottom of the post\n * at the given index, instead of the top of it.\n * @return {jQuery.Deferred}\n */\n scrollToItem($item, noAnimation, force, bottom) {\n const $container = $('html, body').stop(true);\n\n if ($item.length) {\n const itemTop = $item.offset().top - this.getMarginTop();\n const itemBottom = $item.offset().top + $item.height();\n const scrollTop = $(document).scrollTop();\n const scrollBottom = scrollTop + $(window).height();\n\n // If the item is already in the viewport, we may not need to scroll.\n // If we're scrolling to the bottom of an item, then we'll make sure the\n // bottom will line up with the top of the composer.\n if (force || itemTop < scrollTop || itemBottom > scrollBottom) {\n const top = bottom ? itemBottom - $(window).height() + app.composer.computedHeight() : $item.is(':first-child') ? 0 : itemTop;\n\n if (noAnimation) {\n $container.scrollTop(top);\n } else if (top !== scrollTop) {\n $container.animate({ scrollTop: top }, 'fast');\n }\n }\n }\n\n return $container.promise();\n }\n\n /**\n * 'Flash' the given post, drawing the user's attention to it.\n *\n * @param {jQuery} $item\n */\n flashItem($item) {\n $item.addClass('flash').one('animationend webkitAnimationEnd', () => $item.removeClass('flash'));\n }\n\n /**\n * Resume the stream's ability to auto-load posts on scroll.\n */\n unpause() {\n this.paused = false;\n this.scrollListener.update();\n this.trigger('unpaused');\n }\n}\n\n/**\n * The number of posts to load per page.\n *\n * @type {Integer}\n */\nPostStream.loadCount = 20;\n\nObject.assign(PostStream.prototype, evented);\n\nexport default PostStream;\n","import Component from '../../common/Component';\nimport icon from '../../common/helpers/icon';\nimport ScrollListener from '../../common/utils/ScrollListener';\nimport SubtreeRetainer from '../../common/utils/SubtreeRetainer';\nimport formatNumber from '../../common/utils/formatNumber';\n\n/**\n * The `PostStreamScrubber` component displays a scrubber which can be used to\n * navigate/scrub through a post stream.\n *\n * ### Props\n *\n * - `stream`\n * - `className`\n */\nexport default class PostStreamScrubber extends Component {\n init() {\n this.handlers = {};\n\n /**\n * The index of the post that is currently at the top of the viewport.\n *\n * @type {Number}\n */\n this.index = 0;\n\n /**\n * The number of posts that are currently visible in the viewport.\n *\n * @type {Number}\n */\n this.visible = 1;\n\n /**\n * The description to render on the scrubber.\n *\n * @type {String}\n */\n this.description = '';\n\n // When the post stream begins loading posts at a certain index, we want our\n // scrubber scrollbar to jump to that position.\n this.props.stream.on('unpaused', (this.handlers.streamWasUnpaused = this.streamWasUnpaused.bind(this)));\n\n // Define a handler to update the state of the scrollbar to reflect the\n // current scroll position of the page.\n this.scrollListener = new ScrollListener(this.onscroll.bind(this));\n\n // Create a subtree retainer that will always cache the subtree after the\n // initial draw. We render parts of the scrubber using this because we\n // modify their DOM directly, and do not want Mithril messing around with\n // our changes.\n this.subtree = new SubtreeRetainer(() => true);\n }\n\n view() {\n const retain = this.subtree.retain();\n const count = this.count();\n const unreadCount = this.props.stream.discussion.unreadCount();\n const unreadPercent = count ? Math.min(count - this.index, unreadCount) / count : 0;\n\n const viewing = app.translator.transChoice('core.forum.post_scrubber.viewing_text', count, {\n index: <span className=\"Scrubber-index\">{retain || formatNumber(Math.min(Math.ceil(this.index + this.visible), count))}</span>,\n count: <span className=\"Scrubber-count\">{formatNumber(count)}</span>,\n });\n\n function styleUnread(element, isInitialized, context) {\n const $element = $(element);\n const newStyle = {\n top: 100 - unreadPercent * 100 + '%',\n height: unreadPercent * 100 + '%',\n };\n\n if (context.oldStyle) {\n $element.stop(true).css(context.oldStyle).animate(newStyle);\n } else {\n $element.css(newStyle);\n }\n\n context.oldStyle = newStyle;\n }\n\n return (\n <div className={'PostStreamScrubber Dropdown ' + (this.disabled() ? 'disabled ' : '') + (this.props.className || '')}>\n <button className=\"Button Dropdown-toggle\" data-toggle=\"dropdown\">\n {viewing} {icon('fas fa-sort')}\n </button>\n\n <div className=\"Dropdown-menu dropdown-menu\">\n <div className=\"Scrubber\">\n <a className=\"Scrubber-first\" onclick={this.goToFirst.bind(this)}>\n {icon('fas fa-angle-double-up')} {app.translator.trans('core.forum.post_scrubber.original_post_link')}\n </a>\n\n <div className=\"Scrubber-scrollbar\">\n <div className=\"Scrubber-before\" />\n <div className=\"Scrubber-handle\">\n <div className=\"Scrubber-bar\" />\n <div className=\"Scrubber-info\">\n <strong>{viewing}</strong>\n <span className=\"Scrubber-description\">{retain || this.description}</span>\n </div>\n </div>\n <div className=\"Scrubber-after\" />\n\n <div className=\"Scrubber-unread\" config={styleUnread}>\n {app.translator.trans('core.forum.post_scrubber.unread_text', { count: unreadCount })}\n </div>\n </div>\n\n <a className=\"Scrubber-last\" onclick={this.goToLast.bind(this)}>\n {icon('fas fa-angle-double-down')} {app.translator.trans('core.forum.post_scrubber.now_link')}\n </a>\n </div>\n </div>\n </div>\n );\n }\n\n /**\n * Go to the first post in the discussion.\n */\n goToFirst() {\n this.props.stream.goToFirst();\n this.index = 0;\n this.renderScrollbar(true);\n }\n\n /**\n * Go to the last post in the discussion.\n */\n goToLast() {\n this.props.stream.goToLast();\n this.index = this.count();\n this.renderScrollbar(true);\n }\n\n /**\n * Get the number of posts in the discussion.\n *\n * @return {Integer}\n */\n count() {\n return this.props.stream.count();\n }\n\n /**\n * When the stream is unpaused, update the scrubber to reflect its position.\n */\n streamWasUnpaused() {\n this.update(window.pageYOffset);\n this.renderScrollbar(true);\n }\n\n /**\n * Check whether or not the scrubber should be disabled, i.e. if all of the\n * posts are visible in the viewport.\n *\n * @return {Boolean}\n */\n disabled() {\n return this.visible >= this.count();\n }\n\n /**\n * When the page is scrolled, update the scrollbar to reflect the visible\n * posts.\n *\n * @param {Integer} top\n */\n onscroll(top) {\n const stream = this.props.stream;\n\n if (stream.paused || !stream.$()) return;\n\n this.update(top);\n this.renderScrollbar();\n }\n\n /**\n * Update the index/visible/description properties according to the window's\n * current scroll position.\n *\n * @param {Integer} scrollTop\n */\n update(scrollTop) {\n const stream = this.props.stream;\n\n const marginTop = stream.getMarginTop();\n const viewportTop = scrollTop + marginTop;\n const viewportHeight = $(window).height() - marginTop;\n\n // Before looping through all of the posts, we reset the scrollbar\n // properties to a 'default' state. These values reflect what would be\n // seen if the browser were scrolled right up to the top of the page,\n // and the viewport had a height of 0.\n const $items = stream.$('> .PostStream-item[data-index]');\n let index = $items.first().data('index') || 0;\n let visible = 0;\n let period = '';\n\n // Now loop through each of the items in the discussion. An 'item' is\n // either a single post or a 'gap' of one or more posts that haven't\n // been loaded yet.\n $items.each(function () {\n const $this = $(this);\n const top = $this.offset().top;\n const height = $this.outerHeight(true);\n\n // If this item is above the top of the viewport, skip to the next\n // one. If it's below the bottom of the viewport, break out of the\n // loop.\n if (top + height < viewportTop) {\n return true;\n }\n if (top > viewportTop + viewportHeight) {\n return false;\n }\n\n // Work out how many pixels of this item are visible inside the viewport.\n // Then add the proportion of this item's total height to the index.\n const visibleTop = Math.max(0, viewportTop - top);\n const visibleBottom = Math.min(height, viewportTop + viewportHeight - top);\n const visiblePost = visibleBottom - visibleTop;\n\n if (top <= viewportTop) {\n index = parseFloat($this.data('index')) + visibleTop / height;\n }\n\n if (visiblePost > 0) {\n visible += visiblePost / height;\n }\n\n // If this item has a time associated with it, then set the\n // scrollbar's current period to a formatted version of this time.\n const time = $this.data('time');\n if (time) period = time;\n });\n\n this.index = index;\n this.visible = visible;\n this.description = period ? moment(period).format('MMMM YYYY') : '';\n }\n\n config(isInitialized, context) {\n if (isInitialized) return;\n\n context.onunload = this.ondestroy.bind(this);\n\n this.scrollListener.start();\n\n // Whenever the window is resized, adjust the height of the scrollbar\n // so that it fills the height of the sidebar.\n $(window)\n .on('resize', (this.handlers.onresize = this.onresize.bind(this)))\n .resize();\n\n // When any part of the whole scrollbar is clicked, we want to jump to\n // that position.\n this.$('.Scrubber-scrollbar')\n .bind('click', this.onclick.bind(this))\n\n // Now we want to make the scrollbar handle draggable. Let's start by\n // preventing default browser events from messing things up.\n .css({ cursor: 'pointer', 'user-select': 'none' })\n .bind('dragstart mousedown touchstart', (e) => e.preventDefault());\n\n // When the mouse is pressed on the scrollbar handle, we capture some\n // information about its current position. We will store this\n // information in an object and pass it on to the document's\n // mousemove/mouseup events later.\n this.dragging = false;\n this.mouseStart = 0;\n this.indexStart = 0;\n\n this.$('.Scrubber-handle')\n .css('cursor', 'move')\n .bind('mousedown touchstart', this.onmousedown.bind(this))\n\n // Exempt the scrollbar handle from the 'jump to' click event.\n .click((e) => e.stopPropagation());\n\n // When the mouse moves and when it is released, we pass the\n // information that we captured when the mouse was first pressed onto\n // some event handlers. These handlers will move the scrollbar/stream-\n // content as appropriate.\n $(document)\n .on('mousemove touchmove', (this.handlers.onmousemove = this.onmousemove.bind(this)))\n .on('mouseup touchend', (this.handlers.onmouseup = this.onmouseup.bind(this)));\n }\n\n ondestroy() {\n this.scrollListener.stop();\n\n this.props.stream.off('unpaused', this.handlers.streamWasUnpaused);\n\n $(window).off('resize', this.handlers.onresize);\n\n $(document).off('mousemove touchmove', this.handlers.onmousemove).off('mouseup touchend', this.handlers.onmouseup);\n }\n\n /**\n * Update the scrollbar's position to reflect the current values of the\n * index/visible properties.\n *\n * @param {Boolean} animate\n */\n renderScrollbar(animate) {\n const percentPerPost = this.percentPerPost();\n const index = this.index;\n const count = this.count();\n const visible = this.visible || 1;\n\n const $scrubber = this.$();\n $scrubber.find('.Scrubber-index').text(formatNumber(Math.min(Math.ceil(index + visible), count)));\n $scrubber.find('.Scrubber-description').text(this.description);\n $scrubber.toggleClass('disabled', this.disabled());\n\n const heights = {};\n heights.before = Math.max(0, percentPerPost.index * Math.min(index, count - visible));\n heights.handle = Math.min(100 - heights.before, percentPerPost.visible * visible);\n heights.after = 100 - heights.before - heights.handle;\n\n const func = animate ? 'animate' : 'css';\n for (const part in heights) {\n const $part = $scrubber.find(`.Scrubber-${part}`);\n $part.stop(true, true)[func]({ height: heights[part] + '%' }, 'fast');\n\n // jQuery likes to put overflow:hidden, but because the scrollbar handle\n // has a negative margin-left, we need to override.\n if (func === 'animate') $part.css('overflow', 'visible');\n }\n }\n\n /**\n * Get the percentage of the height of the scrubber that should be allocated\n * to each post.\n *\n * @return {Object}\n * @property {Number} index The percent per post for posts on either side of\n * the visible part of the scrubber.\n * @property {Number} visible The percent per post for the visible part of the\n * scrubber.\n */\n percentPerPost() {\n const count = this.count() || 1;\n const visible = this.visible || 1;\n\n // To stop the handle of the scrollbar from getting too small when there\n // are many posts, we define a minimum percentage height for the handle\n // calculated from a 50 pixel limit. From this, we can calculate the\n // minimum percentage per visible post. If this is greater than the actual\n // percentage per post, then we need to adjust the 'before' percentage to\n // account for it.\n const minPercentVisible = (50 / this.$('.Scrubber-scrollbar').outerHeight()) * 100;\n const percentPerVisiblePost = Math.max(100 / count, minPercentVisible / visible);\n const percentPerPost = count === visible ? 0 : (100 - percentPerVisiblePost * visible) / (count - visible);\n\n return {\n index: percentPerPost,\n visible: percentPerVisiblePost,\n };\n }\n\n onresize() {\n this.scrollListener.update();\n\n // Adjust the height of the scrollbar so that it fills the height of\n // the sidebar and doesn't overlap the footer.\n const scrubber = this.$();\n const scrollbar = this.$('.Scrubber-scrollbar');\n\n scrollbar.css(\n 'max-height',\n $(window).height() -\n scrubber.offset().top +\n $(window).scrollTop() -\n parseInt($('#app').css('padding-bottom'), 10) -\n (scrubber.outerHeight() - scrollbar.outerHeight())\n );\n }\n\n onmousedown(e) {\n this.mouseStart = e.clientY || e.originalEvent.touches[0].clientY;\n this.indexStart = this.index;\n this.dragging = true;\n this.props.stream.paused = true;\n $('body').css('cursor', 'move');\n }\n\n onmousemove(e) {\n if (!this.dragging) return;\n\n // Work out how much the mouse has moved by - first in pixels, then\n // convert it to a percentage of the scrollbar's height, and then\n // finally convert it into an index. Add this delta index onto\n // the index at which the drag was started, and then scroll there.\n const deltaPixels = (e.clientY || e.originalEvent.touches[0].clientY) - this.mouseStart;\n const deltaPercent = (deltaPixels / this.$('.Scrubber-scrollbar').outerHeight()) * 100;\n const deltaIndex = deltaPercent / this.percentPerPost().index || 0;\n const newIndex = Math.min(this.indexStart + deltaIndex, this.count() - 1);\n\n this.index = Math.max(0, newIndex);\n this.renderScrollbar();\n }\n\n onmouseup() {\n if (!this.dragging) return;\n\n this.mouseStart = 0;\n this.indexStart = 0;\n this.dragging = false;\n $('body').css('cursor', '');\n\n this.$().removeClass('open');\n\n // If the index we've landed on is in a gap, then tell the stream-\n // content that we want to load those posts.\n const intIndex = Math.floor(this.index);\n this.props.stream.goToIndex(intIndex);\n this.renderScrollbar(true);\n }\n\n onclick(e) {\n // Calculate the index which we want to jump to based on the click position.\n\n // 1. Get the offset of the click from the top of the scrollbar, as a\n // percentage of the scrollbar's height.\n const $scrollbar = this.$('.Scrubber-scrollbar');\n const offsetPixels = (e.pageY || e.originalEvent.touches[0].pageY) - $scrollbar.offset().top + $('body').scrollTop();\n let offsetPercent = (offsetPixels / $scrollbar.outerHeight()) * 100;\n\n // 2. We want the handle of the scrollbar to end up centered on the click\n // position. Thus, we calculate the height of the handle in percent and\n // use that to find a new offset percentage.\n offsetPercent = offsetPercent - parseFloat($scrollbar.find('.Scrubber-handle')[0].style.height) / 2;\n\n // 3. Now we can convert the percentage into an index, and tell the stream-\n // content component to jump to that index.\n let offsetIndex = offsetPercent / this.percentPerPost().index;\n offsetIndex = Math.max(0, Math.min(this.count() - 1, offsetIndex));\n this.props.stream.goToIndex(Math.floor(offsetIndex));\n this.index = offsetIndex;\n this.renderScrollbar(true);\n\n this.$().removeClass('open');\n }\n}\n","import Component from '../../common/Component';\nimport humanTime from '../../common/helpers/humanTime';\nimport icon from '../../common/helpers/icon';\n\n/**\n * Displays information about a the first or last post in a discussion.\n *\n * ### Props\n *\n * - `discussion`\n * - `lastPost`\n */\nexport default class TerminalPost extends Component {\n view() {\n const discussion = this.props.discussion;\n const lastPost = this.props.lastPost && discussion.replyCount();\n\n const user = discussion[lastPost ? 'lastPostedUser' : 'user']();\n const time = discussion[lastPost ? 'lastPostedAt' : 'createdAt']();\n\n return (\n <span>\n {lastPost ? icon('fas fa-reply') : ''}{' '}\n {app.translator.trans('core.forum.discussion_list.' + (lastPost ? 'replied' : 'started') + '_text', {\n user,\n ago: humanTime(time),\n })}\n </span>\n );\n }\n}\n","import Component from '../../common/Component';\nimport avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport highlight from '../../common/helpers/highlight';\n\n/**\n * The `PostPreview` component shows a link to a post containing the avatar and\n * username of the author, and a short excerpt of the post's content.\n *\n * ### Props\n *\n * - `post`\n */\nexport default class PostPreview extends Component {\n view() {\n const post = this.props.post;\n const user = post.user();\n const excerpt = highlight(post.contentPlain(), this.props.highlight, 300);\n\n return (\n <a className=\"PostPreview\" href={app.route.post(post)} config={m.route} onclick={this.props.onclick}>\n <span className=\"PostPreview-content\">\n {avatar(user)}\n {username(user)} <span className=\"PostPreview-excerpt\">{excerpt}</span>\n </span>\n </a>\n );\n }\n}\n","/**\n * The `slidable` utility adds touch gestures to an element so that it can be\n * slid away to reveal controls underneath, and then released to activate those\n * controls.\n *\n * It relies on the element having children with particular CSS classes.\n * TODO: document\n *\n * @param {DOMElement} element\n * @return {Object}\n * @property {function} reset Revert the slider to its original position. This\n * should be called, for example, when a controls dropdown is closed.\n */\nexport default function slidable(element) {\n const $element = $(element);\n const threshold = 50;\n\n let $underneathLeft;\n let $underneathRight;\n\n let startX;\n let startY;\n let couldBeSliding = false;\n let isSliding = false;\n let pos = 0;\n\n /**\n * Animate the slider to a new position.\n *\n * @param {Integer} newPos\n * @param {Object} [options]\n */\n const animatePos = (newPos, options = {}) => {\n // Since we can't animate the transform property with jQuery, we'll use a\n // bit of a workaround. We set up the animation with a step function that\n // will set the transform property, but then we animate an unused property\n // (background-position-x) with jQuery.\n options.duration = options.duration || 'fast';\n options.step = function (x) {\n $(this).css('transform', 'translate(' + x + 'px, 0)');\n };\n\n $element.find('.Slidable-content').animate({ 'background-position-x': newPos }, options);\n };\n\n /**\n * Revert the slider to its original position.\n */\n const reset = () => {\n animatePos(0, {\n complete: function () {\n $element.removeClass('sliding');\n $underneathLeft.hide();\n $underneathRight.hide();\n isSliding = false;\n },\n });\n };\n\n $element\n .find('.Slidable-content')\n .on('touchstart', function (e) {\n // Update the references to the elements underneath the slider, provided\n // they're not disabled.\n $underneathLeft = $element.find('.Slidable-underneath--left:not(.disabled)');\n $underneathRight = $element.find('.Slidable-underneath--right:not(.disabled)');\n\n startX = e.originalEvent.targetTouches[0].clientX;\n startY = e.originalEvent.targetTouches[0].clientY;\n\n couldBeSliding = true;\n pos = 0;\n })\n\n .on('touchmove', function (e) {\n const newX = e.originalEvent.targetTouches[0].clientX;\n const newY = e.originalEvent.targetTouches[0].clientY;\n\n // Once the user moves their touch in a direction that's more up/down than\n // left/right, we'll assume they're scrolling the page. But if they do\n // move in a horizontal direction at first, then we'll lock their touch\n // into the slider.\n if (couldBeSliding && Math.abs(newX - startX) > Math.abs(newY - startY)) {\n isSliding = true;\n }\n couldBeSliding = false;\n\n if (isSliding) {\n pos = newX - startX;\n\n // If there are controls underneath the either side, then we'll show/hide\n // them depending on the slider's position. We also make the controls\n // icon get a bit bigger the further they slide.\n const toggle = ($underneath, side) => {\n if ($underneath.length) {\n const active = side === 'left' ? pos > 0 : pos < 0;\n\n if (active && $underneath.hasClass('Slidable-underneath--elastic')) {\n pos -= pos * 0.5;\n }\n $underneath.toggle(active);\n\n const scale = Math.max(0, Math.min(1, (Math.abs(pos) - 25) / threshold));\n $underneath.find('.icon').css('transform', 'scale(' + scale + ')');\n } else {\n pos = Math[side === 'left' ? 'min' : 'max'](0, pos);\n }\n };\n\n toggle($underneathLeft, 'left');\n toggle($underneathRight, 'right');\n\n $(this).css('transform', 'translate(' + pos + 'px, 0)');\n $(this).css('background-position-x', pos + 'px');\n\n $element.toggleClass('sliding', !!pos);\n\n e.preventDefault();\n }\n })\n\n .on('touchend', function () {\n // If the user releases the touch and the slider is past the threshold\n // position on either side, then we will activate the control for that\n // side. We will also animate the slider's position all the way to the\n // other side, or back to its original position, depending on whether or\n // not the side is 'elastic'.\n const activate = ($underneath) => {\n $underneath.click();\n\n if ($underneath.hasClass('Slidable-underneath--elastic')) {\n reset();\n } else {\n animatePos((pos > 0 ? 1 : -1) * $element.width());\n }\n };\n\n if ($underneathRight.length && pos < -threshold) {\n activate($underneathRight);\n } else if ($underneathLeft.length && pos > threshold) {\n activate($underneathLeft);\n } else {\n reset();\n }\n\n couldBeSliding = false;\n isSliding = false;\n });\n\n return { reset };\n}\n","import Component from '../../common/Component';\nimport avatar from '../../common/helpers/avatar';\nimport listItems from '../../common/helpers/listItems';\nimport highlight from '../../common/helpers/highlight';\nimport icon from '../../common/helpers/icon';\nimport humanTime from '../../common/utils/humanTime';\nimport ItemList from '../../common/utils/ItemList';\nimport abbreviateNumber from '../../common/utils/abbreviateNumber';\nimport Dropdown from '../../common/components/Dropdown';\nimport TerminalPost from './TerminalPost';\nimport PostPreview from './PostPreview';\nimport SubtreeRetainer from '../../common/utils/SubtreeRetainer';\nimport DiscussionControls from '../utils/DiscussionControls';\nimport slidable from '../utils/slidable';\nimport extractText from '../../common/utils/extractText';\nimport classList from '../../common/utils/classList';\n\n/**\n * The `DiscussionListItem` component shows a single discussion in the\n * discussion list.\n *\n * ### Props\n *\n * - `discussion`\n * - `params`\n */\nexport default class DiscussionListItem extends Component {\n init() {\n /**\n * Set up a subtree retainer so that the discussion will not be redrawn\n * unless new data comes in.\n *\n * @type {SubtreeRetainer}\n */\n this.subtree = new SubtreeRetainer(\n () => this.props.discussion.freshness,\n () => {\n const time = app.session.user && app.session.user.markedAllAsReadAt();\n return time && time.getTime();\n },\n () => this.active()\n );\n }\n\n attrs() {\n return {\n className: classList([\n 'DiscussionListItem',\n this.active() ? 'active' : '',\n this.props.discussion.isHidden() ? 'DiscussionListItem--hidden' : '',\n ]),\n };\n }\n\n view() {\n const retain = this.subtree.retain();\n\n if (retain) return retain;\n\n const discussion = this.props.discussion;\n const user = discussion.user();\n const isUnread = discussion.isUnread();\n const isRead = discussion.isRead();\n const showUnread = !this.showRepliesCount() && isUnread;\n let jumpTo = 0;\n const controls = DiscussionControls.controls(discussion, this).toArray();\n const attrs = this.attrs();\n\n if (this.props.params.q) {\n const post = discussion.mostRelevantPost();\n if (post) {\n jumpTo = post.number();\n }\n\n const phrase = this.props.params.q;\n this.highlightRegExp = new RegExp(phrase + '|' + phrase.trim().replace(/\\s+/g, '|'), 'gi');\n } else {\n jumpTo = Math.min(discussion.lastPostNumber(), (discussion.lastReadPostNumber() || 0) + 1);\n }\n\n return (\n <div {...attrs}>\n {controls.length\n ? Dropdown.component({\n icon: 'fas fa-ellipsis-v',\n children: controls,\n className: 'DiscussionListItem-controls',\n buttonClassName: 'Button Button--icon Button--flat Slidable-underneath Slidable-underneath--right',\n })\n : ''}\n\n <a\n className={'Slidable-underneath Slidable-underneath--left Slidable-underneath--elastic' + (isUnread ? '' : ' disabled')}\n onclick={this.markAsRead.bind(this)}\n >\n {icon('fas fa-check')}\n </a>\n\n <div className={'DiscussionListItem-content Slidable-content' + (isUnread ? ' unread' : '') + (isRead ? ' read' : '')}>\n <a\n href={user ? app.route.user(user) : '#'}\n className=\"DiscussionListItem-author\"\n title={extractText(\n app.translator.trans('core.forum.discussion_list.started_text', { user: user, ago: humanTime(discussion.createdAt()) })\n )}\n config={function (element) {\n $(element).tooltip({ placement: 'right' });\n m.route.apply(this, arguments);\n }}\n >\n {avatar(user, { title: '' })}\n </a>\n\n <ul className=\"DiscussionListItem-badges badges\">{listItems(discussion.badges().toArray())}</ul>\n\n <a href={app.route.discussion(discussion, jumpTo)} config={m.route} className=\"DiscussionListItem-main\">\n <h3 className=\"DiscussionListItem-title\">{highlight(discussion.title(), this.highlightRegExp)}</h3>\n <ul className=\"DiscussionListItem-info\">{listItems(this.infoItems().toArray())}</ul>\n </a>\n\n <span\n className=\"DiscussionListItem-count\"\n onclick={this.markAsRead.bind(this)}\n title={showUnread ? app.translator.trans('core.forum.discussion_list.mark_as_read_tooltip') : ''}\n >\n {abbreviateNumber(discussion[showUnread ? 'unreadCount' : 'replyCount']())}\n </span>\n </div>\n </div>\n );\n }\n\n config(isInitialized) {\n if (isInitialized) return;\n\n // If we're on a touch device, set up the discussion row to be slidable.\n // This allows the user to drag the row to either side of the screen to\n // reveal controls.\n if ('ontouchstart' in window) {\n const slidableInstance = slidable(this.$().addClass('Slidable'));\n\n this.$('.DiscussionListItem-controls').on('hidden.bs.dropdown', () => slidableInstance.reset());\n }\n }\n\n /**\n * Determine whether or not the discussion is currently being viewed.\n *\n * @return {Boolean}\n */\n active() {\n const idParam = m.route.param('id');\n\n return idParam && idParam.split('-')[0] === this.props.discussion.id();\n }\n\n /**\n * Determine whether or not information about who started the discussion\n * should be displayed instead of information about the most recent reply to\n * the discussion.\n *\n * @return {Boolean}\n */\n showFirstPost() {\n return ['newest', 'oldest'].indexOf(this.props.params.sort) !== -1;\n }\n\n /**\n * Determine whether or not the number of replies should be shown instead of\n * the number of unread posts.\n *\n * @return {Boolean}\n */\n showRepliesCount() {\n return this.props.params.sort === 'replies';\n }\n\n /**\n * Mark the discussion as read.\n */\n markAsRead() {\n const discussion = this.props.discussion;\n\n if (discussion.isUnread()) {\n discussion.save({ lastReadPostNumber: discussion.lastPostNumber() });\n m.redraw();\n }\n }\n\n /**\n * Build an item list of info for a discussion listing. By default this is\n * just the first/last post indicator.\n *\n * @return {ItemList}\n */\n infoItems() {\n const items = new ItemList();\n\n if (this.props.params.q) {\n const post = this.props.discussion.mostRelevantPost() || this.props.discussion.firstPost();\n\n if (post && post.contentType() === 'comment') {\n const excerpt = highlight(post.contentPlain(), this.highlightRegExp, 175);\n items.add('excerpt', excerpt, -100);\n }\n } else {\n items.add(\n 'terminalPost',\n TerminalPost.component({\n discussion: this.props.discussion,\n lastPost: !this.showFirstPost(),\n })\n );\n }\n\n return items;\n }\n}\n","import Component from '../../common/Component';\nimport DiscussionListItem from './DiscussionListItem';\nimport Button from '../../common/components/Button';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport Placeholder from '../../common/components/Placeholder';\n\n/**\n * The `DiscussionList` component displays a list of discussions.\n *\n * ### Props\n *\n * - `params` A map of parameters used to construct a refined parameter object\n * to send along in the API request to get discussion results.\n * - `state` A DiscussionListState object that represents the discussion lists's state.\n */\nexport default class DiscussionList extends Component {\n init() {\n this.state = this.props.state;\n }\n\n view() {\n const state = this.state;\n\n const params = state.getParams();\n let loading;\n\n if (state.isLoading()) {\n loading = LoadingIndicator.component();\n } else if (state.moreResults) {\n loading = Button.component({\n children: app.translator.trans('core.forum.discussion_list.load_more_button'),\n className: 'Button',\n onclick: state.loadMore.bind(state),\n });\n }\n\n if (state.empty()) {\n const text = app.translator.trans('core.forum.discussion_list.empty_text');\n return <div className=\"DiscussionList\">{Placeholder.component({ text })}</div>;\n }\n\n return (\n <div className={'DiscussionList' + (state.isSearchResults() ? ' DiscussionList--searchResults' : '')}>\n <ul className=\"DiscussionList-discussions\">\n {state.discussions.map((discussion) => {\n return (\n <li key={discussion.id()} data-id={discussion.id()}>\n {DiscussionListItem.component({ discussion, params })}\n </li>\n );\n })}\n </ul>\n <div className=\"DiscussionList-loadMore\">{loading}</div>\n </div>\n );\n }\n}\n","import Page from '../../common/components/Page';\nimport ItemList from '../../common/utils/ItemList';\nimport DiscussionHero from './DiscussionHero';\nimport PostStream from './PostStream';\nimport PostStreamScrubber from './PostStreamScrubber';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport SplitDropdown from '../../common/components/SplitDropdown';\nimport listItems from '../../common/helpers/listItems';\nimport DiscussionControls from '../utils/DiscussionControls';\nimport DiscussionList from './DiscussionList';\n\n/**\n * The `DiscussionPage` component displays a whole discussion page, including\n * the discussion list pane, the hero, the posts, and the sidebar.\n */\nexport default class DiscussionPage extends Page {\n init() {\n super.init();\n\n /**\n * The discussion that is being viewed.\n *\n * @type {Discussion}\n */\n this.discussion = null;\n\n /**\n * The number of the first post that is currently visible in the viewport.\n *\n * @type {Integer}\n */\n this.near = null;\n\n this.refresh();\n\n // If the discussion list has been loaded, then we'll enable the pane (and\n // hide it by default). Also, if we've just come from another discussion\n // page, then we don't want Mithril to redraw the whole page – if it did,\n // then the pane would redraw which would be slow and would cause problems with\n // event handlers.\n if (app.discussions.hasDiscussions()) {\n app.pane.enable();\n app.pane.hide();\n\n if (app.previous.matches(DiscussionPage)) {\n m.redraw.strategy('diff');\n }\n }\n\n app.history.push('discussion');\n\n this.bodyClass = 'App--discussion';\n }\n\n onunload(e) {\n // If we have routed to the same discussion as we were viewing previously,\n // cancel the unloading of this controller and instead prompt the post\n // stream to jump to the new 'near' param.\n if (this.discussion) {\n const idParam = m.route.param('id');\n\n if (idParam && idParam.split('-')[0] === this.discussion.id()) {\n e.preventDefault();\n\n const near = m.route.param('near') || '1';\n\n if (near !== String(this.near)) {\n this.stream.goToNumber(near);\n }\n\n this.near = null;\n return;\n }\n }\n\n // If we are indeed navigating away from this discussion, then disable the\n // discussion list pane. Also, if we're composing a reply to this\n // discussion, minimize the composer – unless it's empty, in which case\n // we'll just close it.\n app.pane.disable();\n\n if (app.composingReplyTo(this.discussion) && !app.composer.component.content()) {\n app.composer.hide();\n } else {\n app.composer.minimize();\n }\n }\n\n view() {\n const discussion = this.discussion;\n\n return (\n <div className=\"DiscussionPage\">\n {app.discussions.hasDiscussions() ? (\n <div className=\"DiscussionPage-list\" config={this.configPane.bind(this)}>\n {!$('.App-navigation').is(':visible') && <DiscussionList state={app.discussions} />}\n </div>\n ) : (\n ''\n )}\n\n <div className=\"DiscussionPage-discussion\">\n {discussion\n ? [\n DiscussionHero.component({ discussion }),\n <div className=\"container\">\n <nav className=\"DiscussionPage-nav\">\n <ul>{listItems(this.sidebarItems().toArray())}</ul>\n </nav>\n <div className=\"DiscussionPage-stream\">{this.stream.render()}</div>\n </div>,\n ]\n : LoadingIndicator.component({ className: 'LoadingIndicator--block' })}\n </div>\n </div>\n );\n }\n\n config(...args) {\n super.config(...args);\n\n if (this.discussion) {\n app.setTitle(this.discussion.title());\n }\n }\n\n /**\n * Clear and reload the discussion.\n */\n refresh() {\n this.near = m.route.param('near') || 0;\n this.discussion = null;\n\n const preloadedDiscussion = app.preloadedApiDocument();\n if (preloadedDiscussion) {\n // We must wrap this in a setTimeout because if we are mounting this\n // component for the first time on page load, then any calls to m.redraw\n // will be ineffective and thus any configs (scroll code) will be run\n // before stuff is drawn to the page.\n setTimeout(this.show.bind(this, preloadedDiscussion), 0);\n } else {\n const params = this.requestParams();\n\n app.store.find('discussions', m.route.param('id').split('-')[0], params).then(this.show.bind(this));\n }\n\n m.lazyRedraw();\n }\n\n /**\n * Get the parameters that should be passed in the API request to get the\n * discussion.\n *\n * @return {Object}\n */\n requestParams() {\n return {\n page: { near: this.near },\n };\n }\n\n /**\n * Initialize the component to display the given discussion.\n *\n * @param {Discussion} discussion\n */\n show(discussion) {\n this.discussion = discussion;\n\n app.history.push('discussion', discussion.title());\n app.setTitleCount(0);\n\n // When the API responds with a discussion, it will also include a number of\n // posts. Some of these posts are included because they are on the first\n // page of posts we want to display (determined by the `near` parameter) –\n // others may be included because due to other relationships introduced by\n // extensions. We need to distinguish the two so we don't end up displaying\n // the wrong posts. We do so by filtering out the posts that don't have\n // the 'discussion' relationship linked, then sorting and splicing.\n let includedPosts = [];\n if (discussion.payload && discussion.payload.included) {\n const discussionId = discussion.id();\n\n includedPosts = discussion.payload.included\n .filter(\n (record) =>\n record.type === 'posts' &&\n record.relationships &&\n record.relationships.discussion &&\n record.relationships.discussion.data.id === discussionId\n )\n .map((record) => app.store.getById('posts', record.id))\n .sort((a, b) => a.id() - b.id())\n .slice(0, 20);\n }\n\n // Set up the post stream for this discussion, along with the first page of\n // posts we want to display. Tell the stream to scroll down and highlight\n // the specific post that was routed to.\n this.stream = new PostStream({ discussion, includedPosts });\n this.stream.on('positionChanged', this.positionChanged.bind(this));\n this.stream.goToNumber(m.route.param('near') || (includedPosts[0] && includedPosts[0].number()), true);\n\n app.current.set('discussion', discussion);\n app.current.set('stream', this.stream);\n }\n\n /**\n * Configure the discussion list pane.\n *\n * @param {DOMElement} element\n * @param {Boolean} isInitialized\n * @param {Object} context\n */\n configPane(element, isInitialized, context) {\n if (isInitialized) return;\n\n context.retain = true;\n\n const $list = $(element);\n\n // When the mouse enters and leaves the discussions pane, we want to show\n // and hide the pane respectively. We also create a 10px 'hot edge' on the\n // left of the screen to activate the pane.\n const pane = app.pane;\n $list.hover(pane.show.bind(pane), pane.onmouseleave.bind(pane));\n\n const hotEdge = (e) => {\n if (e.pageX < 10) pane.show();\n };\n $(document).on('mousemove', hotEdge);\n context.onunload = () => $(document).off('mousemove', hotEdge);\n\n // If the discussion we are viewing is listed in the discussion list, then\n // we will make sure it is visible in the viewport – if it is not we will\n // scroll the list down to it.\n const $discussion = $list.find('.DiscussionListItem.active');\n if ($discussion.length) {\n const listTop = $list.offset().top;\n const listBottom = listTop + $list.outerHeight();\n const discussionTop = $discussion.offset().top;\n const discussionBottom = discussionTop + $discussion.outerHeight();\n\n if (discussionTop < listTop || discussionBottom > listBottom) {\n $list.scrollTop($list.scrollTop() - listTop + discussionTop);\n }\n }\n }\n\n /**\n * Build an item list for the contents of the sidebar.\n *\n * @return {ItemList}\n */\n sidebarItems() {\n const items = new ItemList();\n\n items.add(\n 'controls',\n SplitDropdown.component({\n children: DiscussionControls.controls(this.discussion, this).toArray(),\n icon: 'fas fa-ellipsis-v',\n className: 'App-primaryControl',\n buttonClassName: 'Button--primary',\n })\n );\n\n items.add(\n 'scrubber',\n PostStreamScrubber.component({\n stream: this.stream,\n className: 'App-titleControl',\n }),\n -100\n );\n\n return items;\n }\n\n /**\n * When the posts that are visible in the post stream change (i.e. the user\n * scrolls up or down), then we update the URL and mark the posts as read.\n *\n * @param {Integer} startNumber\n * @param {Integer} endNumber\n */\n positionChanged(startNumber, endNumber) {\n const discussion = this.discussion;\n\n // Construct a URL to this discussion with the updated position, then\n // replace it into the window's history and our own history stack.\n const url = app.route.discussion(discussion, (this.near = startNumber));\n\n m.route(url, true);\n window.history.replaceState(null, document.title, url);\n\n app.history.push('discussion', discussion.title());\n\n // If the user hasn't read past here before, then we'll update their read\n // state and redraw.\n if (app.session.user && endNumber > (discussion.lastReadPostNumber() || 0)) {\n discussion.save({ lastReadPostNumber: endNumber });\n m.redraw();\n }\n }\n}\n","import Component from '../../common/Component';\nimport ItemList from '../../common/utils/ItemList';\nimport listItems from '../../common/helpers/listItems';\n\n/**\n * The `HeaderPrimary` component displays primary header controls. On the\n * default skin, these are shown just to the right of the forum title.\n */\nexport default class HeaderPrimary extends Component {\n view() {\n return <ul className=\"Header-controls\">{listItems(this.items().toArray())}</ul>;\n }\n\n config(isInitialized, context) {\n // Since this component is 'above' the content of the page (that is, it is a\n // part of the global UI that persists between routes), we will flag the DOM\n // to be retained across route changes.\n context.retain = true;\n }\n\n /**\n * Build an item list for the controls.\n *\n * @return {ItemList}\n */\n items() {\n return new ItemList();\n }\n}\n","import avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport Dropdown from '../../common/components/Dropdown';\nimport LinkButton from '../../common/components/LinkButton';\nimport Button from '../../common/components/Button';\nimport ItemList from '../../common/utils/ItemList';\nimport Separator from '../../common/components/Separator';\nimport Group from '../../common/models/Group';\n\n/**\n * The `SessionDropdown` component shows a button with the current user's\n * avatar/name, with a dropdown of session controls.\n */\nexport default class SessionDropdown extends Dropdown {\n static initProps(props) {\n super.initProps(props);\n\n props.className = 'SessionDropdown';\n props.buttonClassName = 'Button Button--user Button--flat';\n props.menuClassName = 'Dropdown-menu--right';\n }\n\n view() {\n this.props.children = this.items().toArray();\n\n return super.view();\n }\n\n getButtonContent() {\n const user = app.session.user;\n\n return [avatar(user), ' ', <span className=\"Button-label\">{username(user)}</span>];\n }\n\n /**\n * Build an item list for the contents of the dropdown menu.\n *\n * @return {ItemList}\n */\n items() {\n const items = new ItemList();\n const user = app.session.user;\n\n items.add(\n 'profile',\n LinkButton.component({\n icon: 'fas fa-user',\n children: app.translator.trans('core.forum.header.profile_button'),\n href: app.route.user(user),\n }),\n 100\n );\n\n items.add(\n 'settings',\n LinkButton.component({\n icon: 'fas fa-cog',\n children: app.translator.trans('core.forum.header.settings_button'),\n href: app.route('settings'),\n }),\n 50\n );\n\n if (app.forum.attribute('adminUrl')) {\n items.add(\n 'administration',\n LinkButton.component({\n icon: 'fas fa-wrench',\n children: app.translator.trans('core.forum.header.admin_button'),\n href: app.forum.attribute('adminUrl'),\n target: '_blank',\n config: () => {},\n }),\n 0\n );\n }\n\n items.add('separator', Separator.component(), -90);\n\n items.add(\n 'logOut',\n Button.component({\n icon: 'fas fa-sign-out-alt',\n children: app.translator.trans('core.forum.header.log_out_button'),\n onclick: app.session.logout.bind(app.session),\n }),\n -100\n );\n\n return items;\n }\n}\n","import Component from '../../common/Component';\nimport listItems from '../../common/helpers/listItems';\nimport Button from '../../common/components/Button';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport Discussion from '../../common/models/Discussion';\n\n/**\n * The `NotificationList` component displays a list of the logged-in user's\n * notifications, grouped by discussion.\n */\nexport default class NotificationList extends Component {\n init() {\n this.state = this.props.state;\n }\n\n view() {\n const pages = this.state.getNotificationPages();\n\n return (\n <div className=\"NotificationList\">\n <div className=\"NotificationList-header\">\n <div className=\"App-primaryControl\">\n {Button.component({\n className: 'Button Button--icon Button--link',\n icon: 'fas fa-check',\n title: app.translator.trans('core.forum.notifications.mark_all_as_read_tooltip'),\n onclick: this.state.markAllAsRead.bind(this.state),\n })}\n </div>\n\n <h4 className=\"App-titleControl App-titleControl--text\">{app.translator.trans('core.forum.notifications.title')}</h4>\n </div>\n\n <div className=\"NotificationList-content\">\n {pages.length\n ? pages.map((notifications) => {\n const groups = [];\n const discussions = {};\n\n notifications.forEach((notification) => {\n const subject = notification.subject();\n\n if (typeof subject === 'undefined') return;\n\n // Get the discussion that this notification is related to. If it's not\n // directly related to a discussion, it may be related to a post or\n // other entity which is related to a discussion.\n let discussion = false;\n if (subject instanceof Discussion) discussion = subject;\n else if (subject && subject.discussion) discussion = subject.discussion();\n\n // If the notification is not related to a discussion directly or\n // indirectly, then we will assign it to a neutral group.\n const key = discussion ? discussion.id() : 0;\n discussions[key] = discussions[key] || { discussion: discussion, notifications: [] };\n discussions[key].notifications.push(notification);\n\n if (groups.indexOf(discussions[key]) === -1) {\n groups.push(discussions[key]);\n }\n });\n\n return groups.map((group) => {\n const badges = group.discussion && group.discussion.badges().toArray();\n\n return (\n <div className=\"NotificationGroup\">\n {group.discussion ? (\n <a className=\"NotificationGroup-header\" href={app.route.discussion(group.discussion)} config={m.route}>\n {badges && badges.length ? <ul className=\"NotificationGroup-badges badges\">{listItems(badges)}</ul> : ''}\n {group.discussion.title()}\n </a>\n ) : (\n <div className=\"NotificationGroup-header\">{app.forum.attribute('title')}</div>\n )}\n\n <ul className=\"NotificationGroup-content\">\n {group.notifications.map((notification) => {\n const NotificationComponent = app.notificationComponents[notification.contentType()];\n return NotificationComponent ? <li>{NotificationComponent.component({ notification })}</li> : '';\n })}\n </ul>\n </div>\n );\n });\n })\n : ''}\n {this.state.isLoading() ? (\n <LoadingIndicator className=\"LoadingIndicator--block\" />\n ) : pages.length ? (\n ''\n ) : (\n <div className=\"NotificationList-empty\">{app.translator.trans('core.forum.notifications.empty_text')}</div>\n )}\n </div>\n </div>\n );\n }\n\n config(isInitialized, context) {\n if (isInitialized) return;\n\n const $notifications = this.$('.NotificationList-content');\n const $scrollParent = $notifications.css('overflow') === 'auto' ? $notifications : $(window);\n\n const scrollHandler = () => {\n const scrollTop = $scrollParent.scrollTop();\n const viewportHeight = $scrollParent.height();\n const contentTop = $scrollParent === $notifications ? 0 : $notifications.offset().top;\n const contentHeight = $notifications[0].scrollHeight;\n\n if (this.state.hasMoreResults() && !this.state.isLoading() && scrollTop + viewportHeight >= contentTop + contentHeight) {\n this.state.loadMore();\n }\n };\n\n $scrollParent.on('scroll', scrollHandler);\n\n context.onunload = () => {\n $scrollParent.off('scroll', scrollHandler);\n };\n }\n}\n","import Dropdown from '../../common/components/Dropdown';\nimport icon from '../../common/helpers/icon';\nimport NotificationList from './NotificationList';\n\nexport default class NotificationsDropdown extends Dropdown {\n static initProps(props) {\n props.className = props.className || 'NotificationsDropdown';\n props.buttonClassName = props.buttonClassName || 'Button Button--flat';\n props.menuClassName = props.menuClassName || 'Dropdown-menu--right';\n props.label = props.label || app.translator.trans('core.forum.notifications.tooltip');\n props.icon = props.icon || 'fas fa-bell';\n\n super.initProps(props);\n }\n\n init() {\n super.init();\n }\n\n getButton() {\n const newNotifications = this.getNewCount();\n const vdom = super.getButton();\n\n vdom.attrs.title = this.props.label;\n\n vdom.attrs.className += newNotifications ? ' new' : '';\n vdom.attrs.onclick = this.onclick.bind(this);\n\n return vdom;\n }\n\n getButtonContent() {\n const unread = this.getUnreadCount();\n\n return [\n icon(this.props.icon, { className: 'Button-icon' }),\n unread ? <span className=\"NotificationsDropdown-unread\">{unread}</span> : '',\n <span className=\"Button-label\">{this.props.label}</span>,\n ];\n }\n\n getMenu() {\n return (\n <div className={'Dropdown-menu ' + this.props.menuClassName} onclick={this.menuClick.bind(this)}>\n {this.showing ? NotificationList.component({ state: this.props.state }) : ''}\n </div>\n );\n }\n\n onclick() {\n if (app.drawer.isOpen()) {\n this.goToRoute();\n } else {\n this.props.state.load();\n }\n }\n\n goToRoute() {\n m.route(app.route('notifications'));\n }\n\n getUnreadCount() {\n return app.session.user.unreadNotificationCount();\n }\n\n getNewCount() {\n return app.session.user.newNotificationCount();\n }\n\n menuClick(e) {\n // Don't close the notifications dropdown if the user is opening a link in a\n // new tab or window.\n if (e.shiftKey || e.metaKey || e.ctrlKey || e.which === 2) e.stopPropagation();\n }\n}\n","/**\n * The `KeyboardNavigatable` class manages lists that can be navigated with the\n * keyboard, calling callbacks for each actions.\n *\n * This helper encapsulates the key binding logic, providing a simple fluent\n * API for use.\n */\nexport default class KeyboardNavigatable {\n constructor() {\n /**\n * Callback to be executed for a specified input.\n *\n * @callback KeyboardNavigatable~keyCallback\n * @param {KeyboardEvent} event\n * @returns {boolean}\n */\n this.callbacks = {};\n\n /**\n * Callback that determines whether keyboard input should be handled.\n * By default, always handle keyboard navigation.\n *\n * @callback whenCallback\n * @param {KeyboardEvent} event\n * @returns {boolean}\n */\n this.whenCallback = (event) => true;\n }\n\n /**\n * Provide a callback to be executed when navigating upwards.\n *\n * This will be triggered by the Up key.\n *\n * @public\n * @param {KeyboardNavigatable~keyCallback} callback\n * @return {KeyboardNavigatable}\n */\n onUp(callback) {\n this.callbacks[38] = (e) => {\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when navigating downwards.\n *\n * This will be triggered by the Down key.\n *\n * @public\n * @param {KeyboardNavigatable~keyCallback} callback\n * @return {KeyboardNavigatable}\n */\n onDown(callback) {\n this.callbacks[40] = (e) => {\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when the current item is selected..\n *\n * This will be triggered by the Return and Tab keys..\n *\n * @public\n * @param {KeyboardNavigatable~keyCallback} callback\n * @return {KeyboardNavigatable}\n */\n onSelect(callback) {\n this.callbacks[9] = this.callbacks[13] = (e) => {\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when the navigation is canceled.\n *\n * This will be triggered by the Escape key.\n *\n * @public\n * @param {KeyboardNavigatable~keyCallback} callback\n * @return {KeyboardNavigatable}\n */\n onCancel(callback) {\n this.callbacks[27] = (e) => {\n e.stopPropagation();\n e.preventDefault();\n callback(e);\n };\n\n return this;\n }\n\n /**\n * Provide a callback to be executed when previous input is removed.\n *\n * This will be triggered by the Backspace key.\n *\n * @public\n * @param {KeyboardNavigatable~keyCallback} callback\n * @return {KeyboardNavigatable}\n */\n onRemove(callback) {\n this.callbacks[8] = (e) => {\n if (e.target.selectionStart === 0 && e.target.selectionEnd === 0) {\n callback(e);\n e.preventDefault();\n }\n };\n\n return this;\n }\n\n /**\n * Provide a callback that determines whether keyboard input should be handled.\n *\n * @public\n * @param {KeyboardNavigatable~whenCallback} callback\n * @return {KeyboardNavigatable}\n */\n when(callback) {\n this.whenCallback = callback;\n\n return this;\n }\n\n /**\n * Set up the navigation key bindings on the given jQuery element.\n *\n * @public\n * @param {jQuery} $element\n */\n bindTo($element) {\n // Handle navigation key events on the navigatable element.\n $element.on('keydown', this.navigate.bind(this));\n }\n\n /**\n * Interpret the given keyboard event as navigation commands.\n *\n * @public\n * @param {KeyboardEvent} event\n */\n navigate(event) {\n // This callback determines whether keyboard should be handled or ignored.\n if (!this.whenCallback(event)) return;\n\n const keyCallback = this.callbacks[event.which];\n if (keyCallback) {\n keyCallback(event);\n }\n }\n}\n","import highlight from '../../common/helpers/highlight';\nimport LinkButton from '../../common/components/LinkButton';\n\n/**\n * The `DiscussionsSearchSource` finds and displays discussion search results in\n * the search dropdown.\n *\n * @implements SearchSource\n */\nexport default class DiscussionsSearchSource {\n constructor() {\n this.results = {};\n }\n\n search(query) {\n query = query.toLowerCase();\n\n this.results[query] = [];\n\n const params = {\n filter: { q: query },\n page: { limit: 3 },\n include: 'mostRelevantPost',\n };\n\n return app.store.find('discussions', params).then((results) => (this.results[query] = results));\n }\n\n view(query) {\n query = query.toLowerCase();\n\n const results = this.results[query] || [];\n\n return [\n <li className=\"Dropdown-header\">{app.translator.trans('core.forum.search.discussions_heading')}</li>,\n <li>\n {LinkButton.component({\n icon: 'fas fa-search',\n children: app.translator.trans('core.forum.search.all_discussions_button', { query }),\n href: app.route('index', { q: query }),\n })}\n </li>,\n results.map((discussion) => {\n const mostRelevantPost = discussion.mostRelevantPost();\n\n return (\n <li className=\"DiscussionSearchResult\" data-index={'discussions' + discussion.id()}>\n <a href={app.route.discussion(discussion, mostRelevantPost && mostRelevantPost.number())} config={m.route}>\n <div className=\"DiscussionSearchResult-title\">{highlight(discussion.title(), query)}</div>\n {mostRelevantPost ? <div className=\"DiscussionSearchResult-excerpt\">{highlight(mostRelevantPost.contentPlain(), query, 100)}</div> : ''}\n </a>\n </li>\n );\n }),\n ];\n }\n}\n","import highlight from '../../common/helpers/highlight';\nimport avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\n\n/**\n * The `UsersSearchSource` finds and displays user search results in the search\n * dropdown.\n *\n * @implements SearchSource\n */\nexport default class UsersSearchResults {\n constructor() {\n this.results = {};\n }\n\n search(query) {\n return app.store\n .find('users', {\n filter: { q: query },\n page: { limit: 5 },\n })\n .then((results) => {\n this.results[query] = results;\n m.redraw();\n });\n }\n\n view(query) {\n query = query.toLowerCase();\n\n const results = (this.results[query] || [])\n .concat(\n app.store\n .all('users')\n .filter((user) => [user.username(), user.displayName()].some((value) => value.toLowerCase().substr(0, query.length) === query))\n )\n .filter((e, i, arr) => arr.lastIndexOf(e) === i)\n .sort((a, b) => a.displayName().localeCompare(b.displayName()));\n\n if (!results.length) return '';\n\n return [\n <li className=\"Dropdown-header\">{app.translator.trans('core.forum.search.users_heading')}</li>,\n results.map((user) => {\n const name = username(user);\n name.children[0] = highlight(name.children[0], query);\n\n return (\n <li className=\"UserSearchResult\" data-index={'users' + user.id()}>\n <a href={app.route.user(user)} config={m.route}>\n {avatar(user)}\n {name}\n </a>\n </li>\n );\n }),\n ];\n }\n}\n","import Component from '../../common/Component';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport ItemList from '../../common/utils/ItemList';\nimport classList from '../../common/utils/classList';\nimport extractText from '../../common/utils/extractText';\nimport KeyboardNavigatable from '../utils/KeyboardNavigatable';\nimport icon from '../../common/helpers/icon';\nimport DiscussionsSearchSource from './DiscussionsSearchSource';\nimport UsersSearchSource from './UsersSearchSource';\n\n/**\n * The `Search` component displays a menu of as-you-type results from a variety\n * of sources.\n *\n * The search box will be 'activated' if the app's seach state's\n * getInitialSearch() value is a truthy value. If this is the case, an 'x'\n * button will be shown next to the search field, and clicking it will clear the search.\n *\n * PROPS:\n *\n * - state: AlertState instance.\n */\nexport default class Search extends Component {\n init() {\n this.state = this.props.state;\n\n /**\n * Whether or not the search input has focus.\n *\n * @type {Boolean}\n */\n this.hasFocus = false;\n\n /**\n * An array of SearchSources.\n *\n * @type {SearchSource[]}\n */\n this.sources = null;\n\n /**\n * The number of sources that are still loading results.\n *\n * @type {Integer}\n */\n this.loadingSources = 0;\n\n /**\n * The index of the currently-selected <li> in the results list. This can be\n * a unique string (to account for the fact that an item's position may jump\n * around as new results load), but otherwise it will be numeric (the\n * sequential position within the list).\n *\n * @type {String|Integer}\n */\n this.index = 0;\n }\n\n view() {\n const currentSearch = this.state.getInitialSearch();\n\n // Initialize search sources in the view rather than the constructor so\n // that we have access to app.forum.\n if (!this.sources) {\n this.sources = this.sourceItems().toArray();\n }\n\n // Hide the search view if no sources were loaded\n if (!this.sources.length) return <div></div>;\n\n return (\n <div\n className={\n 'Search ' +\n classList({\n open: this.state.getValue() && this.hasFocus,\n focused: this.hasFocus,\n active: !!currentSearch,\n loading: !!this.loadingSources,\n })\n }\n >\n <div className=\"Search-input\">\n <input\n className=\"FormControl\"\n type=\"search\"\n placeholder={extractText(app.translator.trans('core.forum.header.search_placeholder'))}\n value={this.state.getValue()}\n oninput={m.withAttr('value', this.state.setValue.bind(this.state))}\n onfocus={() => (this.hasFocus = true)}\n onblur={() => (this.hasFocus = false)}\n />\n {this.loadingSources ? (\n LoadingIndicator.component({ size: 'tiny', className: 'Button Button--icon Button--link' })\n ) : currentSearch ? (\n <button className=\"Search-clear Button Button--icon Button--link\" onclick={this.clear.bind(this)}>\n {icon('fas fa-times-circle')}\n </button>\n ) : (\n ''\n )}\n </div>\n <ul className=\"Dropdown-menu Search-results\">\n {this.state.getValue() && this.hasFocus ? this.sources.map((source) => source.view(this.state.getValue())) : ''}\n </ul>\n </div>\n );\n }\n\n config(isInitialized) {\n // Highlight the item that is currently selected.\n this.setIndex(this.getCurrentNumericIndex());\n\n if (isInitialized) return;\n\n const search = this;\n const state = this.state;\n\n this.$('.Search-results')\n .on('mousedown', (e) => e.preventDefault())\n .on('click', () => this.$('input').blur())\n\n // Whenever the mouse is hovered over a search result, highlight it.\n .on('mouseenter', '> li:not(.Dropdown-header)', function () {\n search.setIndex(search.selectableItems().index(this));\n });\n\n const $input = this.$('input');\n\n this.navigator = new KeyboardNavigatable();\n this.navigator\n .onUp(() => this.setIndex(this.getCurrentNumericIndex() - 1, true))\n .onDown(() => this.setIndex(this.getCurrentNumericIndex() + 1, true))\n .onSelect(this.selectResult.bind(this))\n .onCancel(this.clear.bind(this))\n .bindTo($input);\n\n // Handle input key events on the search input, triggering results to load.\n $input\n .on('input focus', function () {\n const query = this.value.toLowerCase();\n\n if (!query) return;\n\n clearTimeout(search.searchTimeout);\n search.searchTimeout = setTimeout(() => {\n if (state.isCached(query)) return;\n\n if (query.length >= 3) {\n search.sources.map((source) => {\n if (!source.search) return;\n\n search.loadingSources++;\n\n source.search(query).then(() => {\n search.loadingSources = Math.max(0, search.loadingSources - 1);\n m.redraw();\n });\n });\n }\n\n state.cache(query);\n m.redraw();\n }, 250);\n })\n\n .on('focus', function () {\n $(this)\n .one('mouseup', (e) => e.preventDefault())\n .select();\n });\n }\n\n /**\n * Navigate to the currently selected search result and close the list.\n */\n selectResult() {\n clearTimeout(this.searchTimeout);\n this.loadingSources = 0;\n\n if (this.state.getValue()) {\n m.route(this.getItem(this.index).find('a').attr('href'));\n } else {\n this.clear();\n }\n\n this.$('input').blur();\n }\n\n /**\n * Clear the search\n */\n clear() {\n this.state.clear();\n }\n\n /**\n * Build an item list of SearchSources.\n *\n * @return {ItemList}\n */\n sourceItems() {\n const items = new ItemList();\n\n if (app.forum.attribute('canViewDiscussions')) items.add('discussions', new DiscussionsSearchSource());\n if (app.forum.attribute('canViewUserList')) items.add('users', new UsersSearchSource());\n\n return items;\n }\n\n /**\n * Get all of the search result items that are selectable.\n *\n * @return {jQuery}\n */\n selectableItems() {\n return this.$('.Search-results > li:not(.Dropdown-header)');\n }\n\n /**\n * Get the position of the currently selected search result item.\n *\n * @return {Integer}\n */\n getCurrentNumericIndex() {\n return this.selectableItems().index(this.getItem(this.index));\n }\n\n /**\n * Get the <li> in the search results with the given index (numeric or named).\n *\n * @param {String} index\n * @return {DOMElement}\n */\n getItem(index) {\n const $items = this.selectableItems();\n let $item = $items.filter(`[data-index=\"${index}\"]`);\n\n if (!$item.length) {\n $item = $items.eq(index);\n }\n\n return $item;\n }\n\n /**\n * Set the currently-selected search result item to the one with the given\n * index.\n *\n * @param {Integer} index\n * @param {Boolean} scrollToItem Whether or not to scroll the dropdown so that\n * the item is in view.\n */\n setIndex(index, scrollToItem) {\n const $items = this.selectableItems();\n const $dropdown = $items.parent();\n\n let fixedIndex = index;\n if (index < 0) {\n fixedIndex = $items.length - 1;\n } else if (index >= $items.length) {\n fixedIndex = 0;\n }\n\n const $item = $items.removeClass('active').eq(fixedIndex).addClass('active');\n\n this.index = $item.attr('data-index') || fixedIndex;\n\n if (scrollToItem) {\n const dropdownScroll = $dropdown.scrollTop();\n const dropdownTop = $dropdown.offset().top;\n const dropdownBottom = dropdownTop + $dropdown.outerHeight();\n const itemTop = $item.offset().top;\n const itemBottom = itemTop + $item.outerHeight();\n\n let scrollTop;\n if (itemTop < dropdownTop) {\n scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10);\n } else if (itemBottom > dropdownBottom) {\n scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10);\n }\n\n if (typeof scrollTop !== 'undefined') {\n $dropdown.stop(true).animate({ scrollTop }, 100);\n }\n }\n }\n}\n","import Component from '../../common/Component';\nimport Button from '../../common/components/Button';\nimport LogInModal from './LogInModal';\nimport SignUpModal from './SignUpModal';\nimport SessionDropdown from './SessionDropdown';\nimport SelectDropdown from '../../common/components/SelectDropdown';\nimport NotificationsDropdown from './NotificationsDropdown';\nimport ItemList from '../../common/utils/ItemList';\nimport listItems from '../../common/helpers/listItems';\nimport Search from '../components/Search';\n\n/**\n * The `HeaderSecondary` component displays secondary header controls, such as\n * the search box and the user menu. On the default skin, these are shown on the\n * right side of the header.\n */\nexport default class HeaderSecondary extends Component {\n view() {\n return <ul className=\"Header-controls\">{listItems(this.items().toArray())}</ul>;\n }\n\n config(isInitialized, context) {\n // Since this component is 'above' the content of the page (that is, it is a\n // part of the global UI that persists between routes), we will flag the DOM\n // to be retained across route changes.\n context.retain = true;\n }\n\n /**\n * Build an item list for the controls.\n *\n * @return {ItemList}\n */\n items() {\n const items = new ItemList();\n\n items.add('search', Search.component({ state: app.search }), 30);\n\n if (app.forum.attribute('showLanguageSelector') && Object.keys(app.data.locales).length > 1) {\n const locales = [];\n\n for (const locale in app.data.locales) {\n locales.push(\n Button.component({\n active: app.data.locale === locale,\n children: app.data.locales[locale],\n icon: app.data.locale === locale ? 'fas fa-check' : true,\n onclick: () => {\n if (app.session.user) {\n app.session.user.savePreferences({ locale }).then(() => window.location.reload());\n } else {\n document.cookie = `locale=${locale}; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT`;\n window.location.reload();\n }\n },\n })\n );\n }\n\n items.add(\n 'locale',\n SelectDropdown.component({\n children: locales,\n buttonClassName: 'Button Button--link',\n }),\n 20\n );\n }\n\n if (app.session.user) {\n items.add('notifications', NotificationsDropdown.component({ state: app.notifications }), 10);\n items.add('session', SessionDropdown.component(), 0);\n } else {\n if (app.forum.attribute('allowSignUp')) {\n items.add(\n 'signUp',\n Button.component({\n children: app.translator.trans('core.forum.header.sign_up_link'),\n className: 'Button Button--link',\n onclick: () => app.modal.show(new SignUpModal()),\n }),\n 10\n );\n }\n\n items.add(\n 'logIn',\n Button.component({\n children: app.translator.trans('core.forum.header.log_in_link'),\n className: 'Button Button--link',\n onclick: () => app.modal.show(new LogInModal()),\n }),\n 0\n );\n }\n\n return items;\n }\n}\n","import Button from '../../common/components/Button';\n\n/**\n * The `ComposerButton` component displays a button suitable for the composer\n * controls.\n */\nexport default class ComposerButton extends Button {\n static initProps(props) {\n super.initProps(props);\n\n props.className = props.className || 'Button Button--icon Button--link';\n }\n}\n","import Component from '../../common/Component';\nimport ItemList from '../../common/utils/ItemList';\nimport ComposerButton from './ComposerButton';\nimport listItems from '../../common/helpers/listItems';\nimport classList from '../../common/utils/classList';\n\n/**\n * The `Composer` component displays the composer. It can be loaded with a\n * content component with `load` and then its position/state can be altered with\n * `show`, `hide`, `close`, `minimize`, `fullScreen`, and `exitFullScreen`.\n */\nclass Composer extends Component {\n init() {\n /**\n * The composer's current position.\n *\n * @type {Composer.PositionEnum}\n */\n this.position = Composer.PositionEnum.HIDDEN;\n\n /**\n * The composer's intended height, which can be modified by the user\n * (by dragging the composer handle).\n *\n * @type {Integer}\n */\n this.height = null;\n\n /**\n * Whether or not the composer currently has focus.\n *\n * @type {Boolean}\n */\n this.active = false;\n }\n\n view() {\n const classes = {\n normal: this.position === Composer.PositionEnum.NORMAL,\n minimized: this.position === Composer.PositionEnum.MINIMIZED,\n fullScreen: this.position === Composer.PositionEnum.FULLSCREEN,\n active: this.active,\n };\n classes.visible = classes.normal || classes.minimized || classes.fullScreen;\n\n // If the composer is minimized, tell the composer's content component that\n // it shouldn't let the user interact with it. Set up a handler so that if\n // the content IS clicked, the composer will be shown.\n if (this.component) this.component.props.disabled = classes.minimized;\n\n const showIfMinimized = this.position === Composer.PositionEnum.MINIMIZED ? this.show.bind(this) : undefined;\n\n return (\n <div className={'Composer ' + classList(classes)}>\n <div className=\"Composer-handle\" config={this.configHandle.bind(this)} />\n <ul className=\"Composer-controls\">{listItems(this.controlItems().toArray())}</ul>\n <div className=\"Composer-content\" onclick={showIfMinimized}>\n {this.component ? this.component.render() : ''}\n </div>\n </div>\n );\n }\n\n config(isInitialized, context) {\n // Set the height of the Composer element and its contents on each redraw,\n // so that they do not lose it if their DOM elements are recreated.\n this.updateHeight();\n\n if (isInitialized) return;\n\n // Since this component is a part of the global UI that persists between\n // routes, we will flag the DOM to be retained across route changes.\n context.retain = true;\n\n this.initializeHeight();\n this.$().hide().css('bottom', -this.computedHeight());\n\n // Whenever any of the inputs inside the composer are have focus, we want to\n // add a class to the composer to draw attention to it.\n this.$().on('focus blur', ':input', (e) => {\n this.active = e.type === 'focusin';\n m.redraw();\n });\n\n // When the escape key is pressed on any inputs, close the composer.\n this.$().on('keydown', ':input', 'esc', () => this.close());\n\n // Don't let the user leave the page without first giving the composer's\n // component a chance to scream at the user to make sure they don't\n // unintentionally lose any contnet.\n window.onbeforeunload = () => {\n return (this.component && this.component.preventExit()) || undefined;\n };\n\n const handlers = {};\n\n $(window)\n .on('resize', (handlers.onresize = this.updateHeight.bind(this)))\n .resize();\n\n $(document)\n .on('mousemove', (handlers.onmousemove = this.onmousemove.bind(this)))\n .on('mouseup', (handlers.onmouseup = this.onmouseup.bind(this)));\n\n context.onunload = () => {\n $(window).off('resize', handlers.onresize);\n\n $(document).off('mousemove', handlers.onmousemove).off('mouseup', handlers.onmouseup);\n };\n }\n\n /**\n * Add the necessary event handlers to the composer's handle so that it can\n * be used to resize the composer.\n *\n * @param {DOMElement} element\n * @param {Boolean} isInitialized\n */\n configHandle(element, isInitialized) {\n if (isInitialized) return;\n\n const composer = this;\n\n $(element)\n .css('cursor', 'row-resize')\n .bind('dragstart mousedown', (e) => e.preventDefault())\n .mousedown(function (e) {\n composer.mouseStart = e.clientY;\n composer.heightStart = composer.$().height();\n composer.handle = $(this);\n $('body').css('cursor', 'row-resize');\n });\n }\n\n /**\n * Resize the composer according to mouse movement.\n *\n * @param {Event} e\n */\n onmousemove(e) {\n if (!this.handle) return;\n\n // Work out how much the mouse has been moved, and set the height\n // relative to the old one based on that. Then update the content's\n // height so that it fills the height of the composer, and update the\n // body's padding.\n const deltaPixels = this.mouseStart - e.clientY;\n this.changeHeight(this.heightStart + deltaPixels);\n\n // Update the body's padding-bottom so that no content on the page will ever\n // get permanently hidden behind the composer. If the user is already\n // scrolled to the bottom of the page, then we will keep them scrolled to\n // the bottom after the padding has been updated.\n const scrollTop = $(window).scrollTop();\n const anchorToBottom = scrollTop > 0 && scrollTop + $(window).height() >= $(document).height();\n this.updateBodyPadding(anchorToBottom);\n }\n\n /**\n * Finish resizing the composer when the mouse is released.\n */\n onmouseup() {\n if (!this.handle) return;\n\n this.handle = null;\n $('body').css('cursor', '');\n }\n\n /**\n * Update the DOM to reflect the composer's current height. This involves\n * setting the height of the composer's root element, and adjusting the height\n * of any flexible elements inside the composer's body.\n */\n updateHeight() {\n const height = this.computedHeight();\n const $flexible = this.$('.Composer-flexible');\n\n this.$().height(height);\n\n if ($flexible.length) {\n const headerHeight = $flexible.offset().top - this.$().offset().top;\n const paddingBottom = parseInt($flexible.css('padding-bottom'), 10);\n const footerHeight = this.$('.Composer-footer').outerHeight(true);\n\n $flexible.height(this.$().outerHeight() - headerHeight - paddingBottom - footerHeight);\n }\n }\n\n /**\n * Update the amount of padding-bottom on the body so that the page's\n * content will still be visible above the composer when the page is\n * scrolled right to the bottom.\n */\n updateBodyPadding() {\n const visible =\n this.position !== Composer.PositionEnum.HIDDEN && this.position !== Composer.PositionEnum.MINIMIZED && this.$().css('position') !== 'absolute';\n\n const paddingBottom = visible ? this.computedHeight() - parseInt($('#app').css('padding-bottom'), 10) : 0;\n\n $('#content').css({ paddingBottom });\n }\n\n /**\n * Determine whether or not the Composer is covering the screen.\n *\n * This will be true if the Composer is in full-screen mode on desktop, or\n * if the Composer is positioned absolutely as on mobile devices.\n *\n * @return {Boolean}\n * @public\n */\n isFullScreen() {\n return this.position === Composer.PositionEnum.FULLSCREEN || this.$().css('position') === 'absolute';\n }\n\n /**\n * Confirm with the user that they want to close the composer and lose their\n * content.\n *\n * @return {Boolean} Whether or not the exit was cancelled.\n */\n preventExit() {\n if (this.component) {\n const preventExit = this.component.preventExit();\n\n if (preventExit) {\n return !confirm(preventExit);\n }\n }\n }\n\n /**\n * Load a content component into the composer.\n *\n * @param {Component} component\n * @public\n */\n load(component) {\n if (this.preventExit()) return;\n\n // If we load a similar component into the composer, then Mithril will be\n // able to diff the old/new contents and some DOM-related state from the\n // old composer will remain. To prevent this from happening, we clear the\n // component and force a redraw, so that the new component will be working\n // on a blank slate.\n if (this.component) {\n this.clear();\n m.redraw(true);\n }\n\n this.component = component;\n }\n\n /**\n * Clear the composer's content component.\n *\n * @public\n */\n clear() {\n this.component = null;\n }\n\n /**\n * Animate the Composer into the given position.\n *\n * @param {Composer.PositionEnum} position\n */\n animateToPosition(position) {\n // Before we redraw the composer to its new state, we need to save the\n // current height of the composer, as well as the page's scroll position, so\n // that we can smoothly transition from the old to the new state.\n const oldPosition = this.position;\n const $composer = this.$().stop(true);\n const oldHeight = $composer.outerHeight();\n const scrollTop = $(window).scrollTop();\n\n this.position = position;\n\n m.redraw(true);\n\n // Now that we've redrawn and the composer's DOM has been updated, we want\n // to update the composer's height. Once we've done that, we'll capture the\n // real value to use as the end point for our animation later on.\n $composer.show();\n this.updateHeight();\n\n const newHeight = $composer.outerHeight();\n\n if (oldPosition === Composer.PositionEnum.HIDDEN) {\n $composer.css({ bottom: -newHeight, height: newHeight });\n } else {\n $composer.css({ height: oldHeight });\n }\n\n $composer.animate({ bottom: 0, height: newHeight }, 'fast', () => this.component.focus());\n\n this.updateBodyPadding();\n $(window).scrollTop(scrollTop);\n }\n\n /**\n * Show the Composer backdrop.\n */\n showBackdrop() {\n this.$backdrop = $('<div/>').addClass('composer-backdrop').appendTo('body');\n }\n\n /**\n * Hide the Composer backdrop.\n */\n hideBackdrop() {\n if (this.$backdrop) this.$backdrop.remove();\n }\n\n /**\n * Show the composer.\n *\n * @public\n */\n show() {\n if (this.position === Composer.PositionEnum.NORMAL || this.position === Composer.PositionEnum.FULLSCREEN) {\n return;\n }\n\n this.animateToPosition(Composer.PositionEnum.NORMAL);\n\n if (this.isFullScreen()) {\n this.$().css('top', $(window).scrollTop());\n this.showBackdrop();\n this.component.focus();\n }\n }\n\n /**\n * Close the composer.\n *\n * @public\n */\n hide() {\n const $composer = this.$();\n\n // Animate the composer sliding down off the bottom edge of the viewport.\n // Only when the animation is completed, update the Composer state flag and\n // other elements on the page.\n $composer.stop(true).animate({ bottom: -$composer.height() }, 'fast', () => {\n this.position = Composer.PositionEnum.HIDDEN;\n this.clear();\n m.redraw();\n\n $composer.hide();\n this.hideBackdrop();\n this.updateBodyPadding();\n });\n }\n\n /**\n * Confirm with the user so they don't lose their content, then close the\n * composer.\n *\n * @public\n */\n close() {\n if (!this.preventExit()) {\n this.hide();\n }\n }\n\n /**\n * Minimize the composer. Has no effect if the composer is hidden.\n *\n * @public\n */\n minimize() {\n if (this.position === Composer.PositionEnum.HIDDEN) return;\n\n this.animateToPosition(Composer.PositionEnum.MINIMIZED);\n\n this.$().css('top', 'auto');\n this.hideBackdrop();\n }\n\n /**\n * Take the composer into fullscreen mode. Has no effect if the composer is\n * hidden.\n *\n * @public\n */\n fullScreen() {\n if (this.position !== Composer.PositionEnum.HIDDEN) {\n this.position = Composer.PositionEnum.FULLSCREEN;\n m.redraw();\n this.updateHeight();\n this.component.focus();\n }\n }\n\n /**\n * Exit fullscreen mode.\n *\n * @public\n */\n exitFullScreen() {\n if (this.position === Composer.PositionEnum.FULLSCREEN) {\n this.position = Composer.PositionEnum.NORMAL;\n m.redraw();\n this.updateHeight();\n this.component.focus();\n }\n }\n\n /**\n * Build an item list for the composer's controls.\n *\n * @return {ItemList}\n */\n controlItems() {\n const items = new ItemList();\n\n if (this.position === Composer.PositionEnum.FULLSCREEN) {\n items.add(\n 'exitFullScreen',\n ComposerButton.component({\n icon: 'fas fa-compress',\n title: app.translator.trans('core.forum.composer.exit_full_screen_tooltip'),\n onclick: this.exitFullScreen.bind(this),\n })\n );\n } else {\n if (this.position !== Composer.PositionEnum.MINIMIZED) {\n items.add(\n 'minimize',\n ComposerButton.component({\n icon: 'fas fa-minus minimize',\n title: app.translator.trans('core.forum.composer.minimize_tooltip'),\n onclick: this.minimize.bind(this),\n itemClassName: 'App-backControl',\n })\n );\n\n items.add(\n 'fullScreen',\n ComposerButton.component({\n icon: 'fas fa-expand',\n title: app.translator.trans('core.forum.composer.full_screen_tooltip'),\n onclick: this.fullScreen.bind(this),\n })\n );\n }\n\n items.add(\n 'close',\n ComposerButton.component({\n icon: 'fas fa-times',\n title: app.translator.trans('core.forum.composer.close_tooltip'),\n onclick: this.close.bind(this),\n })\n );\n }\n\n return items;\n }\n\n /**\n * Initialize default Composer height.\n */\n initializeHeight() {\n this.height = localStorage.getItem('composerHeight');\n\n if (!this.height) {\n this.height = this.defaultHeight();\n }\n }\n\n /**\n * Default height of the Composer in case none is saved.\n * @returns {Integer}\n */\n defaultHeight() {\n return this.$().height();\n }\n\n /**\n * Minimum height of the Composer.\n * @returns {Integer}\n */\n minimumHeight() {\n return 200;\n }\n\n /**\n * Maxmimum height of the Composer.\n * @returns {Integer}\n */\n maximumHeight() {\n return $(window).height() - $('#header').outerHeight();\n }\n\n /**\n * Computed the composer's current height, based on the intended height, and\n * the composer's current state. This will be applied to the composer's\n * content's DOM element.\n * @returns {Integer|String}\n */\n computedHeight() {\n // If the composer is minimized, then we don't want to set a height; we'll\n // let the CSS decide how high it is. If it's fullscreen, then we need to\n // make it as high as the window.\n if (this.position === Composer.PositionEnum.MINIMIZED) {\n return '';\n } else if (this.position === Composer.PositionEnum.FULLSCREEN) {\n return $(window).height();\n }\n\n // Otherwise, if it's normal or hidden, then we use the intended height.\n // We don't let the composer get too small or too big, though.\n return Math.max(this.minimumHeight(), Math.min(this.height, this.maximumHeight()));\n }\n\n /**\n * Save a new Composer height and update the DOM.\n * @param {Integer} height\n */\n changeHeight(height) {\n this.height = height;\n this.updateHeight();\n\n localStorage.setItem('composerHeight', this.height);\n }\n}\n\nComposer.PositionEnum = {\n HIDDEN: 'hidden',\n NORMAL: 'normal',\n MINIMIZED: 'minimized',\n FULLSCREEN: 'fullScreen',\n};\n\nexport default Composer;\n","import Component from '../../common/Component';\nimport avatar from '../../common/helpers/avatar';\nimport icon from '../../common/helpers/icon';\nimport humanTime from '../../common/helpers/humanTime';\nimport Button from '../../common/components/Button';\n\n/**\n * The `Notification` component abstract displays a single notification.\n * Subclasses should implement the `icon`, `href`, and `content` methods.\n *\n * ### Props\n *\n * - `notification`\n *\n * @abstract\n */\nexport default class Notification extends Component {\n view() {\n const notification = this.props.notification;\n const href = this.href();\n\n return (\n <a\n className={'Notification Notification--' + notification.contentType() + ' ' + (!notification.isRead() ? 'unread' : '')}\n href={href}\n config={function (element, isInitialized) {\n if (href.indexOf('://') === -1) m.route.apply(this, arguments);\n\n if (!isInitialized) $(element).click(this.markAsRead.bind(this));\n }}\n >\n {!notification.isRead() &&\n Button.component({\n className: 'Notification-action Button Button--icon Button--link',\n icon: 'fas fa-check',\n title: app.translator.trans('core.forum.notifications.mark_as_read_tooltip'),\n onclick: (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n this.markAsRead();\n },\n })}\n {avatar(notification.fromUser())}\n {icon(this.icon(), { className: 'Notification-icon' })}\n <span className=\"Notification-content\">{this.content()}</span>\n {humanTime(notification.createdAt())}\n <div className=\"Notification-excerpt\">{this.excerpt()}</div>\n </a>\n );\n }\n\n /**\n * Get the name of the icon that should be displayed in the notification.\n *\n * @return {String}\n * @abstract\n */\n icon() {}\n\n /**\n * Get the URL that the notification should link to.\n *\n * @return {String}\n * @abstract\n */\n href() {}\n\n /**\n * Get the content of the notification.\n *\n * @return {VirtualElement}\n * @abstract\n */\n content() {}\n\n /**\n * Get the excerpt of the notification.\n *\n * @return {VirtualElement}\n * @abstract\n */\n excerpt() {}\n\n /**\n * Mark the notification as read.\n */\n markAsRead() {\n if (this.props.notification.isRead()) return;\n\n app.session.user.pushAttributes({ unreadNotificationCount: app.session.user.unreadNotificationCount() - 1 });\n\n this.props.notification.save({ isRead: true });\n }\n}\n","import Notification from './Notification';\n\n/**\n * The `DiscussionRenamedNotification` component displays a notification which\n * indicates that a discussion has had its title changed.\n *\n * ### Props\n *\n * - All of the props for Notification\n */\nexport default class DiscussionRenamedNotification extends Notification {\n icon() {\n return 'fas fa-pencil-alt';\n }\n\n href() {\n const notification = this.props.notification;\n\n return app.route.discussion(notification.subject(), notification.content().postNumber);\n }\n\n content() {\n return app.translator.trans('core.forum.notifications.discussion_renamed_text', { user: this.props.notification.fromUser() });\n }\n}\n","import ComposerBody from './ComposerBody';\nimport Alert from '../../common/components/Alert';\nimport Button from '../../common/components/Button';\nimport icon from '../../common/helpers/icon';\n\nfunction minimizeComposerIfFullScreen(e) {\n if (app.composer.isFullScreen()) {\n app.composer.minimize();\n e.stopPropagation();\n }\n}\n\n/**\n * The `EditPostComposer` component displays the composer content for editing a\n * post. It sets the initial content to the content of the post that is being\n * edited, and adds a header control to indicate which post is being edited.\n *\n * ### Props\n *\n * - All of the props for ComposerBody\n * - `post`\n */\nexport default class EditPostComposer extends ComposerBody {\n init() {\n super.init();\n\n this.editor.props.preview = (e) => {\n minimizeComposerIfFullScreen(e);\n\n m.route(app.route.post(this.props.post));\n };\n }\n\n static initProps(props) {\n super.initProps(props);\n\n props.submitLabel = props.submitLabel || app.translator.trans('core.forum.composer_edit.submit_button');\n props.confirmExit = props.confirmExit || app.translator.trans('core.forum.composer_edit.discard_confirmation');\n props.originalContent = props.originalContent || props.post.content();\n props.user = props.user || props.post.user();\n\n props.post.editedContent = props.originalContent;\n }\n\n headerItems() {\n const items = super.headerItems();\n const post = this.props.post;\n\n const routeAndMinimize = function (element, isInitialized) {\n if (isInitialized) return;\n $(element).on('click', minimizeComposerIfFullScreen);\n m.route.apply(this, arguments);\n };\n\n items.add(\n 'title',\n <h3>\n {icon('fas fa-pencil-alt')}{' '}\n <a href={app.route.discussion(post.discussion(), post.number())} config={routeAndMinimize}>\n {app.translator.trans('core.forum.composer_edit.post_link', { number: post.number(), discussion: post.discussion().title() })}\n </a>\n </h3>\n );\n\n return items;\n }\n\n /**\n * Get the data to submit to the server when the post is saved.\n *\n * @return {Object}\n */\n data() {\n return {\n content: this.content(),\n };\n }\n\n onsubmit() {\n const discussion = this.props.post.discussion();\n\n this.loading = true;\n\n const data = this.data();\n\n this.props.post.save(data).then((post) => {\n // If we're currently viewing the discussion which this edit was made\n // in, then we can scroll to the post.\n if (app.viewingDiscussion(discussion)) {\n app.current.stream.goToNumber(post.number());\n } else {\n // Otherwise, we'll create an alert message to inform the user that\n // their edit has been made, containing a button which will\n // transition to their edited post when clicked.\n let alert;\n const viewButton = Button.component({\n className: 'Button Button--link',\n children: app.translator.trans('core.forum.composer_edit.view_button'),\n onclick: () => {\n m.route(app.route.post(post));\n app.alerts.dismiss(alert);\n },\n });\n app.alerts.show(\n (alert = new Alert({\n type: 'success',\n children: app.translator.trans('core.forum.composer_edit.edited_message'),\n controls: [viewButton],\n }))\n );\n }\n\n app.composer.hide();\n }, this.loaded.bind(this));\n }\n}\n","import EditPostComposer from '../components/EditPostComposer';\nimport Button from '../../common/components/Button';\nimport Separator from '../../common/components/Separator';\nimport ItemList from '../../common/utils/ItemList';\nimport extractText from '../../common/utils/extractText';\n\n/**\n * The `PostControls` utility constructs a list of buttons for a post which\n * perform actions on it.\n */\nexport default {\n /**\n * Get a list of controls for a post.\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @public\n */\n controls(post, context) {\n const items = new ItemList();\n\n ['user', 'moderation', 'destructive'].forEach((section) => {\n const controls = this[section + 'Controls'](post, context).toArray();\n if (controls.length) {\n controls.forEach((item) => items.add(item.itemName, item));\n items.add(section + 'Separator', Separator.component());\n }\n });\n\n return items;\n },\n\n /**\n * Get controls for a post pertaining to the current user (e.g. report).\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @protected\n */\n userControls(post, context) {\n return new ItemList();\n },\n\n /**\n * Get controls for a post pertaining to moderation (e.g. edit).\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @protected\n */\n moderationControls(post, context) {\n const items = new ItemList();\n\n if (post.contentType() === 'comment' && post.canEdit()) {\n if (!post.isHidden()) {\n items.add(\n 'edit',\n Button.component({\n icon: 'fas fa-pencil-alt',\n children: app.translator.trans('core.forum.post_controls.edit_button'),\n onclick: this.editAction.bind(post),\n })\n );\n }\n }\n\n return items;\n },\n\n /**\n * Get controls for a post that are destructive (e.g. delete).\n *\n * @param {Post} post\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @protected\n */\n destructiveControls(post, context) {\n const items = new ItemList();\n\n if (post.contentType() === 'comment' && !post.isHidden()) {\n if (post.canHide()) {\n items.add(\n 'hide',\n Button.component({\n icon: 'far fa-trash-alt',\n children: app.translator.trans('core.forum.post_controls.delete_button'),\n onclick: this.hideAction.bind(post),\n })\n );\n }\n } else {\n if (post.contentType() === 'comment' && post.canHide()) {\n items.add(\n 'restore',\n Button.component({\n icon: 'fas fa-reply',\n children: app.translator.trans('core.forum.post_controls.restore_button'),\n onclick: this.restoreAction.bind(post),\n })\n );\n }\n if (post.canDelete()) {\n items.add(\n 'delete',\n Button.component({\n icon: 'fas fa-times',\n children: app.translator.trans('core.forum.post_controls.delete_forever_button'),\n onclick: this.deleteAction.bind(post, context),\n })\n );\n }\n }\n\n return items;\n },\n\n /**\n * Open the composer to edit a post.\n *\n * @return {Promise}\n */\n editAction() {\n const deferred = m.deferred();\n\n const component = new EditPostComposer({ post: this });\n\n app.composer.load(component);\n app.composer.show();\n\n deferred.resolve(component);\n\n return deferred.promise;\n },\n\n /**\n * Hide a post.\n *\n * @return {Promise}\n */\n hideAction() {\n if (!confirm(extractText(app.translator.trans('core.forum.post_controls.hide_confirmation')))) return;\n this.pushAttributes({ hiddenAt: new Date(), hiddenUser: app.session.user });\n\n return this.save({ isHidden: true }).then(() => m.redraw());\n },\n\n /**\n * Restore a post.\n *\n * @return {Promise}\n */\n restoreAction() {\n this.pushAttributes({ hiddenAt: null, hiddenUser: null });\n\n return this.save({ isHidden: false }).then(() => m.redraw());\n },\n\n /**\n * Delete a post.\n *\n * @return {Promise}\n */\n deleteAction(context) {\n if (!confirm(extractText(app.translator.trans('core.forum.post_controls.delete_confirmation')))) return;\n if (context) context.loading = true;\n\n return this.delete()\n .then(() => {\n const discussion = this.discussion();\n\n discussion.removePost(this.id());\n\n // If this was the last post in the discussion, then we will assume that\n // the whole discussion was deleted too.\n if (!discussion.postIds().length) {\n app.discussions.removeDiscussion(discussion);\n\n if (app.viewingDiscussion(discussion)) {\n app.history.back();\n }\n }\n })\n .catch(() => {})\n .then(() => {\n if (context) context.loading = false;\n m.redraw();\n });\n },\n};\n","import Component from '../../common/Component';\nimport SubtreeRetainer from '../../common/utils/SubtreeRetainer';\nimport Dropdown from '../../common/components/Dropdown';\nimport PostControls from '../utils/PostControls';\nimport listItems from '../../common/helpers/listItems';\nimport ItemList from '../../common/utils/ItemList';\n\n/**\n * The `Post` component displays a single post. The basic post template just\n * includes a controls dropdown; subclasses must implement `content` and `attrs`\n * methods.\n *\n * ### Props\n *\n * - `post`\n *\n * @abstract\n */\nexport default class Post extends Component {\n init() {\n this.loading = false;\n\n /**\n * Set up a subtree retainer so that the post will not be redrawn\n * unless new data comes in.\n *\n * @type {SubtreeRetainer}\n */\n this.subtree = new SubtreeRetainer(\n () => this.props.post.freshness,\n () => {\n const user = this.props.post.user();\n return user && user.freshness;\n },\n () => this.controlsOpen\n );\n }\n\n view() {\n const attrs = this.attrs();\n\n attrs.className = this.classes(attrs.className).join(' ');\n\n return (\n <article {...attrs}>\n {this.subtree.retain() ||\n (() => {\n const controls = PostControls.controls(this.props.post, this).toArray();\n\n return (\n <div>\n {this.content()}\n <aside className=\"Post-actions\">\n <ul>\n {listItems(this.actionItems().toArray())}\n {controls.length ? (\n <li>\n <Dropdown\n className=\"Post-controls\"\n buttonClassName=\"Button Button--icon Button--flat\"\n menuClassName=\"Dropdown-menu--right\"\n icon=\"fas fa-ellipsis-h\"\n onshow={() => this.$('.Post-actions').addClass('open')}\n onhide={() => this.$('.Post-actions').removeClass('open')}\n >\n {controls}\n </Dropdown>\n </li>\n ) : (\n ''\n )}\n </ul>\n </aside>\n <footer className=\"Post-footer\">\n <ul>{listItems(this.footerItems().toArray())}</ul>\n </footer>\n </div>\n );\n })()}\n </article>\n );\n }\n\n config(isInitialized) {\n const $actions = this.$('.Post-actions');\n const $controls = this.$('.Post-controls');\n\n $actions.toggleClass('open', $controls.hasClass('open'));\n }\n\n /**\n * Get attributes for the post element.\n *\n * @return {Object}\n */\n attrs() {\n return {};\n }\n\n /**\n * Get the post's content.\n *\n * @return {Array}\n */\n content() {\n return [];\n }\n\n /**\n * Get the post's classes.\n *\n * @param string classes\n * @returns {string[]}\n */\n classes(existing) {\n let classes = (existing || '').split(' ').concat(['Post']);\n\n const user = this.props.post.user();\n const discussion = this.props.post.discussion();\n\n if (this.loading) {\n classes.push('Post--loading');\n }\n\n if (user && user === app.session.user) {\n classes.push('Post--by-actor');\n }\n\n if (user && user === discussion.user()) {\n classes.push('Post--by-start-user');\n }\n\n return classes;\n }\n\n /**\n * Build an item list for the post's actions.\n *\n * @return {ItemList}\n */\n actionItems() {\n return new ItemList();\n }\n\n /**\n * Build an item list for the post's footer.\n *\n * @return {ItemList}\n */\n footerItems() {\n return new ItemList();\n }\n}\n","import Modal from '../../common/components/Modal';\nimport Button from '../../common/components/Button';\nimport GroupBadge from '../../common/components/GroupBadge';\nimport Group from '../../common/models/Group';\nimport extractText from '../../common/utils/extractText';\nimport ItemList from '../../common/utils/ItemList';\n\n/**\n * The `EditUserModal` component displays a modal dialog with a login form.\n */\nexport default class EditUserModal extends Modal {\n init() {\n super.init();\n\n const user = this.props.user;\n\n this.username = m.prop(user.username() || '');\n this.email = m.prop(user.email() || '');\n this.isEmailConfirmed = m.prop(user.isEmailConfirmed() || false);\n this.setPassword = m.prop(false);\n this.password = m.prop(user.password() || '');\n this.groups = {};\n\n app.store\n .all('groups')\n .filter((group) => [Group.GUEST_ID, Group.MEMBER_ID].indexOf(group.id()) === -1)\n .forEach((group) => (this.groups[group.id()] = m.prop(user.groups().indexOf(group) !== -1)));\n }\n\n className() {\n return 'EditUserModal Modal--small';\n }\n\n title() {\n return app.translator.trans('core.forum.edit_user.title');\n }\n\n content() {\n return (\n <div className=\"Modal-body\">\n <div className=\"Form\">{this.fields().toArray()}</div>\n </div>\n );\n }\n\n fields() {\n const items = new ItemList();\n\n items.add(\n 'username',\n <div className=\"Form-group\">\n <label>{app.translator.trans('core.forum.edit_user.username_heading')}</label>\n <input className=\"FormControl\" placeholder={extractText(app.translator.trans('core.forum.edit_user.username_label'))} bidi={this.username} />\n </div>,\n 40\n );\n\n if (app.session.user !== this.props.user) {\n items.add(\n 'email',\n <div className=\"Form-group\">\n <label>{app.translator.trans('core.forum.edit_user.email_heading')}</label>\n <div>\n <input className=\"FormControl\" placeholder={extractText(app.translator.trans('core.forum.edit_user.email_label'))} bidi={this.email} />\n </div>\n {!this.isEmailConfirmed() ? (\n <div>\n {Button.component({\n className: 'Button Button--block',\n children: app.translator.trans('core.forum.edit_user.activate_button'),\n loading: this.loading,\n onclick: this.activate.bind(this),\n })}\n </div>\n ) : (\n ''\n )}\n </div>,\n 30\n );\n\n items.add(\n 'password',\n <div className=\"Form-group\">\n <label>{app.translator.trans('core.forum.edit_user.password_heading')}</label>\n <div>\n <label className=\"checkbox\">\n <input\n type=\"checkbox\"\n onchange={(e) => {\n this.setPassword(e.target.checked);\n m.redraw(true);\n if (e.target.checked) this.$('[name=password]').select();\n m.redraw.strategy('none');\n }}\n />\n {app.translator.trans('core.forum.edit_user.set_password_label')}\n </label>\n {this.setPassword() ? (\n <input\n className=\"FormControl\"\n type=\"password\"\n name=\"password\"\n placeholder={extractText(app.translator.trans('core.forum.edit_user.password_label'))}\n bidi={this.password}\n />\n ) : (\n ''\n )}\n </div>\n </div>,\n 20\n );\n }\n\n items.add(\n 'groups',\n <div className=\"Form-group EditUserModal-groups\">\n <label>{app.translator.trans('core.forum.edit_user.groups_heading')}</label>\n <div>\n {Object.keys(this.groups)\n .map((id) => app.store.getById('groups', id))\n .map((group) => (\n <label className=\"checkbox\">\n <input\n type=\"checkbox\"\n bidi={this.groups[group.id()]}\n disabled={this.props.user.id() === '1' && group.id() === Group.ADMINISTRATOR_ID}\n />\n {GroupBadge.component({ group, label: '' })} {group.nameSingular()}\n </label>\n ))}\n </div>\n </div>,\n 10\n );\n\n items.add(\n 'submit',\n <div className=\"Form-group\">\n {Button.component({\n className: 'Button Button--primary',\n type: 'submit',\n loading: this.loading,\n children: app.translator.trans('core.forum.edit_user.submit_button'),\n })}\n </div>,\n -10\n );\n\n return items;\n }\n\n activate() {\n this.loading = true;\n const data = {\n username: this.username(),\n isEmailConfirmed: true,\n };\n this.props.user\n .save(data, { errorHandler: this.onerror.bind(this) })\n .then(() => {\n this.isEmailConfirmed(true);\n this.loading = false;\n m.redraw();\n })\n .catch(() => {\n this.loading = false;\n m.redraw();\n });\n }\n\n data() {\n const groups = Object.keys(this.groups)\n .filter((id) => this.groups[id]())\n .map((id) => app.store.getById('groups', id));\n\n const data = {\n username: this.username(),\n relationships: { groups },\n };\n\n if (app.session.user !== this.props.user) {\n data.email = this.email();\n }\n\n if (this.setPassword()) {\n data.password = this.password();\n }\n\n return data;\n }\n\n onsubmit(e) {\n e.preventDefault();\n\n this.loading = true;\n\n this.props.user\n .save(this.data(), { errorHandler: this.onerror.bind(this) })\n .then(this.hide.bind(this))\n .catch(() => {\n this.loading = false;\n m.redraw();\n });\n }\n}\n","/**\n * Setup the sidebar DOM element to be affixed to the top of the viewport\n * using Bootstrap's affix plugin.\n *\n * @param {DOMElement} element\n * @param {Boolean} isInitialized\n * @param {Object} context\n */\nexport default function affixSidebar(element, isInitialized, context) {\n if (isInitialized) return;\n\n const onresize = () => {\n const $sidebar = $(element);\n const $header = $('#header');\n const $footer = $('#footer');\n const $affixElement = $sidebar.find('> ul');\n\n $(window).off('.affix');\n $affixElement.removeClass('affix affix-top affix-bottom').removeData('bs.affix');\n\n // Don't affix the sidebar if it is taller than the viewport (otherwise\n // there would be no way to scroll through its content).\n if ($sidebar.outerHeight(true) > $(window).height() - $header.outerHeight(true)) return;\n\n $affixElement.affix({\n offset: {\n top: () => $sidebar.offset().top - $header.outerHeight(true) - parseInt($sidebar.css('margin-top'), 10),\n bottom: () => (this.bottom = $footer.outerHeight(true)),\n },\n });\n };\n\n // Register the affix plugin to execute on every window resize (and trigger)\n $(window).on('resize', onresize).resize();\n\n context.onunload = () => {\n $(window).off('resize', onresize);\n };\n}\n","import Page from '../../common/components/Page';\nimport ItemList from '../../common/utils/ItemList';\nimport affixSidebar from '../utils/affixSidebar';\nimport UserCard from './UserCard';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport SelectDropdown from '../../common/components/SelectDropdown';\nimport LinkButton from '../../common/components/LinkButton';\nimport Separator from '../../common/components/Separator';\nimport listItems from '../../common/helpers/listItems';\n\n/**\n * The `UserPage` component shows a user's profile. It can be extended to show\n * content inside of the content area. See `ActivityPage` and `SettingsPage` for\n * examples.\n *\n * @abstract\n */\nexport default class UserPage extends Page {\n init() {\n super.init();\n\n /**\n * The user this page is for.\n *\n * @type {User}\n */\n this.user = null;\n\n this.bodyClass = 'App--user';\n }\n\n view() {\n return (\n <div className=\"UserPage\">\n {this.user\n ? [\n UserCard.component({\n user: this.user,\n className: 'Hero UserHero',\n editable: this.user.canEdit() || this.user === app.session.user,\n controlsButtonClassName: 'Button',\n }),\n <div className=\"container\">\n <div className=\"sideNavContainer\">\n <nav className=\"sideNav UserPage-nav\" config={affixSidebar}>\n <ul>{listItems(this.sidebarItems().toArray())}</ul>\n </nav>\n <div className=\"sideNavOffset UserPage-content\">{this.content()}</div>\n </div>\n </div>,\n ]\n : [LoadingIndicator.component({ className: 'LoadingIndicator--block' })]}\n </div>\n );\n }\n\n /**\n * Get the content to display in the user page.\n *\n * @return {VirtualElement}\n */\n content() {}\n\n /**\n * Initialize the component with a user, and trigger the loading of their\n * activity feed.\n *\n * @param {User} user\n * @protected\n */\n show(user) {\n this.user = user;\n\n app.current.set('user', user);\n\n app.setTitle(user.displayName());\n\n m.redraw();\n }\n\n /**\n * Given a username, load the user's profile from the store, or make a request\n * if we don't have it yet. Then initialize the profile page with that user.\n *\n * @param {String} username\n */\n loadUser(username) {\n const lowercaseUsername = username.toLowerCase();\n\n // Load the preloaded user object, if any, into the global app store\n // We don't use the output of the method because it returns raw JSON\n // instead of the parsed models\n app.preloadedApiDocument();\n\n app.store.all('users').some((user) => {\n if ((user.username().toLowerCase() === lowercaseUsername || user.id() === username) && user.joinTime()) {\n this.show(user);\n return true;\n }\n });\n\n if (!this.user) {\n app.store.find('users', username).then(this.show.bind(this));\n }\n }\n\n /**\n * Build an item list for the content of the sidebar.\n *\n * @return {ItemList}\n */\n sidebarItems() {\n const items = new ItemList();\n\n items.add(\n 'nav',\n SelectDropdown.component({\n children: this.navItems().toArray(),\n className: 'App-titleControl',\n buttonClassName: 'Button',\n })\n );\n\n return items;\n }\n\n /**\n * Build an item list for the navigation in the sidebar.\n *\n * @return {ItemList}\n */\n navItems() {\n const items = new ItemList();\n const user = this.user;\n\n items.add(\n 'posts',\n LinkButton.component({\n href: app.route('user.posts', { username: user.username() }),\n children: [app.translator.trans('core.forum.user.posts_link'), <span className=\"Button-badge\">{user.commentCount()}</span>],\n icon: 'far fa-comment',\n }),\n 100\n );\n\n items.add(\n 'discussions',\n LinkButton.component({\n href: app.route('user.discussions', { username: user.username() }),\n children: [app.translator.trans('core.forum.user.discussions_link'), <span className=\"Button-badge\">{user.discussionCount()}</span>],\n icon: 'fas fa-bars',\n }),\n 90\n );\n\n if (app.session.user === user) {\n items.add('separator', Separator.component(), -90);\n items.add(\n 'settings',\n LinkButton.component({\n href: app.route('settings'),\n children: app.translator.trans('core.forum.user.settings_link'),\n icon: 'fas fa-cog',\n }),\n -100\n );\n }\n\n return items;\n }\n}\n","import Alert from '../../common/components/Alert';\nimport Button from '../../common/components/Button';\nimport Separator from '../../common/components/Separator';\nimport EditUserModal from '../components/EditUserModal';\nimport UserPage from '../components/UserPage';\nimport ItemList from '../../common/utils/ItemList';\n\n/**\n * The `UserControls` utility constructs a list of buttons for a user which\n * perform actions on it.\n */\nexport default {\n /**\n * Get a list of controls for a user.\n *\n * @param {User} user\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @public\n */\n controls(user, context) {\n const items = new ItemList();\n\n ['user', 'moderation', 'destructive'].forEach((section) => {\n const controls = this[section + 'Controls'](user, context).toArray();\n if (controls.length) {\n controls.forEach((item) => items.add(item.itemName, item));\n items.add(section + 'Separator', Separator.component());\n }\n });\n\n return items;\n },\n\n /**\n * Get controls for a user pertaining to the current user (e.g. poke, follow).\n *\n * @param {User} user\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @protected\n */\n userControls() {\n return new ItemList();\n },\n\n /**\n * Get controls for a user pertaining to moderation (e.g. suspend, edit).\n *\n * @param {User} user\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @protected\n */\n moderationControls(user) {\n const items = new ItemList();\n\n if (user.canEdit()) {\n items.add(\n 'edit',\n Button.component({\n icon: 'fas fa-pencil-alt',\n children: app.translator.trans('core.forum.user_controls.edit_button'),\n onclick: this.editAction.bind(this, user),\n })\n );\n }\n\n return items;\n },\n\n /**\n * Get controls for a user which are destructive (e.g. delete).\n *\n * @param {User} user\n * @param {*} context The parent component under which the controls menu will\n * be displayed.\n * @return {ItemList}\n * @protected\n */\n destructiveControls(user) {\n const items = new ItemList();\n\n if (user.id() !== '1' && user.canDelete()) {\n items.add(\n 'delete',\n Button.component({\n icon: 'fas fa-times',\n children: app.translator.trans('core.forum.user_controls.delete_button'),\n onclick: this.deleteAction.bind(this, user),\n })\n );\n }\n\n return items;\n },\n\n /**\n * Delete the user.\n *\n * @param {User} user\n */\n deleteAction(user) {\n if (!confirm(app.translator.trans('core.forum.user_controls.delete_confirmation'))) {\n return;\n }\n\n user\n .delete()\n .then(() => {\n this.showDeletionAlert(user, 'success');\n if (app.current.matches(UserPage, { user })) {\n app.history.back();\n } else {\n window.location.reload();\n }\n })\n .catch(() => this.showDeletionAlert(user, 'error'));\n },\n\n /**\n * Show deletion alert of user.\n *\n * @param {User} user\n * @param {string} type\n */\n showDeletionAlert(user, type) {\n const { username, email } = user.data.attributes;\n const message = {\n success: 'core.forum.user_controls.delete_success_message',\n error: 'core.forum.user_controls.delete_error_message',\n }[type];\n\n app.alerts.show(\n new Alert({\n type,\n children: app.translator.trans(message, { username, email }),\n })\n );\n },\n\n /**\n * Edit the user.\n *\n * @param {User} user\n */\n editAction(user) {\n app.modal.show(new EditUserModal({ user }));\n },\n};\n","import Component from '../../common/Component';\nimport avatar from '../../common/helpers/avatar';\nimport icon from '../../common/helpers/icon';\nimport listItems from '../../common/helpers/listItems';\nimport ItemList from '../../common/utils/ItemList';\nimport Button from '../../common/components/Button';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\n\n/**\n * The `AvatarEditor` component displays a user's avatar along with a dropdown\n * menu which allows the user to upload/remove the avatar.\n *\n * ### Props\n *\n * - `className`\n * - `user`\n */\nexport default class AvatarEditor extends Component {\n init() {\n /**\n * Whether or not an avatar upload is in progress.\n *\n * @type {Boolean}\n */\n this.loading = false;\n\n /**\n * Whether or not an image has been dragged over the dropzone.\n *\n * @type {Boolean}\n */\n this.isDraggedOver = false;\n }\n\n static initProps(props) {\n super.initProps(props);\n\n props.className = props.className || '';\n }\n\n view() {\n const user = this.props.user;\n\n return (\n <div className={'AvatarEditor Dropdown ' + this.props.className + (this.loading ? ' loading' : '') + (this.isDraggedOver ? ' dragover' : '')}>\n {avatar(user)}\n <a\n className={user.avatarUrl() ? 'Dropdown-toggle' : 'Dropdown-toggle AvatarEditor--noAvatar'}\n title={app.translator.trans('core.forum.user.avatar_upload_tooltip')}\n data-toggle=\"dropdown\"\n onclick={this.quickUpload.bind(this)}\n ondragover={this.enableDragover.bind(this)}\n ondragenter={this.enableDragover.bind(this)}\n ondragleave={this.disableDragover.bind(this)}\n ondragend={this.disableDragover.bind(this)}\n ondrop={this.dropUpload.bind(this)}\n >\n {this.loading ? LoadingIndicator.component() : user.avatarUrl() ? icon('fas fa-pencil-alt') : icon('fas fa-plus-circle')}\n </a>\n <ul className=\"Dropdown-menu Menu\">{listItems(this.controlItems().toArray())}</ul>\n </div>\n );\n }\n\n /**\n * Get the items in the edit avatar dropdown menu.\n *\n * @return {ItemList}\n */\n controlItems() {\n const items = new ItemList();\n\n items.add(\n 'upload',\n Button.component({\n icon: 'fas fa-upload',\n children: app.translator.trans('core.forum.user.avatar_upload_button'),\n onclick: this.openPicker.bind(this),\n })\n );\n\n items.add(\n 'remove',\n Button.component({\n icon: 'fas fa-times',\n children: app.translator.trans('core.forum.user.avatar_remove_button'),\n onclick: this.remove.bind(this),\n })\n );\n\n return items;\n }\n\n /**\n * Enable dragover style\n *\n * @param {Event} e\n */\n enableDragover(e) {\n e.preventDefault();\n e.stopPropagation();\n this.isDraggedOver = true;\n }\n\n /**\n * Disable dragover style\n *\n * @param {Event} e\n */\n disableDragover(e) {\n e.preventDefault();\n e.stopPropagation();\n this.isDraggedOver = false;\n }\n\n /**\n * Upload avatar when file is dropped into dropzone.\n *\n * @param {Event} e\n */\n dropUpload(e) {\n e.preventDefault();\n e.stopPropagation();\n this.isDraggedOver = false;\n this.upload(e.dataTransfer.files[0]);\n }\n\n /**\n * If the user doesn't have an avatar, there's no point in showing the\n * controls dropdown, because only one option would be viable: uploading.\n * Thus, when the avatar editor's dropdown toggle button is clicked, we prompt\n * the user to upload an avatar immediately.\n *\n * @param {Event} e\n */\n quickUpload(e) {\n if (!this.props.user.avatarUrl()) {\n e.preventDefault();\n e.stopPropagation();\n this.openPicker();\n }\n }\n\n /**\n * Upload avatar using file picker\n */\n openPicker() {\n if (this.loading) return;\n\n // Create a hidden HTML input element and click on it so the user can select\n // an avatar file. Once they have, we will upload it via the API.\n const user = this.props.user;\n const $input = $('<input type=\"file\">');\n\n $input\n .appendTo('body')\n .hide()\n .click()\n .on('input', (e) => {\n this.upload($(e.target)[0].files[0]);\n });\n }\n\n /**\n * Upload avatar\n *\n * @param {File} file\n */\n upload(file) {\n if (this.loading) return;\n\n const user = this.props.user;\n const data = new FormData();\n data.append('avatar', file);\n\n this.loading = true;\n m.redraw();\n\n app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/users/' + user.id() + '/avatar',\n serialize: (raw) => raw,\n data,\n })\n .then(this.success.bind(this), this.failure.bind(this));\n }\n\n /**\n * Remove the user's avatar.\n */\n remove() {\n const user = this.props.user;\n\n this.loading = true;\n m.redraw();\n\n app\n .request({\n method: 'DELETE',\n url: app.forum.attribute('apiUrl') + '/users/' + user.id() + '/avatar',\n })\n .then(this.success.bind(this), this.failure.bind(this));\n }\n\n /**\n * After a successful upload/removal, push the updated user data into the\n * store, and force a recomputation of the user's avatar color.\n *\n * @param {Object} response\n * @protected\n */\n success(response) {\n app.store.pushPayload(response);\n delete this.props.user.avatarColor;\n\n this.loading = false;\n m.redraw();\n }\n\n /**\n * If avatar upload/removal fails, stop loading.\n *\n * @param {Object} response\n * @protected\n */\n failure(response) {\n this.loading = false;\n m.redraw();\n }\n}\n","import Component from '../../common/Component';\nimport humanTime from '../../common/utils/humanTime';\nimport ItemList from '../../common/utils/ItemList';\nimport UserControls from '../utils/UserControls';\nimport avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport icon from '../../common/helpers/icon';\nimport Dropdown from '../../common/components/Dropdown';\nimport AvatarEditor from './AvatarEditor';\nimport listItems from '../../common/helpers/listItems';\n\n/**\n * The `UserCard` component displays a user's profile card. This is used both on\n * the `UserPage` (in the hero) and in discussions, shown when hovering over a\n * post author.\n *\n * ### Props\n *\n * - `user`\n * - `className`\n * - `editable`\n * - `controlsButtonClassName`\n */\nexport default class UserCard extends Component {\n view() {\n const user = this.props.user;\n const controls = UserControls.controls(user, this).toArray();\n const color = user.color();\n const badges = user.badges().toArray();\n\n return (\n <div className={'UserCard ' + (this.props.className || '')} style={color ? { backgroundColor: color } : ''}>\n <div className=\"darkenBackground\">\n <div className=\"container\">\n {controls.length\n ? Dropdown.component({\n children: controls,\n className: 'UserCard-controls App-primaryControl',\n menuClassName: 'Dropdown-menu--right',\n buttonClassName: this.props.controlsButtonClassName,\n label: app.translator.trans('core.forum.user_controls.button'),\n icon: 'fas fa-ellipsis-v',\n })\n : ''}\n\n <div className=\"UserCard-profile\">\n <h2 className=\"UserCard-identity\">\n {this.props.editable ? (\n [AvatarEditor.component({ user, className: 'UserCard-avatar' }), username(user)]\n ) : (\n <a href={app.route.user(user)} config={m.route}>\n <div className=\"UserCard-avatar\">{avatar(user)}</div>\n {username(user)}\n </a>\n )}\n </h2>\n\n {badges.length ? <ul className=\"UserCard-badges badges\">{listItems(badges)}</ul> : ''}\n\n <ul className=\"UserCard-info\">{listItems(this.infoItems().toArray())}</ul>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n /**\n * Build an item list of tidbits of info to show on this user's profile.\n *\n * @return {ItemList}\n */\n infoItems() {\n const items = new ItemList();\n const user = this.props.user;\n const lastSeenAt = user.lastSeenAt();\n\n if (lastSeenAt) {\n const online = user.isOnline();\n\n items.add(\n 'lastSeen',\n <span className={'UserCard-lastSeen' + (online ? ' online' : '')}>\n {online\n ? [icon('fas fa-circle'), ' ', app.translator.trans('core.forum.user.online_text')]\n : [icon('far fa-clock'), ' ', humanTime(lastSeenAt)]}\n </span>\n );\n }\n\n items.add('joined', app.translator.trans('core.forum.user.joined_date_text', { ago: humanTime(user.joinTime()) }));\n\n return items;\n }\n}\n","import Component from '../../common/Component';\nimport UserCard from './UserCard';\nimport avatar from '../../common/helpers/avatar';\nimport username from '../../common/helpers/username';\nimport userOnline from '../../common/helpers/userOnline';\nimport listItems from '../../common/helpers/listItems';\n\n/**\n * The `PostUser` component shows the avatar and username of a post's author.\n *\n * ### Props\n *\n * - `post`\n */\nexport default class PostUser extends Component {\n view() {\n const post = this.props.post;\n const user = post.user();\n\n if (!user) {\n return (\n <div className=\"PostUser\">\n <h3>\n {avatar(user, { className: 'PostUser-avatar' })} {username(user)}\n </h3>\n </div>\n );\n }\n\n let card = '';\n\n if (!post.isHidden()) {\n card = UserCard.component({\n user,\n className: 'UserCard--popover',\n controlsButtonClassName: 'Button Button--icon Button--flat',\n });\n }\n\n return (\n <div className=\"PostUser\">\n <h3>\n <a href={app.route.user(user)} config={m.route}>\n {avatar(user, { className: 'PostUser-avatar' })}\n {userOnline(user)}\n {username(user)}\n </a>\n </h3>\n <ul className=\"PostUser-badges badges\">{listItems(user.badges().toArray())}</ul>\n {card}\n </div>\n );\n }\n\n config(isInitialized) {\n if (isInitialized) return;\n\n let timeout;\n\n this.$()\n .on('mouseover', 'h3 a, .UserCard', () => {\n clearTimeout(timeout);\n timeout = setTimeout(this.showCard.bind(this), 500);\n })\n .on('mouseout', 'h3 a, .UserCard', () => {\n clearTimeout(timeout);\n timeout = setTimeout(this.hideCard.bind(this), 250);\n });\n }\n\n /**\n * Show the user card.\n */\n showCard() {\n setTimeout(() => this.$('.UserCard').addClass('in'));\n }\n\n /**\n * Hide the user card.\n */\n hideCard() {\n this.$('.UserCard').removeClass('in');\n }\n}\n","import Component from '../../common/Component';\nimport humanTime from '../../common/helpers/humanTime';\nimport fullTime from '../../common/helpers/fullTime';\n\n/**\n * The `PostMeta` component displays the time of a post, and when clicked, shows\n * a dropdown containing more information about the post (number, full time,\n * permalink).\n *\n * ### Props\n *\n * - `post`\n */\nexport default class PostMeta extends Component {\n view() {\n const post = this.props.post;\n const time = post.createdAt();\n const permalink = this.getPermalink(post);\n const touch = 'ontouchstart' in document.documentElement;\n\n // When the dropdown menu is shown, select the contents of the permalink\n // input so that the user can quickly copy the URL.\n const selectPermalink = function () {\n setTimeout(() => $(this).parent().find('.PostMeta-permalink').select());\n\n m.redraw.strategy('none');\n };\n\n return (\n <div className=\"Dropdown PostMeta\">\n <a className=\"Dropdown-toggle\" onclick={selectPermalink} data-toggle=\"dropdown\">\n {humanTime(time)}\n </a>\n\n <div className=\"Dropdown-menu dropdown-menu\">\n <span className=\"PostMeta-number\">{app.translator.trans('core.forum.post.number_tooltip', { number: post.number() })}</span>{' '}\n <span className=\"PostMeta-time\">{fullTime(time)}</span> <span className=\"PostMeta-ip\">{post.data.attributes.ipAddress}</span>\n {touch ? (\n <a className=\"Button PostMeta-permalink\" href={permalink}>\n {permalink}\n </a>\n ) : (\n <input className=\"FormControl PostMeta-permalink\" value={permalink} onclick={(e) => e.stopPropagation()} />\n )}\n </div>\n </div>\n );\n }\n\n /**\n * Get the permalink for the given post.\n *\n * @param {Post} post\n * @returns {String}\n */\n getPermalink(post) {\n return window.location.origin + app.route.post(post);\n }\n}\n","import Component from '../../common/Component';\nimport humanTime from '../../common/utils/humanTime';\nimport extractText from '../../common/utils/extractText';\n\n/**\n * The `PostEdited` component displays information about when and by whom a post\n * was edited.\n *\n * ### Props\n *\n * - `post`\n */\nexport default class PostEdited extends Component {\n init() {\n this.shouldUpdateTooltip = false;\n this.oldEditedInfo = null;\n }\n\n view() {\n const post = this.props.post;\n const editedUser = post.editedUser();\n const editedInfo = extractText(app.translator.trans('core.forum.post.edited_tooltip', { user: editedUser, ago: humanTime(post.editedAt()) }));\n if (editedInfo !== this.oldEditedInfo) {\n this.shouldUpdateTooltip = true;\n this.oldEditedInfo = editedInfo;\n }\n\n return (\n <span className=\"PostEdited\" title={editedInfo}>\n {app.translator.trans('core.forum.post.edited_text')}\n </span>\n );\n }\n\n config(isInitialized) {\n if (this.shouldUpdateTooltip) {\n this.$().tooltip('destroy').tooltip();\n this.shouldUpdateTooltip = false;\n }\n }\n}\n","/*global s9e, hljs*/\n\nimport Post from './Post';\nimport classList from '../../common/utils/classList';\nimport PostUser from './PostUser';\nimport PostMeta from './PostMeta';\nimport PostEdited from './PostEdited';\nimport EditPostComposer from './EditPostComposer';\nimport ItemList from '../../common/utils/ItemList';\nimport listItems from '../../common/helpers/listItems';\nimport Button from '../../common/components/Button';\n\n/**\n * The `CommentPost` component displays a standard `comment`-typed post. This\n * includes a number of item lists (controls, header, and footer) surrounding\n * the post's HTML content.\n *\n * ### Props\n *\n * - `post`\n */\nexport default class CommentPost extends Post {\n init() {\n super.init();\n\n /**\n * If the post has been hidden, then this flag determines whether or not its\n * content has been expanded.\n *\n * @type {Boolean}\n */\n this.revealContent = false;\n\n this.subtree.check(() => this.isEditing());\n }\n\n content() {\n // Note: we avoid using JSX for the <ul> below because it results in some\n // weirdness in Mithril.js 0.1.x (see flarum/core#975). This workaround can\n // be reverted when we upgrade to Mithril 1.0.\n return super\n .content()\n .concat([\n <header className=\"Post-header\">{m('ul', listItems(this.headerItems().toArray()))}</header>,\n <div className=\"Post-body\">\n {this.isEditing() ? <div className=\"Post-preview\" config={this.configPreview.bind(this)} /> : m.trust(this.props.post.contentHtml())}\n </div>,\n ]);\n }\n\n config(isInitialized, context) {\n super.config(...arguments);\n\n const contentHtml = this.isEditing() ? '' : this.props.post.contentHtml();\n\n // If the post content has changed since the last render, we'll run through\n // all of the <script> tags in the content and evaluate them. This is\n // necessary because TextFormatter outputs them for e.g. syntax highlighting.\n if (context.contentHtml !== contentHtml) {\n this.$('.Post-body script').each(function () {\n eval.call(window, $(this).text());\n });\n }\n\n context.contentHtml = contentHtml;\n }\n\n isEditing() {\n return app.composer.component instanceof EditPostComposer && app.composer.component.props.post === this.props.post;\n }\n\n attrs() {\n const post = this.props.post;\n const attrs = super.attrs();\n\n attrs.className =\n (attrs.className || '') +\n ' ' +\n classList({\n CommentPost: true,\n 'Post--hidden': post.isHidden(),\n 'Post--edited': post.isEdited(),\n revealContent: this.revealContent,\n editing: this.isEditing(),\n });\n\n return attrs;\n }\n\n configPreview(element, isInitialized, context) {\n if (isInitialized) return;\n\n // Every 50ms, if the composer content has changed, then update the post's\n // body with a preview.\n let preview;\n const updatePreview = () => {\n const content = app.composer.component.content();\n\n if (preview === content) return;\n\n preview = content;\n\n s9e.TextFormatter.preview(preview || '', element);\n };\n updatePreview();\n\n const updateInterval = setInterval(updatePreview, 50);\n context.onunload = () => clearInterval(updateInterval);\n }\n\n /**\n * Toggle the visibility of a hidden post's content.\n */\n toggleContent() {\n this.revealContent = !this.revealContent;\n }\n\n /**\n * Build an item list for the post's header.\n *\n * @return {ItemList}\n */\n headerItems() {\n const items = new ItemList();\n const post = this.props.post;\n\n items.add('user', PostUser.component({ post }), 100);\n items.add('meta', PostMeta.component({ post }));\n\n if (post.isEdited() && !post.isHidden()) {\n items.add('edited', PostEdited.component({ post }));\n }\n\n // If the post is hidden, add a button that allows toggling the visibility\n // of the post's content.\n if (post.isHidden()) {\n items.add(\n 'toggle',\n Button.component({\n className: 'Button Button--default Button--more',\n icon: 'fas fa-ellipsis-h',\n onclick: this.toggleContent.bind(this),\n })\n );\n }\n\n return items;\n }\n}\n","import Post from './Post';\nimport { ucfirst } from '../../common/utils/string';\nimport usernameHelper from '../../common/helpers/username';\nimport icon from '../../common/helpers/icon';\n\n/**\n * The `EventPost` component displays a post which indicating a discussion\n * event, like a discussion being renamed or stickied. Subclasses must implement\n * the `icon` and `description` methods.\n *\n * ### Props\n *\n * - All of the props for `Post`\n *\n * @abstract\n */\nexport default class EventPost extends Post {\n attrs() {\n const attrs = super.attrs();\n\n attrs.className = (attrs.className || '') + ' EventPost ' + ucfirst(this.props.post.contentType()) + 'Post';\n\n return attrs;\n }\n\n content() {\n const user = this.props.post.user();\n const username = usernameHelper(user);\n const data = Object.assign(this.descriptionData(), {\n user,\n username: user ? (\n <a className=\"EventPost-user\" href={app.route.user(user)} config={m.route}>\n {username}\n </a>\n ) : (\n username\n ),\n });\n\n return super.content().concat([icon(this.icon(), { className: 'EventPost-icon' }), <div class=\"EventPost-info\">{this.description(data)}</div>]);\n }\n\n /**\n * Get the name of the event icon.\n *\n * @return {String}\n */\n icon() {\n return '';\n }\n\n /**\n * Get the description text for the event.\n *\n * @param {Object} data\n * @return {String|Object} The description to render in the DOM\n */\n description(data) {\n return app.translator.transChoice(this.descriptionKey(), data.count, data);\n }\n\n /**\n * Get the translation key for the description of the event.\n *\n * @return {String}\n */\n descriptionKey() {\n return '';\n }\n\n /**\n * Get the translation data for the description of the event.\n *\n * @return {Object}\n */\n descriptionData() {\n return {};\n }\n}\n","import EventPost from './EventPost';\nimport extractText from '../../common/utils/extractText';\n\n/**\n * The `DiscussionRenamedPost` component displays a discussion event post\n * indicating that the discussion has been renamed.\n *\n * ### Props\n *\n * - All of the props for EventPost\n */\nexport default class DiscussionRenamedPost extends EventPost {\n icon() {\n return 'fas fa-pencil-alt';\n }\n\n description(data) {\n const renamed = app.translator.trans('core.forum.post_stream.discussion_renamed_text', data);\n const oldName = app.translator.trans('core.forum.post_stream.discussion_renamed_old_tooltip', data);\n\n return <span title={extractText(oldName)}>{renamed}</span>;\n }\n\n descriptionData() {\n const post = this.props.post;\n const oldTitle = post.content()[0];\n const newTitle = post.content()[1];\n\n return {\n old: oldTitle,\n new: <strong className=\"DiscussionRenamedPost-new\">{newTitle}</strong>,\n };\n }\n}\n","import Component from '../../common/Component';\nimport Button from '../../common/components/Button';\n\n/**\n * The `WelcomeHero` component displays a hero that welcomes the user to the\n * forum.\n */\nexport default class WelcomeHero extends Component {\n init() {\n this.hidden = localStorage.getItem('welcomeHidden');\n }\n\n view() {\n if (this.hidden) return <div />;\n\n const slideUp = () => {\n this.$().slideUp(this.hide.bind(this));\n };\n\n return (\n <header className=\"Hero WelcomeHero\">\n <div class=\"container\">\n {Button.component({\n icon: 'fas fa-times',\n onclick: slideUp,\n className: 'Hero-close Button Button--icon Button--link',\n })}\n\n <div className=\"containerNarrow\">\n <h2 className=\"Hero-title\">{app.forum.attribute('welcomeTitle')}</h2>\n <div className=\"Hero-subtitle\">{m.trust(app.forum.attribute('welcomeMessage'))}</div>\n </div>\n </div>\n </header>\n );\n }\n\n /**\n * Hide the welcome hero.\n */\n hide() {\n localStorage.setItem('welcomeHidden', 'true');\n\n this.hidden = true;\n }\n}\n","import ComposerBody from './ComposerBody';\nimport extractText from '../../common/utils/extractText';\n\n/**\n * The `DiscussionComposer` component displays the composer content for starting\n * a new discussion. It adds a text field as a header control so the user can\n * enter the title of their discussion. It also overrides the `submit` and\n * `willExit` actions to account for the title.\n *\n * ### Props\n *\n * - All of the props for ComposerBody\n * - `titlePlaceholder`\n */\nexport default class DiscussionComposer extends ComposerBody {\n init() {\n super.init();\n\n /**\n * The value of the title input.\n *\n * @type {Function}\n */\n this.title = m.prop('');\n }\n\n static initProps(props) {\n super.initProps(props);\n\n props.placeholder = props.placeholder || extractText(app.translator.trans('core.forum.composer_discussion.body_placeholder'));\n props.submitLabel = props.submitLabel || app.translator.trans('core.forum.composer_discussion.submit_button');\n props.confirmExit = props.confirmExit || extractText(app.translator.trans('core.forum.composer_discussion.discard_confirmation'));\n props.titlePlaceholder = props.titlePlaceholder || extractText(app.translator.trans('core.forum.composer_discussion.title_placeholder'));\n props.className = 'ComposerBody--discussion';\n }\n\n headerItems() {\n const items = super.headerItems();\n\n items.add('title', <h3>{app.translator.trans('core.forum.composer_discussion.title')}</h3>, 100);\n\n items.add(\n 'discussionTitle',\n <h3>\n <input\n className=\"FormControl\"\n value={this.title()}\n oninput={m.withAttr('value', this.title)}\n placeholder={this.props.titlePlaceholder}\n disabled={!!this.props.disabled}\n onkeydown={this.onkeydown.bind(this)}\n />\n </h3>\n );\n\n return items;\n }\n\n /**\n * Handle the title input's keydown event. When the return key is pressed,\n * move the focus to the start of the text editor.\n *\n * @param {Event} e\n */\n onkeydown(e) {\n if (e.which === 13) {\n // Return\n e.preventDefault();\n this.editor.setSelectionRange(0, 0);\n }\n\n m.redraw.strategy('none');\n }\n\n preventExit() {\n return (this.title() || this.content()) && this.props.confirmExit;\n }\n\n /**\n * Get the data to submit to the server when the discussion is saved.\n *\n * @return {Object}\n */\n data() {\n return {\n title: this.title(),\n content: this.content(),\n };\n }\n\n onsubmit() {\n this.loading = true;\n\n const data = this.data();\n\n app.store\n .createRecord('discussions')\n .save(data)\n .then((discussion) => {\n app.composer.hide();\n app.discussions.refresh();\n m.route(app.route.discussion(discussion));\n }, this.loaded.bind(this));\n }\n}\n","import { extend } from '../../common/extend';\nimport Page from '../../common/components/Page';\nimport ItemList from '../../common/utils/ItemList';\nimport listItems from '../../common/helpers/listItems';\nimport DiscussionList from './DiscussionList';\nimport WelcomeHero from './WelcomeHero';\nimport DiscussionComposer from './DiscussionComposer';\nimport LogInModal from './LogInModal';\nimport DiscussionPage from './DiscussionPage';\nimport Dropdown from '../../common/components/Dropdown';\nimport Button from '../../common/components/Button';\nimport LinkButton from '../../common/components/LinkButton';\nimport SelectDropdown from '../../common/components/SelectDropdown';\n\n/**\n * The `IndexPage` component displays the index page, including the welcome\n * hero, the sidebar, and the discussion list.\n */\nexport default class IndexPage extends Page {\n static providesInitialSearch = true;\n\n init() {\n super.init();\n\n // If the user is returning from a discussion page, then take note of which\n // discussion they have just visited. After the view is rendered, we will\n // scroll down so that this discussion is in view.\n if (app.previous.matches(DiscussionPage)) {\n this.lastDiscussion = app.previous.get('discussion');\n }\n\n // If the user is coming from the discussion list, then they have either\n // just switched one of the parameters (filter, sort, search) or they\n // probably want to refresh the results. We will clear the discussion list\n // cache so that results are reloaded.\n if (app.previous.matches(IndexPage)) {\n app.discussions.clear();\n }\n\n app.discussions.refreshParams(app.search.params());\n\n app.history.push('index', app.translator.trans('core.forum.header.back_to_index_tooltip'));\n\n this.bodyClass = 'App--index';\n }\n\n onunload() {\n // Save the scroll position so we can restore it when we return to the\n // discussion list.\n app.cache.scrollTop = $(window).scrollTop();\n }\n\n view() {\n return (\n <div className=\"IndexPage\">\n {this.hero()}\n <div className=\"container\">\n <div className=\"sideNavContainer\">\n <nav className=\"IndexPage-nav sideNav\">\n <ul>{listItems(this.sidebarItems().toArray())}</ul>\n </nav>\n <div className=\"IndexPage-results sideNavOffset\">\n <div className=\"IndexPage-toolbar\">\n <ul className=\"IndexPage-toolbar-view\">{listItems(this.viewItems().toArray())}</ul>\n <ul className=\"IndexPage-toolbar-action\">{listItems(this.actionItems().toArray())}</ul>\n </div>\n <DiscussionList state={app.discussions} />\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n config(isInitialized, context) {\n super.config(...arguments);\n\n if (isInitialized) return;\n\n extend(context, 'onunload', () => $('#app').css('min-height', ''));\n\n app.setTitle('');\n app.setTitleCount(0);\n\n // Work out the difference between the height of this hero and that of the\n // previous hero. Maintain the same scroll position relative to the bottom\n // of the hero so that the sidebar doesn't jump around.\n const oldHeroHeight = app.cache.heroHeight;\n const heroHeight = (app.cache.heroHeight = this.$('.Hero').outerHeight() || 0);\n const scrollTop = app.cache.scrollTop;\n\n $('#app').css('min-height', $(window).height() + heroHeight);\n\n // Scroll to the remembered position. We do this after a short delay so that\n // it happens after the browser has done its own \"back button\" scrolling,\n // which isn't right. https://github.com/flarum/core/issues/835\n const scroll = () => $(window).scrollTop(scrollTop - oldHeroHeight + heroHeight);\n scroll();\n setTimeout(scroll, 1);\n\n // If we've just returned from a discussion page, then the constructor will\n // have set the `lastDiscussion` property. If this is the case, we want to\n // scroll down to that discussion so that it's in view.\n if (this.lastDiscussion) {\n const $discussion = this.$(`.DiscussionListItem[data-id=\"${this.lastDiscussion.id()}\"]`);\n\n if ($discussion.length) {\n const indexTop = $('#header').outerHeight();\n const indexBottom = $(window).height();\n const discussionTop = $discussion.offset().top;\n const discussionBottom = discussionTop + $discussion.outerHeight();\n\n if (discussionTop < scrollTop + indexTop || discussionBottom > scrollTop + indexBottom) {\n $(window).scrollTop(discussionTop - indexTop);\n }\n }\n }\n }\n\n /**\n * Get the component to display as the hero.\n *\n * @return {MithrilComponent}\n */\n hero() {\n return WelcomeHero.component();\n }\n\n /**\n * Build an item list for the sidebar of the index page. By default this is a\n * \"New Discussion\" button, and then a DropdownSelect component containing a\n * list of navigation items.\n *\n * @return {ItemList}\n */\n sidebarItems() {\n const items = new ItemList();\n const canStartDiscussion = app.forum.attribute('canStartDiscussion') || !app.session.user;\n\n items.add(\n 'newDiscussion',\n Button.component({\n children: app.translator.trans(\n canStartDiscussion ? 'core.forum.index.start_discussion_button' : 'core.forum.index.cannot_start_discussion_button'\n ),\n icon: 'fas fa-edit',\n className: 'Button Button--primary IndexPage-newDiscussion',\n itemClassName: 'App-primaryControl',\n onclick: this.newDiscussionAction.bind(this),\n disabled: !canStartDiscussion,\n })\n );\n\n items.add(\n 'nav',\n SelectDropdown.component({\n children: this.navItems(this).toArray(),\n buttonClassName: 'Button',\n className: 'App-titleControl',\n })\n );\n\n return items;\n }\n\n /**\n * Build an item list for the navigation in the sidebar of the index page. By\n * default this is just the 'All Discussions' link.\n *\n * @return {ItemList}\n */\n navItems() {\n const items = new ItemList();\n const params = app.search.stickyParams();\n\n items.add(\n 'allDiscussions',\n LinkButton.component({\n href: app.route('index', params),\n children: app.translator.trans('core.forum.index.all_discussions_link'),\n icon: 'far fa-comments',\n }),\n 100\n );\n\n return items;\n }\n\n /**\n * Build an item list for the part of the toolbar which is concerned with how\n * the results are displayed. By default this is just a select box to change\n * the way discussions are sorted.\n *\n * @return {ItemList}\n */\n viewItems() {\n const items = new ItemList();\n const sortMap = app.discussions.sortMap();\n\n const sortOptions = {};\n for (const i in sortMap) {\n sortOptions[i] = app.translator.trans('core.forum.index_sort.' + i + '_button');\n }\n\n items.add(\n 'sort',\n Dropdown.component({\n buttonClassName: 'Button',\n label: sortOptions[app.search.params().sort] || Object.keys(sortMap).map((key) => sortOptions[key])[0],\n children: Object.keys(sortOptions).map((value) => {\n const label = sortOptions[value];\n const active = (app.search.params().sort || Object.keys(sortMap)[0]) === value;\n\n return Button.component({\n children: label,\n icon: active ? 'fas fa-check' : true,\n onclick: app.search.changeSort.bind(app.search, value),\n active: active,\n });\n }),\n })\n );\n\n return items;\n }\n\n /**\n * Build an item list for the part of the toolbar which is about taking action\n * on the results. By default this is just a \"mark all as read\" button.\n *\n * @return {ItemList}\n */\n actionItems() {\n const items = new ItemList();\n\n items.add(\n 'refresh',\n Button.component({\n title: app.translator.trans('core.forum.index.refresh_tooltip'),\n icon: 'fas fa-sync',\n className: 'Button Button--icon',\n onclick: () => {\n app.discussions.refresh();\n if (app.session.user) {\n app.store.find('users', app.session.user.id());\n m.redraw();\n }\n },\n })\n );\n\n if (app.session.user) {\n items.add(\n 'markAllAsRead',\n Button.component({\n title: app.translator.trans('core.forum.index.mark_all_as_read_tooltip'),\n icon: 'fas fa-check',\n className: 'Button Button--icon',\n onclick: this.markAllAsRead.bind(this),\n })\n );\n }\n\n return items;\n }\n\n /**\n * Open the composer for a new discussion or prompt the user to login.\n *\n * @return {Promise}\n */\n newDiscussionAction() {\n const deferred = m.deferred();\n\n if (app.session.user) {\n const component = new DiscussionComposer({ user: app.session.user });\n\n app.composer.load(component);\n app.composer.show();\n\n deferred.resolve(component);\n } else {\n deferred.reject();\n\n app.modal.show(new LogInModal());\n }\n\n return deferred.promise;\n }\n\n /**\n * Mark all discussions as read.\n *\n * @return void\n */\n markAllAsRead() {\n const confirmation = confirm(app.translator.trans('core.forum.index.mark_all_as_read_confirmation'));\n\n if (confirmation) {\n app.session.user.save({ markedAllAsReadAt: new Date() });\n }\n }\n}\n","import UserPage from './UserPage';\nimport LoadingIndicator from '../../common/components/LoadingIndicator';\nimport Button from '../../common/components/Button';\nimport Placeholder from '../../common/components/Placeholder';\nimport CommentPost from './CommentPost';\n\n/**\n * The `PostsUserPage` component shows a user's activity feed inside of their\n * profile.\n */\nexport default class PostsUserPage extends UserPage {\n init() {\n super.init();\n\n /**\n * Whether or not the activity feed is currently loading.\n *\n * @type {Boolean}\n */\n this.loading = true;\n\n /**\n * Whether or not there are any more activity items that can be loaded.\n *\n * @type {Boolean}\n */\n this.moreResults = false;\n\n /**\n * The Post models in the feed.\n *\n * @type {Post[]}\n */\n this.posts = [];\n\n /**\n * The number of activity items to load per request.\n *\n * @type {Integer}\n */\n this.loadLimit = 20;\n\n this.loadUser(m.route.param('username'));\n }\n\n content() {\n if (this.posts.length === 0 && !this.loading) {\n return (\n <div className=\"PostsUserPage\">\n <Placeholder text={app.translator.trans('core.forum.user.posts_empty_text')} />\n </div>\n );\n }\n\n let footer;\n\n if (this.loading) {\n footer = LoadingIndicator.component();\n } else if (this.moreResults) {\n footer = (\n <div className=\"PostsUserPage-loadMore\">\n {Button.component({\n children: app.translator.trans('core.forum.user.posts_load_more_button'),\n className: 'Button',\n onclick: this.loadMore.bind(this),\n })}\n </div>\n );\n }\n\n return (\n <div className=\"PostsUserPage\">\n <ul className=\"PostsUserPage-list\">\n {this.posts.map((post) => (\n <li>\n <div className=\"PostsUserPage-discussion\">\n {app.translator.trans('core.forum.user.in_discussion_text', {\n discussion: (\n <a href={app.route.post(post)} config={m.route}>\n {post.discussion().title()}\n </a>\n ),\n })}\n </div>\n {CommentPost.component({ post })}\n </li>\n ))}\n </ul>\n <div className=\"PostsUserPage-loadMore\">{footer}</div>\n </div>\n );\n }\n\n /**\n * Initialize the component with a user, and trigger the loading of their\n * activity feed.\n */\n show(user) {\n super.show(user);\n\n this.refresh();\n }\n\n /**\n * Clear and reload the user's activity feed.\n *\n * @public\n */\n refresh() {\n this.loading = true;\n this.posts = [];\n\n m.lazyRedraw();\n\n this.loadResults().then(this.parseResults.bind(this));\n }\n\n /**\n * Load a new page of the user's activity feed.\n *\n * @param {Integer} [offset] The position to start getting results from.\n * @return {Promise}\n * @protected\n */\n loadResults(offset) {\n return app.store.find('posts', {\n filter: {\n user: this.user.id(),\n type: 'comment',\n },\n page: { offset, limit: this.loadLimit },\n sort: '-createdAt',\n });\n }\n\n /**\n * Load the next page of results.\n *\n * @public\n */\n loadMore() {\n this.loading = true;\n this.loadResults(this.posts.length).then(this.parseResults.bind(this));\n }\n\n /**\n * Parse results and append them to the activity feed.\n *\n * @param {Post[]} results\n * @return {Post[]}\n */\n parseResults(results) {\n this.loading = false;\n\n [].push.apply(this.posts, results);\n\n this.moreResults = results.length >= this.loadLimit;\n m.redraw();\n\n return results;\n }\n}\n","import UserPage from './UserPage';\nimport DiscussionList from './DiscussionList';\n\n/**\n * The `DiscussionsUserPage` component shows a discussion list inside of a user\n * page.\n */\nexport default class DiscussionsUserPage extends UserPage {\n init() {\n super.init();\n\n this.loadUser(m.route.param('username'));\n }\n\n content() {\n return (\n <div className=\"DiscussionsUserPage\">\n {DiscussionList.component({\n params: {\n q: 'author:' + this.user.username(),\n sort: 'newest',\n },\n })}\n </div>\n );\n }\n}\n","import Component from '../../common/Component';\nimport Checkbox from '../../common/components/Checkbox';\nimport icon from '../../common/helpers/icon';\nimport ItemList from '../../common/utils/ItemList';\n\n/**\n * The `NotificationGrid` component displays a table of notification types and\n * methods, allowing the user to toggle each combination.\n *\n * ### Props\n *\n * - `user`\n */\nexport default class NotificationGrid extends Component {\n init() {\n /**\n * Information about the available notification methods.\n *\n * @type {Array}\n */\n this.methods = this.notificationMethods().toArray();\n\n /**\n * A map of which notification checkboxes are loading.\n *\n * @type {Object}\n */\n this.loading = {};\n\n /**\n * Information about the available notification types.\n *\n * @type {Array}\n */\n this.types = this.notificationTypes().toArray();\n }\n\n view() {\n const preferences = this.props.user.preferences();\n\n return (\n <table className=\"NotificationGrid\">\n <thead>\n <tr>\n <td />\n {this.methods.map((method) => (\n <th className=\"NotificationGrid-groupToggle\" onclick={this.toggleMethod.bind(this, method.name)}>\n {icon(method.icon)} {method.label}\n </th>\n ))}\n </tr>\n </thead>\n\n <tbody>\n {this.types.map((type) => (\n <tr>\n <td className=\"NotificationGrid-groupToggle\" onclick={this.toggleType.bind(this, type.name)}>\n {icon(type.icon)} {type.label}\n </td>\n {this.methods.map((method) => {\n const key = this.preferenceKey(type.name, method.name);\n\n return (\n <td className=\"NotificationGrid-checkbox\">\n {Checkbox.component({\n state: !!preferences[key],\n loading: this.loading[key],\n disabled: !(key in preferences),\n onchange: () => this.toggle([key]),\n })}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n config(isInitialized) {\n if (isInitialized) return;\n\n this.$('thead .NotificationGrid-groupToggle').bind('mouseenter mouseleave', function (e) {\n const i = parseInt($(this).index(), 10) + 1;\n $(this)\n .parents('table')\n .find('td:nth-child(' + i + ')')\n .toggleClass('highlighted', e.type === 'mouseenter');\n });\n\n this.$('tbody .NotificationGrid-groupToggle').bind('mouseenter mouseleave', function (e) {\n $(this)\n .parent()\n .find('td')\n .toggleClass('highlighted', e.type === 'mouseenter');\n });\n }\n\n /**\n * Toggle the state of the given preferences, based on the value of the first\n * one.\n *\n * @param {Array} keys\n */\n toggle(keys) {\n const user = this.props.user;\n const preferences = user.preferences();\n const enabled = !preferences[keys[0]];\n\n keys.forEach((key) => {\n this.loading[key] = true;\n preferences[key] = enabled;\n });\n\n m.redraw();\n\n user.save({ preferences }).then(() => {\n keys.forEach((key) => (this.loading[key] = false));\n\n m.redraw();\n });\n }\n\n /**\n * Toggle all notification types for the given method.\n *\n * @param {String} method\n */\n toggleMethod(method) {\n const keys = this.types.map((type) => this.preferenceKey(type.name, method)).filter((key) => key in this.props.user.preferences());\n\n this.toggle(keys);\n }\n\n /**\n * Toggle all notification methods for the given type.\n *\n * @param {String} type\n */\n toggleType(type) {\n const keys = this.methods.map((method) => this.preferenceKey(type, method.name)).filter((key) => key in this.props.user.preferences());\n\n this.toggle(keys);\n }\n\n /**\n * Get the name of the preference key for the given notification type-method\n * combination.\n *\n * @param {String} type\n * @param {String} method\n * @return {String}\n */\n preferenceKey(type, method) {\n return 'notify_' + type + '_' + method;\n }\n\n /**\n * Build an item list for the notification methods to display in the grid.\n *\n * Each notification method is an object which has the following properties:\n *\n * - `name` The name of the notification method.\n * - `icon` The icon to display in the column header.\n * - `label` The label to display in the column header.\n *\n * @return {ItemList}\n */\n notificationMethods() {\n const items = new ItemList();\n\n items.add('alert', {\n name: 'alert',\n icon: 'fas fa-bell',\n label: app.translator.trans('core.forum.settings.notify_by_web_heading'),\n });\n\n items.add('email', {\n name: 'email',\n icon: 'far fa-envelope',\n label: app.translator.trans('core.forum.settings.notify_by_email_heading'),\n });\n\n return items;\n }\n\n /**\n * Build an item list for the notification types to display in the grid.\n *\n * Each notification type is an object which has the following properties:\n *\n * - `name` The name of the notification type.\n * - `icon` The icon to display in the notification grid row.\n * - `label` The label to display in the notification grid row.\n *\n * @return {ItemList}\n */\n notificationTypes() {\n const items = new ItemList();\n\n items.add('discussionRenamed', {\n name: 'discussionRenamed',\n icon: 'fas fa-pencil-alt',\n label: app.translator.trans('core.forum.settings.notify_discussion_renamed_label'),\n });\n\n return items;\n }\n}\n","import Modal from '../../common/components/Modal';\nimport Button from '../../common/components/Button';\n\n/**\n * The `ChangePasswordModal` component shows a modal dialog which allows the\n * user to send themself a password reset email.\n */\nexport default class ChangePasswordModal extends Modal {\n className() {\n return 'ChangePasswordModal Modal--small';\n }\n\n title() {\n return app.translator.trans('core.forum.change_password.title');\n }\n\n content() {\n return (\n <div className=\"Modal-body\">\n <div className=\"Form Form--centered\">\n <p className=\"helpText\">{app.translator.trans('core.forum.change_password.text')}</p>\n <div className=\"Form-group\">\n {Button.component({\n className: 'Button Button--primary Button--block',\n type: 'submit',\n loading: this.loading,\n children: app.translator.trans('core.forum.change_password.send_button'),\n })}\n </div>\n </div>\n </div>\n );\n }\n\n onsubmit(e) {\n e.preventDefault();\n\n this.loading = true;\n\n app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/forgot',\n data: { email: app.session.user.email() },\n })\n .then(this.hide.bind(this), this.loaded.bind(this));\n }\n}\n","import Modal from '../../common/components/Modal';\nimport Button from '../../common/components/Button';\n\n/**\n * The `ChangeEmailModal` component shows a modal dialog which allows the user\n * to change their email address.\n */\nexport default class ChangeEmailModal extends Modal {\n init() {\n super.init();\n\n /**\n * Whether or not the email has been changed successfully.\n *\n * @type {Boolean}\n */\n this.success = false;\n\n /**\n * The value of the email input.\n *\n * @type {function}\n */\n this.email = m.prop(app.session.user.email());\n\n /**\n * The value of the password input.\n *\n * @type {function}\n */\n this.password = m.prop('');\n }\n\n className() {\n return 'ChangeEmailModal Modal--small';\n }\n\n title() {\n return app.translator.trans('core.forum.change_email.title');\n }\n\n content() {\n if (this.success) {\n return (\n <div className=\"Modal-body\">\n <div className=\"Form Form--centered\">\n <p className=\"helpText\">\n {app.translator.trans('core.forum.change_email.confirmation_message', { email: <strong>{this.email()}</strong> })}\n </p>\n <div className=\"Form-group\">\n <Button className=\"Button Button--primary Button--block\" onclick={this.hide.bind(this)}>\n {app.translator.trans('core.forum.change_email.dismiss_button')}\n </Button>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"Modal-body\">\n <div className=\"Form Form--centered\">\n <div className=\"Form-group\">\n <input\n type=\"email\"\n name=\"email\"\n className=\"FormControl\"\n placeholder={app.session.user.email()}\n bidi={this.email}\n disabled={this.loading}\n />\n </div>\n <div className=\"Form-group\">\n <input\n type=\"password\"\n name=\"password\"\n className=\"FormControl\"\n placeholder={app.translator.trans('core.forum.change_email.confirm_password_placeholder')}\n bidi={this.password}\n disabled={this.loading}\n />\n </div>\n <div className=\"Form-group\">\n {Button.component({\n className: 'Button Button--primary Button--block',\n type: 'submit',\n loading: this.loading,\n children: app.translator.trans('core.forum.change_email.submit_button'),\n })}\n </div>\n </div>\n </div>\n );\n }\n\n onsubmit(e) {\n e.preventDefault();\n\n // If the user hasn't actually entered a different email address, we don't\n // need to do anything. Woot!\n if (this.email() === app.session.user.email()) {\n this.hide();\n return;\n }\n\n const oldEmail = app.session.user.email();\n\n this.loading = true;\n\n app.session.user\n .save(\n { email: this.email() },\n {\n errorHandler: this.onerror.bind(this),\n meta: { password: this.password() },\n }\n )\n .then(() => (this.success = true))\n .catch(() => {})\n .then(this.loaded.bind(this));\n }\n\n onerror(error) {\n if (error.status === 401) {\n error.alert.props.children = app.translator.trans('core.forum.change_email.incorrect_password_message');\n }\n\n super.onerror(error);\n }\n}\n","import UserPage from './UserPage';\nimport ItemList from '../../common/utils/ItemList';\nimport Switch from '../../common/components/Switch';\nimport Button from '../../common/components/Button';\nimport FieldSet from '../../common/components/FieldSet';\nimport NotificationGrid from './NotificationGrid';\nimport ChangePasswordModal from './ChangePasswordModal';\nimport ChangeEmailModal from './ChangeEmailModal';\nimport listItems from '../../common/helpers/listItems';\n\n/**\n * The `SettingsPage` component displays the user's settings control panel, in\n * the context of their user profile.\n */\nexport default class SettingsPage extends UserPage {\n init() {\n super.init();\n\n this.show(app.session.user);\n app.setTitle(app.translator.trans('core.forum.settings.title'));\n }\n\n content() {\n return (\n <div className=\"SettingsPage\">\n <ul>{listItems(this.settingsItems().toArray())}</ul>\n </div>\n );\n }\n\n /**\n * Build an item list for the user's settings controls.\n *\n * @return {ItemList}\n */\n settingsItems() {\n const items = new ItemList();\n\n items.add(\n 'account',\n FieldSet.component({\n label: app.translator.trans('core.forum.settings.account_heading'),\n className: 'Settings-account',\n children: this.accountItems().toArray(),\n })\n );\n\n items.add(\n 'notifications',\n FieldSet.component({\n label: app.translator.trans('core.forum.settings.notifications_heading'),\n className: 'Settings-notifications',\n children: this.notificationsItems().toArray(),\n })\n );\n\n items.add(\n 'privacy',\n FieldSet.component({\n label: app.translator.trans('core.forum.settings.privacy_heading'),\n className: 'Settings-privacy',\n children: this.privacyItems().toArray(),\n })\n );\n\n return items;\n }\n\n /**\n * Build an item list for the user's account settings.\n *\n * @return {ItemList}\n */\n accountItems() {\n const items = new ItemList();\n\n items.add(\n 'changePassword',\n Button.component({\n children: app.translator.trans('core.forum.settings.change_password_button'),\n className: 'Button',\n onclick: () => app.modal.show(new ChangePasswordModal()),\n })\n );\n\n items.add(\n 'changeEmail',\n Button.component({\n children: app.translator.trans('core.forum.settings.change_email_button'),\n className: 'Button',\n onclick: () => app.modal.show(new ChangeEmailModal()),\n })\n );\n\n return items;\n }\n\n /**\n * Build an item list for the user's notification settings.\n *\n * @return {ItemList}\n */\n notificationsItems() {\n const items = new ItemList();\n\n items.add('notificationGrid', NotificationGrid.component({ user: this.user }));\n\n return items;\n }\n\n /**\n * @deprecated beta 14, remove in beta 15.\n *\n * Generate a callback that will save a value to the given preference.\n *\n * @param {String} key\n * @return {Function}\n */\n preferenceSaver(key) {\n return (value, component) => {\n if (component) component.props.loading = true;\n m.redraw();\n\n this.user.savePreferences({ [key]: value }).then(() => {\n if (component) component.props.loading = false;\n m.redraw();\n });\n };\n }\n\n /**\n * Build an item list for the user's privacy settings.\n *\n * @return {ItemList}\n */\n privacyItems() {\n const items = new ItemList();\n\n items.add(\n 'discloseOnline',\n Switch.component({\n children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'),\n state: this.user.preferences().discloseOnline,\n onchange: (value) => {\n this.discloseOnlineLoading = true;\n\n this.user.savePreferences({ discloseOnline: value }).then(() => {\n this.discloseOnlineLoading = false;\n m.redraw();\n });\n },\n loading: this.discloseOnlineLoading,\n })\n );\n\n return items;\n }\n}\n","import Page from '../../common/components/Page';\nimport NotificationList from './NotificationList';\n\n/**\n * The `NotificationsPage` component shows the notifications list. It is only\n * used on mobile devices where the notifications dropdown is within the drawer.\n */\nexport default class NotificationsPage extends Page {\n init() {\n super.init();\n\n app.history.push('notifications');\n\n app.notifications.load();\n\n this.bodyClass = 'App--notifications';\n }\n\n view() {\n return (\n <div className=\"NotificationsPage\">\n <NotificationList state={app.notifications}></NotificationList>\n </div>\n );\n }\n}\n","import IndexPage from './components/IndexPage';\nimport DiscussionPage from './components/DiscussionPage';\nimport PostsUserPage from './components/PostsUserPage';\nimport DiscussionsUserPage from './components/DiscussionsUserPage';\nimport SettingsPage from './components/SettingsPage';\nimport NotificationsPage from './components/NotificationsPage';\n\n/**\n * The `routes` initializer defines the forum app's routes.\n *\n * @param {App} app\n */\nexport default function (app) {\n app.routes = {\n index: { path: '/all', component: IndexPage.component() },\n 'index.filter': { path: '/:filter', component: IndexPage.component() },\n\n discussion: { path: '/d/:id', component: DiscussionPage.component() },\n 'discussion.near': { path: '/d/:id/:near', component: DiscussionPage.component() },\n\n user: { path: '/u/:username', component: PostsUserPage.component() },\n 'user.posts': { path: '/u/:username', component: PostsUserPage.component() },\n 'user.discussions': { path: '/u/:username/discussions', component: DiscussionsUserPage.component() },\n\n settings: { path: '/settings', component: SettingsPage.component() },\n notifications: { path: '/notifications', component: NotificationsPage.component() },\n };\n\n /**\n * Generate a URL to a discussion.\n *\n * @param {Discussion} discussion\n * @param {Integer} [near]\n * @return {String}\n */\n app.route.discussion = (discussion, near) => {\n const slug = discussion.slug();\n return app.route(near && near !== 1 ? 'discussion.near' : 'discussion', {\n id: discussion.id() + (slug.trim() ? '-' + slug : ''),\n near: near && near !== 1 ? near : undefined,\n });\n };\n\n /**\n * Generate a URL to a post.\n *\n * @param {Post} post\n * @return {String}\n */\n app.route.post = (post) => {\n return app.route.discussion(post.discussion(), post.number());\n };\n\n /**\n * Generate a URL to a user.\n *\n * @param {User} user\n * @return {String}\n */\n app.route.user = (user) => {\n return app.route('user', {\n username: user.username(),\n });\n };\n}\n","import Alert from '../../common/components/Alert';\nimport Button from '../../common/components/Button';\nimport icon from '../../common/helpers/icon';\n\n/**\n * Shows an alert if the user has not yet confirmed their email address.\n *\n * @param {ForumApp} app\n */\nexport default function alertEmailConfirmation(app) {\n const user = app.session.user;\n\n if (!user || user.isEmailConfirmed()) return;\n\n const resendButton = Button.component({\n className: 'Button Button--link',\n children: app.translator.trans('core.forum.user_email_confirmation.resend_button'),\n onclick: function () {\n resendButton.props.loading = true;\n m.redraw();\n\n app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/users/' + user.id() + '/send-confirmation',\n })\n .then(() => {\n resendButton.props.loading = false;\n resendButton.props.children = [icon('fas fa-check'), ' ', app.translator.trans('core.forum.user_email_confirmation.sent_message')];\n resendButton.props.disabled = true;\n m.redraw();\n })\n .catch(() => {\n resendButton.props.loading = false;\n m.redraw();\n });\n },\n });\n\n class ContainedAlert extends Alert {\n view() {\n const vdom = super.view();\n\n vdom.children = [<div className=\"container\">{vdom.children}</div>];\n\n return vdom;\n }\n }\n\n m.mount(\n $('<div/>').insertBefore('#content')[0],\n ContainedAlert.component({\n dismissible: false,\n children: app.translator.trans('core.forum.user_email_confirmation.alert_message', { email: <strong>{user.email()}</strong> }),\n controls: [resendButton],\n })\n );\n}\n","export default class NotificationListState {\n constructor(app) {\n this.app = app;\n\n this.notificationPages = [];\n\n this.loading = false;\n\n this.moreResults = false;\n }\n\n getNotificationPages() {\n return this.notificationPages;\n }\n\n isLoading() {\n return this.loading;\n }\n\n hasMoreResults() {\n return this.moreResults;\n }\n\n /**\n * Load notifications into the application's cache if they haven't already\n * been loaded.\n */\n load() {\n if (this.app.session.user.newNotificationCount()) {\n this.notificationPages = [];\n }\n\n if (this.notificationPages.length > 0) {\n return;\n }\n\n this.app.session.user.pushAttributes({ newNotificationCount: 0 });\n\n this.loadMore();\n }\n\n /**\n * Load the next page of notification results.\n *\n * @public\n */\n loadMore() {\n this.loading = true;\n m.redraw();\n\n const params = this.notificationPages.length > 0 ? { page: { offset: this.notificationPages.length * 10 } } : null;\n\n return this.app.store\n .find('notifications', params)\n .then(this.parseResults.bind(this))\n .catch(() => {})\n .then(() => {\n this.loading = false;\n m.redraw();\n });\n }\n\n /**\n * Parse results and append them to the notification list.\n *\n * @param {Notification[]} results\n * @return {Notification[]}\n */\n parseResults(results) {\n if (results.length) this.notificationPages.push(results);\n\n this.moreResults = !!results.payload.links.next;\n\n return results;\n }\n\n /**\n * Mark all of the notifications as read.\n */\n markAllAsRead() {\n if (this.notificationPages.length === 0) return;\n\n this.app.session.user.pushAttributes({ unreadNotificationCount: 0 });\n\n this.notificationPages.forEach((notifications) => {\n notifications.forEach((notification) => notification.pushAttributes({ isRead: true }));\n });\n\n this.app.request({\n url: this.app.forum.attribute('apiUrl') + '/notifications/read',\n method: 'POST',\n });\n }\n}\n","import SearchState from './SearchState';\n\nexport default class GlobalSearchState extends SearchState {\n constructor(cachedSearches = [], searchRoute = 'index') {\n super(cachedSearches);\n this.searchRoute = searchRoute;\n }\n\n getValue() {\n if (this.value === undefined) {\n this.value = this.getInitialSearch() || '';\n }\n\n return super.getValue();\n }\n\n /**\n * Clear the search input and the current controller's active search.\n */\n clear() {\n super.clear();\n\n if (this.getInitialSearch()) {\n this.clearInitialSearch();\n } else {\n m.redraw();\n }\n }\n\n /**\n * Get URL parameters that stick between filter changes.\n *\n * @return {Object}\n */\n stickyParams() {\n return {\n sort: m.route.param('sort'),\n q: m.route.param('q'),\n };\n }\n\n /**\n * Get parameters to pass to the DiscussionList component.\n *\n * @return {Object}\n */\n params() {\n const params = this.stickyParams();\n\n params.filter = m.route.param('filter');\n\n return params;\n }\n\n /**\n * Redirect to the index page using the given sort parameter.\n *\n * @param {String} sort\n */\n changeSort(sort) {\n const params = this.params();\n\n if (sort === Object.keys(app.discussions.sortMap())[0]) {\n delete params.sort;\n } else {\n params.sort = sort;\n }\n\n m.route(app.route(this.searchRoute, params));\n }\n\n /**\n * Return the current search query, if any. This is implemented to activate\n * the search box in the header.\n *\n * @see Search\n * @return {String}\n */\n getInitialSearch() {\n return app.current.type.providesInitialSearch && this.params().q;\n }\n\n /**\n * Redirect to the index page without a search filter. This is called when the\n * 'x' is clicked in the search box in the header.\n *\n * @see Search\n */\n clearInitialSearch() {\n const params = this.params();\n delete params.q;\n\n m.route(app.route(this.searchRoute, params));\n }\n}\n","export default class SearchState {\n constructor(cachedSearches = []) {\n this.cachedSearches = cachedSearches;\n }\n\n getValue() {\n return this.value;\n }\n\n setValue(value) {\n this.value = value;\n }\n\n /**\n * Clear the search value.\n */\n clear() {\n this.setValue('');\n }\n\n /**\n * Mark that we have already searched for this query so that we don't\n * have to ping the endpoint again.\n */\n cache(query) {\n this.cachedSearches.push(query);\n }\n\n /**\n * Check if this query has been searched before.\n */\n isCached(query) {\n return this.cachedSearches.indexOf(query) !== -1;\n }\n}\n","export default class DiscussionListState {\n constructor({ params = {}, forumApp = app } = {}) {\n this.params = params;\n\n this.app = forumApp;\n\n this.discussions = [];\n\n this.moreResults = false;\n\n this.loading = false;\n }\n\n /**\n * Get the parameters that should be passed in the API request to get\n * discussion results.\n *\n * @api\n */\n requestParams() {\n const params = { include: ['user', 'lastPostedUser'], filter: {} };\n\n params.sort = this.sortMap()[this.params.sort];\n\n if (this.params.q) {\n params.filter.q = this.params.q;\n\n params.include.push('mostRelevantPost', 'mostRelevantPost.user');\n }\n\n return params;\n }\n\n /**\n * Get a map of sort keys (which appear in the URL, and are used for\n * translation) to the API sort value that they represent.\n */\n sortMap() {\n const map = {};\n\n if (this.params.q) {\n map.relevance = '';\n }\n map.latest = '-lastPostedAt';\n map.top = '-commentCount';\n map.newest = '-createdAt';\n map.oldest = 'createdAt';\n\n return map;\n }\n\n /**\n * Get the search parameters.\n */\n getParams() {\n return this.params;\n }\n\n /**\n * Clear cached discussions.\n */\n clear() {\n this.discussions = [];\n m.redraw();\n }\n\n /**\n * If there are no cached discussions or the new params differ from the\n * old ones, update params and refresh the discussion list from the database.\n */\n refreshParams(newParams) {\n if (!this.hasDiscussions() || Object.keys(newParams).some((key) => this.getParams()[key] !== newParams[key])) {\n this.params = newParams;\n\n this.refresh();\n }\n }\n\n /**\n * Clear and reload the discussion list.\n */\n refresh({ clear = true } = {}) {\n this.loading = true;\n\n if (clear) {\n this.clear();\n }\n\n return this.loadResults().then(\n (results) => {\n this.parseResults(results);\n },\n () => {\n this.loading = false;\n m.redraw();\n }\n );\n }\n\n /**\n * Load a new page of discussion results.\n *\n * @param offset The index to start the page at.\n */\n loadResults(offset) {\n const preloadedDiscussions = this.app.preloadedApiDocument();\n\n if (preloadedDiscussions) {\n return Promise.resolve(preloadedDiscussions);\n }\n\n const params = this.requestParams();\n params.page = { offset };\n params.include = params.include.join(',');\n\n return this.app.store.find('discussions', params);\n }\n\n /**\n * Load the next page of discussion results.\n */\n loadMore() {\n this.loading = true;\n\n this.loadResults(this.discussions.length).then(this.parseResults.bind(this));\n }\n\n /**\n * Parse results and append them to the discussion list.\n */\n parseResults(results) {\n this.discussions.push(...results);\n\n this.loading = false;\n this.moreResults = !!results.payload.links && !!results.payload.links.next;\n\n m.redraw();\n\n return results;\n }\n\n /**\n * Remove a discussion from the list if it is present.\n */\n removeDiscussion(discussion) {\n const index = this.discussions.indexOf(discussion);\n\n if (index !== -1) {\n this.discussions.splice(index, 1);\n }\n\n m.redraw();\n }\n\n /**\n * Add a discussion to the top of the list.\n */\n addDiscussion(discussion) {\n this.discussions.unshift(discussion);\n m.redraw();\n }\n\n /**\n * Are there discussions stored in the discussion list state?\n */\n hasDiscussions() {\n return this.discussions.length > 0;\n }\n\n /**\n * Are discussions currently being loaded?\n */\n isLoading() {\n return this.loading;\n }\n\n /**\n * In the last request, has the user searched for a discussion?\n */\n isSearchResults() {\n return !!this.params.q;\n }\n\n /**\n * Have the search results come up empty?\n */\n empty() {\n return !this.hasDiscussions() && !this.isLoading();\n }\n}\n","import History from './utils/History';\nimport Pane from './utils/Pane';\nimport ReplyComposer from './components/ReplyComposer';\nimport DiscussionPage from './components/DiscussionPage';\nimport SignUpModal from './components/SignUpModal';\nimport HeaderPrimary from './components/HeaderPrimary';\nimport HeaderSecondary from './components/HeaderSecondary';\nimport Composer from './components/Composer';\nimport DiscussionRenamedNotification from './components/DiscussionRenamedNotification';\nimport CommentPost from './components/CommentPost';\nimport DiscussionRenamedPost from './components/DiscussionRenamedPost';\nimport routes from './routes';\nimport alertEmailConfirmation from './utils/alertEmailConfirmation';\nimport Application from '../common/Application';\nimport Navigation from '../common/components/Navigation';\nimport NotificationListState from './states/NotificationListState';\nimport GlobalSearchState from './states/GlobalSearchState';\nimport DiscussionListState from './state/DiscussionListState';\n\nexport default class ForumApplication extends Application {\n /**\n * A map of notification types to their components.\n *\n * @type {Object}\n */\n notificationComponents = {\n discussionRenamed: DiscussionRenamedNotification,\n };\n /**\n * A map of post types to their components.\n *\n * @type {Object}\n */\n postComponents = {\n comment: CommentPost,\n discussionRenamed: DiscussionRenamedPost,\n };\n\n /**\n * An object which controls the state of the page's side pane.\n *\n * @type {Pane}\n */\n pane = null;\n\n /**\n * An object which controls the state of the page's drawer.\n *\n * @type {Drawer}\n */\n drawer = null;\n\n /**\n * The app's history stack, which keeps track of which routes the user visits\n * so that they can easily navigate back to the previous route.\n *\n * @type {History}\n */\n history = new History();\n\n /**\n * An object which controls the state of the user's notifications.\n *\n * @type {NotificationListState}\n */\n notifications = new NotificationListState(this);\n\n /*\n * An object which stores previously searched queries and provides convenient\n * tools for retrieving and managing search values.\n *\n * @type {GlobalSearchState}\n */\n search = new GlobalSearchState();\n\n constructor() {\n super();\n\n routes(this);\n\n /**\n * An object which controls the state of the cached discussion list, which\n * is used in the index page and the slideout pane.\n *\n * @type {DiscussionListState}\n */\n this.discussions = new DiscussionListState({ forumApp: this });\n\n /**\n * @deprecated beta 14, remove in beta 15.\n */\n this.cache.discussionList = this.discussions;\n }\n\n /**\n * @inheritdoc\n */\n mount() {\n // Get the configured default route and update that route's path to be '/'.\n // Push the homepage as the first route, so that the user will always be\n // able to click on the 'back' button to go home, regardless of which page\n // they started on.\n const defaultRoute = this.forum.attribute('defaultRoute');\n let defaultAction = 'index';\n\n for (const i in this.routes) {\n if (this.routes[i].path === defaultRoute) defaultAction = i;\n }\n\n this.routes[defaultAction].path = '/';\n this.history.push(defaultAction, this.translator.trans('core.forum.header.back_to_index_tooltip'), '/');\n\n m.mount(document.getElementById('app-navigation'), Navigation.component({ className: 'App-backControl', drawer: true }));\n m.mount(document.getElementById('header-navigation'), Navigation.component());\n m.mount(document.getElementById('header-primary'), HeaderPrimary.component());\n m.mount(document.getElementById('header-secondary'), HeaderSecondary.component());\n\n this.pane = new Pane(document.getElementById('app'));\n this.composer = m.mount(document.getElementById('composer'), Composer.component());\n\n m.route.mode = 'pathname';\n super.mount(this.forum.attribute('basePath'));\n\n alertEmailConfirmation(this);\n\n // Route the home link back home when clicked. We do not want it to register\n // if the user is opening it in a new tab, however.\n $('#home-link').click((e) => {\n if (e.ctrlKey || e.metaKey || e.which === 2) return;\n e.preventDefault();\n app.history.home();\n\n // Reload the current user so that their unread notification count is refreshed.\n if (app.session.user) {\n app.store.find('users', app.session.user.id());\n m.redraw();\n }\n });\n }\n\n /**\n * Check whether or not the user is currently composing a reply to a\n * discussion.\n *\n * @param {Discussion} discussion\n * @return {Boolean}\n */\n composingReplyTo(discussion) {\n return (\n this.composer.component instanceof ReplyComposer &&\n this.composer.component.props.discussion === discussion &&\n this.composer.position !== Composer.PositionEnum.HIDDEN\n );\n }\n\n /**\n * Check whether or not the user is currently viewing a discussion.\n *\n * @param {Discussion} discussion\n * @return {Boolean}\n */\n viewingDiscussion(discussion) {\n return this.current.matches(DiscussionPage, { discussion });\n }\n\n /**\n * Callback for when an external authenticator (social login) action has\n * completed.\n *\n * If the payload indicates that the user has been logged in, then the page\n * will be reloaded. Otherwise, a SignUpModal will be opened, prefilled\n * with the provided details.\n *\n * @param {Object} payload A dictionary of props to pass into the sign up\n * modal. A truthy `loggedIn` prop indicates that the user has logged\n * in, and thus the page is reloaded.\n * @public\n */\n authenticationComplete(payload) {\n if (payload.loggedIn) {\n window.location.reload();\n } else {\n const modal = new SignUpModal(payload);\n this.modal.show(modal);\n }\n }\n}\n","import Button from '../../common/components/Button';\n\n/**\n * The `LogInButton` component displays a social login button which will open\n * a popup window containing the specified path.\n *\n * ### Props\n *\n * - `path`\n */\nexport default class LogInButton extends Button {\n static initProps(props) {\n props.className = (props.className || '') + ' LogInButton';\n\n props.onclick = function () {\n const width = 580;\n const height = 400;\n const $window = $(window);\n\n window.open(\n app.forum.attribute('baseUrl') + props.path,\n 'logInPopup',\n `width=${width},` +\n `height=${height},` +\n `top=${$window.height() / 2 - height / 2},` +\n `left=${$window.width() / 2 - width / 2},` +\n 'status=no,scrollbars=yes,resizable=no'\n );\n };\n\n super.initProps(props);\n }\n}\n","import Button from '../../common/components/Button';\n\n/**\n * The `TextEditorButton` component displays a button suitable for the text\n * editor toolbar.\n */\nexport default class TextEditorButton extends Button {\n static initProps(props) {\n super.initProps(props);\n\n props.className = props.className || 'Button Button--icon Button--link';\n }\n\n config(isInitialized, context) {\n super.config(isInitialized, context);\n\n if (isInitialized) return;\n\n this.$().tooltip();\n }\n}\n","/**\n * The `SearchSource` interface defines a section of search results in the\n * search dropdown.\n *\n * Search sources should be registered with the `Search` component class\n * by extending the `sourceItems` method. When the user types a\n * query, each search source will be prompted to load search results via the\n * `search` method. When the dropdown is redrawn, it will be constructed by\n * putting together the output from the `view` method of each source.\n *\n * @interface\n */\nexport default class SearchSource {\n /**\n * Make a request to get results for the given query.\n *\n * @param {String} query\n * @return {Promise}\n */\n search() {}\n\n /**\n * Get an array of virtual <li>s that list the search results for the given\n * query.\n *\n * @param {String} query\n * @return {Object}\n */\n view() {}\n}\n","import compat from '../common/compat';\n\nimport PostControls from './utils/PostControls';\nimport KeyboardNavigatable from './utils/KeyboardNavigatable';\nimport slidable from './utils/slidable';\nimport affixSidebar from './utils/affixSidebar';\nimport History from './utils/History';\nimport DiscussionControls from './utils/DiscussionControls';\nimport alertEmailConfirmation from './utils/alertEmailConfirmation';\nimport UserControls from './utils/UserControls';\nimport Pane from './utils/Pane';\nimport DiscussionPage from './components/DiscussionPage';\nimport LogInModal from './components/LogInModal';\nimport ComposerBody from './components/ComposerBody';\nimport ForgotPasswordModal from './components/ForgotPasswordModal';\nimport Notification from './components/Notification';\nimport LogInButton from './components/LogInButton';\nimport DiscussionsUserPage from './components/DiscussionsUserPage';\nimport Composer from './components/Composer';\nimport SessionDropdown from './components/SessionDropdown';\nimport HeaderPrimary from './components/HeaderPrimary';\nimport PostEdited from './components/PostEdited';\nimport PostStream from './components/PostStream';\nimport ChangePasswordModal from './components/ChangePasswordModal';\nimport IndexPage from './components/IndexPage';\nimport DiscussionRenamedNotification from './components/DiscussionRenamedNotification';\nimport DiscussionsSearchSource from './components/DiscussionsSearchSource';\nimport HeaderSecondary from './components/HeaderSecondary';\nimport ComposerButton from './components/ComposerButton';\nimport DiscussionList from './components/DiscussionList';\nimport ReplyPlaceholder from './components/ReplyPlaceholder';\nimport TextEditor from './components/TextEditor';\nimport TextEditorButton from './components/TextEditorButton';\nimport AvatarEditor from './components/AvatarEditor';\nimport Post from './components/Post';\nimport SettingsPage from './components/SettingsPage';\nimport TerminalPost from './components/TerminalPost';\nimport ChangeEmailModal from './components/ChangeEmailModal';\nimport NotificationsDropdown from './components/NotificationsDropdown';\nimport UserPage from './components/UserPage';\nimport PostUser from './components/PostUser';\nimport UserCard from './components/UserCard';\nimport UsersSearchSource from './components/UsersSearchSource';\nimport NotificationGrid from './components/NotificationGrid';\nimport PostPreview from './components/PostPreview';\nimport EventPost from './components/EventPost';\nimport DiscussionHero from './components/DiscussionHero';\nimport PostMeta from './components/PostMeta';\nimport EditUserModal from './components/EditUserModal';\nimport SearchSource from './components/SearchSource';\nimport DiscussionRenamedPost from './components/DiscussionRenamedPost';\nimport DiscussionComposer from './components/DiscussionComposer';\nimport LogInButtons from './components/LogInButtons';\nimport NotificationList from './components/NotificationList';\nimport WelcomeHero from './components/WelcomeHero';\nimport SignUpModal from './components/SignUpModal';\nimport CommentPost from './components/CommentPost';\nimport ReplyComposer from './components/ReplyComposer';\nimport NotificationsPage from './components/NotificationsPage';\nimport PostStreamScrubber from './components/PostStreamScrubber';\nimport EditPostComposer from './components/EditPostComposer';\nimport RenameDiscussionModal from './components/RenameDiscussionModal';\nimport Search from './components/Search';\nimport DiscussionListItem from './components/DiscussionListItem';\nimport LoadingPost from './components/LoadingPost';\nimport PostsUserPage from './components/PostsUserPage';\nimport routes from './routes';\nimport ForumApplication from './ForumApplication';\n\nexport default Object.assign(compat, {\n 'utils/PostControls': PostControls,\n 'utils/KeyboardNavigatable': KeyboardNavigatable,\n 'utils/slidable': slidable,\n 'utils/affixSidebar': affixSidebar,\n 'utils/History': History,\n 'utils/DiscussionControls': DiscussionControls,\n 'utils/alertEmailConfirmation': alertEmailConfirmation,\n 'utils/UserControls': UserControls,\n 'utils/Pane': Pane,\n 'components/DiscussionPage': DiscussionPage,\n 'components/LogInModal': LogInModal,\n 'components/ComposerBody': ComposerBody,\n 'components/ForgotPasswordModal': ForgotPasswordModal,\n 'components/Notification': Notification,\n 'components/LogInButton': LogInButton,\n 'components/DiscussionsUserPage': DiscussionsUserPage,\n 'components/Composer': Composer,\n 'components/SessionDropdown': SessionDropdown,\n 'components/HeaderPrimary': HeaderPrimary,\n 'components/PostEdited': PostEdited,\n 'components/PostStream': PostStream,\n 'components/ChangePasswordModal': ChangePasswordModal,\n 'components/IndexPage': IndexPage,\n 'components/DiscussionRenamedNotification': DiscussionRenamedNotification,\n 'components/DiscussionsSearchSource': DiscussionsSearchSource,\n 'components/HeaderSecondary': HeaderSecondary,\n 'components/ComposerButton': ComposerButton,\n 'components/DiscussionList': DiscussionList,\n 'components/ReplyPlaceholder': ReplyPlaceholder,\n 'components/TextEditor': TextEditor,\n 'components/TextEditorButton': TextEditorButton,\n 'components/AvatarEditor': AvatarEditor,\n 'components/Post': Post,\n 'components/SettingsPage': SettingsPage,\n 'components/TerminalPost': TerminalPost,\n 'components/ChangeEmailModal': ChangeEmailModal,\n 'components/NotificationsDropdown': NotificationsDropdown,\n 'components/UserPage': UserPage,\n 'components/PostUser': PostUser,\n 'components/UserCard': UserCard,\n 'components/UsersSearchSource': UsersSearchSource,\n 'components/NotificationGrid': NotificationGrid,\n 'components/PostPreview': PostPreview,\n 'components/EventPost': EventPost,\n 'components/DiscussionHero': DiscussionHero,\n 'components/PostMeta': PostMeta,\n 'components/EditUserModal': EditUserModal,\n 'components/SearchSource': SearchSource,\n 'components/DiscussionRenamedPost': DiscussionRenamedPost,\n 'components/DiscussionComposer': DiscussionComposer,\n 'components/LogInButtons': LogInButtons,\n 'components/NotificationList': NotificationList,\n 'components/WelcomeHero': WelcomeHero,\n 'components/SignUpModal': SignUpModal,\n 'components/CommentPost': CommentPost,\n 'components/ReplyComposer': ReplyComposer,\n 'components/NotificationsPage': NotificationsPage,\n 'components/PostStreamScrubber': PostStreamScrubber,\n 'components/EditPostComposer': EditPostComposer,\n 'components/RenameDiscussionModal': RenameDiscussionModal,\n 'components/Search': Search,\n 'components/DiscussionListItem': DiscussionListItem,\n 'components/LoadingPost': LoadingPost,\n 'components/PostsUserPage': PostsUserPage,\n routes: routes,\n ForumApplication: ForumApplication,\n});\n","import 'expose-loader?punycode!punycode';\nimport 'expose-loader?ColorThief!color-thief-browser';\n\nimport ForumApplication from './ForumApplication';\n\nconst app = new ForumApplication();\n\n// Backwards compatibility\nwindow.app = app;\n\nexport { app };\n\n// Export public API\n// export { default as Extend } from './Extend';\n// export { IndexPage, DicsussionList } from './components';\n\n// Export compat API\nimport compat from './compat';\n\ncompat.app = app;\n\nexport { compat };\n"],"sourceRoot":""} |